forked from I2P_Developers/i2p.i2p
Skip key cert LS verifies for floodfills that don't support them
Fix continuation after skipping key cert LS stores for floodfills that don't support them; ditto big leasesets
This commit is contained in:
@@ -1,7 +1,9 @@
|
|||||||
|
|
||||||
2014-04-05 zzz
|
2014-04-05 zzz
|
||||||
* I2PTunnel:
|
* I2PTunnel:
|
||||||
- Add server option for unique local address per-client
|
- Add server option for unique local address per-client
|
||||||
- Fix changing outproxy without stopping tunnel (ticket #1164)
|
- Fix changing outproxy without stopping tunnel (ticket #1164)
|
||||||
|
* NetDB: Skip key cert LS stores and verifies for floodfills that don't support them
|
||||||
|
|
||||||
2014-04-01 zzz
|
2014-04-01 zzz
|
||||||
* Console: Fix summary bar html when displaying an update constraint
|
* Console: Fix summary bar html when displaying an update constraint
|
||||||
|
@@ -18,7 +18,7 @@ public class RouterVersion {
|
|||||||
/** deprecated */
|
/** deprecated */
|
||||||
public final static String ID = "Monotone";
|
public final static String ID = "Monotone";
|
||||||
public final static String VERSION = CoreVersion.VERSION;
|
public final static String VERSION = CoreVersion.VERSION;
|
||||||
public final static long BUILD = 2;
|
public final static long BUILD = 3;
|
||||||
|
|
||||||
/** for example "-test" */
|
/** for example "-test" */
|
||||||
public final static String EXTRA = "";
|
public final static String EXTRA = "";
|
||||||
|
@@ -200,6 +200,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
|
|||||||
Hash rkey = _context.routingKeyGenerator().getRoutingKey(key);
|
Hash rkey = _context.routingKeyGenerator().getRoutingKey(key);
|
||||||
FloodfillPeerSelector sel = (FloodfillPeerSelector)getPeerSelector();
|
FloodfillPeerSelector sel = (FloodfillPeerSelector)getPeerSelector();
|
||||||
List<Hash> peers = sel.selectFloodfillParticipants(rkey, MAX_TO_FLOOD, getKBuckets());
|
List<Hash> peers = sel.selectFloodfillParticipants(rkey, MAX_TO_FLOOD, getKBuckets());
|
||||||
|
// todo key cert skip?
|
||||||
long until = _context.routingKeyGenerator().getTimeTillMidnight();
|
long until = _context.routingKeyGenerator().getTimeTillMidnight();
|
||||||
if (until < NEXT_RKEY_LS_ADVANCE_TIME ||
|
if (until < NEXT_RKEY_LS_ADVANCE_TIME ||
|
||||||
(ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO && until < NEXT_RKEY_RI_ADVANCE_TIME)) {
|
(ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO && until < NEXT_RKEY_RI_ADVANCE_TIME)) {
|
||||||
@@ -209,6 +210,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
|
|||||||
List<Hash> nextPeers = sel.selectFloodfillParticipants(nkey, NEXT_FLOOD_QTY, getKBuckets());
|
List<Hash> nextPeers = sel.selectFloodfillParticipants(nkey, NEXT_FLOOD_QTY, getKBuckets());
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (Hash h : nextPeers) {
|
for (Hash h : nextPeers) {
|
||||||
|
// todo key cert skip?
|
||||||
if (!peers.contains(h)) {
|
if (!peers.contains(h)) {
|
||||||
peers.add(h);
|
peers.add(h);
|
||||||
i++;
|
i++;
|
||||||
|
@@ -4,8 +4,10 @@ import java.util.HashSet;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import net.i2p.data.Certificate;
|
||||||
import net.i2p.data.DatabaseEntry;
|
import net.i2p.data.DatabaseEntry;
|
||||||
import net.i2p.data.Hash;
|
import net.i2p.data.Hash;
|
||||||
|
import net.i2p.data.LeaseSet;
|
||||||
import net.i2p.data.RouterInfo;
|
import net.i2p.data.RouterInfo;
|
||||||
import net.i2p.data.i2np.DatabaseLookupMessage;
|
import net.i2p.data.i2np.DatabaseLookupMessage;
|
||||||
import net.i2p.data.i2np.DatabaseSearchReplyMessage;
|
import net.i2p.data.i2np.DatabaseSearchReplyMessage;
|
||||||
@@ -169,9 +171,31 @@ class FloodfillVerifyStoreJob extends JobImpl {
|
|||||||
private Hash pickTarget() {
|
private Hash pickTarget() {
|
||||||
Hash rkey = getContext().routingKeyGenerator().getRoutingKey(_key);
|
Hash rkey = getContext().routingKeyGenerator().getRoutingKey(_key);
|
||||||
FloodfillPeerSelector sel = (FloodfillPeerSelector)_facade.getPeerSelector();
|
FloodfillPeerSelector sel = (FloodfillPeerSelector)_facade.getPeerSelector();
|
||||||
List<Hash> peers = sel.selectFloodfillParticipants(rkey, 1, _ignore, _facade.getKBuckets());
|
boolean isKeyCert = false;
|
||||||
if (!peers.isEmpty())
|
if (!_isRouterInfo) {
|
||||||
return peers.get(0);
|
LeaseSet ls = _facade.lookupLeaseSetLocally(_key);
|
||||||
|
if (ls != null &&
|
||||||
|
ls.getDestination().getCertificate().getCertificateType() == Certificate.CERTIFICATE_TYPE_KEY)
|
||||||
|
isKeyCert = true;
|
||||||
|
}
|
||||||
|
if (isKeyCert) {
|
||||||
|
while (true) {
|
||||||
|
List<Hash> peers = sel.selectFloodfillParticipants(rkey, 1, _ignore, _facade.getKBuckets());
|
||||||
|
if (peers.isEmpty())
|
||||||
|
break;
|
||||||
|
Hash peer = peers.get(0);
|
||||||
|
RouterInfo ri = _facade.lookupRouterInfoLocally(peer);
|
||||||
|
if (ri != null && StoreJob.supportsKeyCerts(ri))
|
||||||
|
return peer;
|
||||||
|
if (_log.shouldLog(Log.INFO))
|
||||||
|
_log.info(getJobId() + ": Skipping verify w/ router that doesn't support key certs " + peer);
|
||||||
|
_ignore.add(peer);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
List<Hash> peers = sel.selectFloodfillParticipants(rkey, 1, _ignore, _facade.getKBuckets());
|
||||||
|
if (!peers.isEmpty())
|
||||||
|
return peers.get(0);
|
||||||
|
}
|
||||||
|
|
||||||
if (_log.shouldLog(Log.WARN))
|
if (_log.shouldLog(Log.WARN))
|
||||||
_log.warn("No other peers to verify floodfill with, using the one we sent to");
|
_log.warn("No other peers to verify floodfill with, using the one we sent to");
|
||||||
|
@@ -112,7 +112,10 @@ class StoreJob extends JobImpl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** overridden in FSJ */
|
||||||
protected int getParallelization() { return PARALLELIZATION; }
|
protected int getParallelization() { return PARALLELIZATION; }
|
||||||
|
|
||||||
|
/** overridden in FSJ */
|
||||||
protected int getRedundancy() { return REDUNDANCY; }
|
protected int getRedundancy() { return REDUNDANCY; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -157,26 +160,29 @@ class StoreJob extends JobImpl {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//_state.addPending(closestHashes);
|
//_state.addPending(closestHashes);
|
||||||
if (_log.shouldLog(Log.INFO))
|
int queued = 0;
|
||||||
_log.info(getJobId() + ": Continue sending key " + _state.getTarget() + " after " + _state.getAttempted().size() + " tries to " + closestHashes);
|
int skipped = 0;
|
||||||
for (Hash peer : closestHashes) {
|
for (Hash peer : closestHashes) {
|
||||||
DatabaseEntry ds = _facade.getDataStore().get(peer);
|
DatabaseEntry ds = _facade.getDataStore().get(peer);
|
||||||
if ( (ds == null) || !(ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) ) {
|
if ( (ds == null) || !(ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) ) {
|
||||||
if (_log.shouldLog(Log.INFO))
|
if (_log.shouldLog(Log.INFO))
|
||||||
_log.info(getJobId() + ": Error selecting closest hash that wasnt a router! " + peer + " : " + ds);
|
_log.info(getJobId() + ": Error selecting closest hash that wasnt a router! " + peer + " : " + ds);
|
||||||
_state.addSkipped(peer);
|
_state.addSkipped(peer);
|
||||||
|
skipped++;
|
||||||
} else if (_state.getData().getType() == DatabaseEntry.KEY_TYPE_LEASESET &&
|
} else if (_state.getData().getType() == DatabaseEntry.KEY_TYPE_LEASESET &&
|
||||||
((LeaseSet)_state.getData()).getDestination().getCertificate().getCertificateType() == Certificate.CERTIFICATE_TYPE_KEY &&
|
((LeaseSet)_state.getData()).getDestination().getCertificate().getCertificateType() == Certificate.CERTIFICATE_TYPE_KEY &&
|
||||||
!supportsKeyCerts((RouterInfo)ds)) {
|
!supportsKeyCerts((RouterInfo)ds)) {
|
||||||
if (_log.shouldLog(Log.INFO))
|
if (_log.shouldLog(Log.INFO))
|
||||||
_log.info(getJobId() + ": Skipping router that doesn't support key certs " + peer + " : " + ds);
|
_log.info(getJobId() + ": Skipping router that doesn't support key certs " + peer);
|
||||||
_state.addSkipped(peer);
|
_state.addSkipped(peer);
|
||||||
|
skipped++;
|
||||||
} else if (_state.getData().getType() == DatabaseEntry.KEY_TYPE_LEASESET &&
|
} else if (_state.getData().getType() == DatabaseEntry.KEY_TYPE_LEASESET &&
|
||||||
((LeaseSet)_state.getData()).getLeaseCount() > 6 &&
|
((LeaseSet)_state.getData()).getLeaseCount() > 6 &&
|
||||||
!supportsBigLeaseSets((RouterInfo)ds)) {
|
!supportsBigLeaseSets((RouterInfo)ds)) {
|
||||||
if (_log.shouldLog(Log.INFO))
|
if (_log.shouldLog(Log.INFO))
|
||||||
_log.info(getJobId() + ": Skipping router that doesn't support big leasesets " + peer + " : " + ds);
|
_log.info(getJobId() + ": Skipping router that doesn't support big leasesets " + peer);
|
||||||
_state.addSkipped(peer);
|
_state.addSkipped(peer);
|
||||||
|
skipped++;
|
||||||
} else {
|
} else {
|
||||||
int peerTimeout = _facade.getPeerTimeout(peer);
|
int peerTimeout = _facade.getPeerTimeout(peer);
|
||||||
|
|
||||||
@@ -206,11 +212,21 @@ class StoreJob extends JobImpl {
|
|||||||
// ERR: see hidden mode comments in HandleDatabaseLookupMessageJob
|
// ERR: see hidden mode comments in HandleDatabaseLookupMessageJob
|
||||||
// // Do not store to hidden nodes
|
// // Do not store to hidden nodes
|
||||||
// if (!((RouterInfo)ds).isHidden()) {
|
// if (!((RouterInfo)ds).isHidden()) {
|
||||||
|
if (_log.shouldLog(Log.INFO))
|
||||||
|
_log.info(getJobId() + ": Continue sending key " + _state.getTarget() +
|
||||||
|
" after " + _state.getAttempted().size() + " tries to " + closestHashes);
|
||||||
_state.addPending(peer);
|
_state.addPending(peer);
|
||||||
sendStore((RouterInfo)ds, peerTimeout);
|
sendStore((RouterInfo)ds, peerTimeout);
|
||||||
|
queued++;
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (queued == 0 && _state.getPending().isEmpty()) {
|
||||||
|
if (_log.shouldLog(Log.INFO))
|
||||||
|
_log.info(getJobId() + ": No more peers left after skipping " + skipped + " and none pending");
|
||||||
|
// queue a job to go around again rather than recursing
|
||||||
|
getContext().jobQueue().addJob(new WaitJob(getContext()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -507,7 +523,7 @@ class StoreJob extends JobImpl {
|
|||||||
* Does he support key certs (assumed with a non-DSA key)?
|
* Does he support key certs (assumed with a non-DSA key)?
|
||||||
* @since 0.9.12
|
* @since 0.9.12
|
||||||
*/
|
*/
|
||||||
private static boolean supportsKeyCerts(RouterInfo ri) {
|
public static boolean supportsKeyCerts(RouterInfo ri) {
|
||||||
String v = ri.getOption("router.version");
|
String v = ri.getOption("router.version");
|
||||||
if (v == null)
|
if (v == null)
|
||||||
return false;
|
return false;
|
||||||
@@ -520,7 +536,7 @@ class StoreJob extends JobImpl {
|
|||||||
* Does he support more than 6 leasesets?
|
* Does he support more than 6 leasesets?
|
||||||
* @since 0.9.12
|
* @since 0.9.12
|
||||||
*/
|
*/
|
||||||
private static boolean supportsBigLeaseSets(RouterInfo ri) {
|
public static boolean supportsBigLeaseSets(RouterInfo ri) {
|
||||||
String v = ri.getOption("router.version");
|
String v = ri.getOption("router.version");
|
||||||
if (v == null)
|
if (v == null)
|
||||||
return false;
|
return false;
|
||||||
|
Reference in New Issue
Block a user