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:
zzz
2014-04-05 14:05:40 +00:00
parent fdf6f5d51f
commit 24e807b238
5 changed files with 54 additions and 10 deletions

View File

@@ -1,7 +1,9 @@
2014-04-05 zzz
* I2PTunnel:
- Add server option for unique local address per-client
- 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
* Console: Fix summary bar html when displaying an update constraint

View File

@@ -18,7 +18,7 @@ public class RouterVersion {
/** deprecated */
public final static String ID = "Monotone";
public final static String VERSION = CoreVersion.VERSION;
public final static long BUILD = 2;
public final static long BUILD = 3;
/** for example "-test" */
public final static String EXTRA = "";

View File

@@ -200,6 +200,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
Hash rkey = _context.routingKeyGenerator().getRoutingKey(key);
FloodfillPeerSelector sel = (FloodfillPeerSelector)getPeerSelector();
List<Hash> peers = sel.selectFloodfillParticipants(rkey, MAX_TO_FLOOD, getKBuckets());
// todo key cert skip?
long until = _context.routingKeyGenerator().getTimeTillMidnight();
if (until < NEXT_RKEY_LS_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());
int i = 0;
for (Hash h : nextPeers) {
// todo key cert skip?
if (!peers.contains(h)) {
peers.add(h);
i++;

View File

@@ -4,8 +4,10 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import net.i2p.data.Certificate;
import net.i2p.data.DatabaseEntry;
import net.i2p.data.Hash;
import net.i2p.data.LeaseSet;
import net.i2p.data.RouterInfo;
import net.i2p.data.i2np.DatabaseLookupMessage;
import net.i2p.data.i2np.DatabaseSearchReplyMessage;
@@ -169,9 +171,31 @@ class FloodfillVerifyStoreJob extends JobImpl {
private Hash pickTarget() {
Hash rkey = getContext().routingKeyGenerator().getRoutingKey(_key);
FloodfillPeerSelector sel = (FloodfillPeerSelector)_facade.getPeerSelector();
List<Hash> peers = sel.selectFloodfillParticipants(rkey, 1, _ignore, _facade.getKBuckets());
if (!peers.isEmpty())
return peers.get(0);
boolean isKeyCert = false;
if (!_isRouterInfo) {
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))
_log.warn("No other peers to verify floodfill with, using the one we sent to");

View File

@@ -112,7 +112,10 @@ class StoreJob extends JobImpl {
}
}
/** overridden in FSJ */
protected int getParallelization() { return PARALLELIZATION; }
/** overridden in FSJ */
protected int getRedundancy() { return REDUNDANCY; }
/**
@@ -157,26 +160,29 @@ class StoreJob extends JobImpl {
}
} else {
//_state.addPending(closestHashes);
if (_log.shouldLog(Log.INFO))
_log.info(getJobId() + ": Continue sending key " + _state.getTarget() + " after " + _state.getAttempted().size() + " tries to " + closestHashes);
int queued = 0;
int skipped = 0;
for (Hash peer : closestHashes) {
DatabaseEntry ds = _facade.getDataStore().get(peer);
if ( (ds == null) || !(ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) ) {
if (_log.shouldLog(Log.INFO))
_log.info(getJobId() + ": Error selecting closest hash that wasnt a router! " + peer + " : " + ds);
_state.addSkipped(peer);
skipped++;
} else if (_state.getData().getType() == DatabaseEntry.KEY_TYPE_LEASESET &&
((LeaseSet)_state.getData()).getDestination().getCertificate().getCertificateType() == Certificate.CERTIFICATE_TYPE_KEY &&
!supportsKeyCerts((RouterInfo)ds)) {
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);
skipped++;
} else if (_state.getData().getType() == DatabaseEntry.KEY_TYPE_LEASESET &&
((LeaseSet)_state.getData()).getLeaseCount() > 6 &&
!supportsBigLeaseSets((RouterInfo)ds)) {
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);
skipped++;
} else {
int peerTimeout = _facade.getPeerTimeout(peer);
@@ -206,11 +212,21 @@ class StoreJob extends JobImpl {
// ERR: see hidden mode comments in HandleDatabaseLookupMessageJob
// // Do not store to hidden nodes
// 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);
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)?
* @since 0.9.12
*/
private static boolean supportsKeyCerts(RouterInfo ri) {
public static boolean supportsKeyCerts(RouterInfo ri) {
String v = ri.getOption("router.version");
if (v == null)
return false;
@@ -520,7 +536,7 @@ class StoreJob extends JobImpl {
* Does he support more than 6 leasesets?
* @since 0.9.12
*/
private static boolean supportsBigLeaseSets(RouterInfo ri) {
public static boolean supportsBigLeaseSets(RouterInfo ri) {
String v = ri.getOption("router.version");
if (v == null)
return false;