diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigAdvancedHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigAdvancedHandler.java index c510e19e2d1600d305321944872d6845ae84f044..6fa1ce9ce22203679b8f8e6e72e8d660f4a67350 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigAdvancedHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigAdvancedHandler.java @@ -106,7 +106,7 @@ public class ConfigAdvancedHandler extends FormHandler { private void saveFF() { boolean saved = _context.router().saveConfig(ConfigAdvancedHelper.PROP_FLOODFILL_PARTICIPANT, _ff); if (_ff.equals("false") || _ff.equals("true")) { - FloodfillNetworkDatabaseFacade fndf = _context.netDb(); + FloodfillNetworkDatabaseFacade fndf = (FloodfillNetworkDatabaseFacade) _context.netDb(); boolean isFF = _ff.equals("true"); // this will rebuild the RI, log in the event log, etc. fndf.setFloodfillEnabled(isFF); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/SummaryHelper.java index bb6144ab56186bacd866d503ce555bf6198d2ff1..bea9800c58a2a46f6e530b91d3fe26a4e651e7b3 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/SummaryHelper.java @@ -985,13 +985,14 @@ public class SummaryHelper extends HelperBase { .append("</b></div>"); } + // checker will be null for DummyNetworkDatabaseFacade ReseedChecker checker = _context.netDb().reseedChecker(); - String status = checker.getStatus(); + String status = checker != null ? checker.getStatus() : ""; if (status.length() > 0) { // Show status message even if not running, timer in ReseedChecker should remove after 20 minutes buf.append("<div class=\"sb_notice\"><i>").append(status).append("</i></div>"); } - if (!checker.inProgress()) { + if (checker != null && !checker.inProgress()) { // If a new reseed isn't running, and the last reseed had errors, show error message String reseedErrorMessage = checker.getError(); if (reseedErrorMessage.length() > 0) { diff --git a/router/java/src/net/i2p/router/RouterContext.java b/router/java/src/net/i2p/router/RouterContext.java index 2fb44cb247e76658c60d49769b7e6c2a16beebae..972862a3cc20143e4691172f011699e2823cdde5 100644 --- a/router/java/src/net/i2p/router/RouterContext.java +++ b/router/java/src/net/i2p/router/RouterContext.java @@ -244,10 +244,9 @@ public class RouterContext extends I2PAppContext { //_messageStateMonitor = new MessageStateMonitor(this); _routingKeyGenerator = new RouterKeyGenerator(this); if (!getBooleanProperty("i2p.dummyNetDb")) - //_netDb = new FloodfillNetworkDatabaseFacade(this); // new KademliaNetworkDatabaseFacade(this); - _netDb = new FloodfillNetworkDatabaseSegmentor(this); // new KademliaNetworkDatabaseFacade(this); + _netDb = new FloodfillNetworkDatabaseSegmentor(this); else - _netDb = new DummyNetworkDatabaseFacade(this); + _netDb = new DummyNetworkDatabaseSegmentor(this); _keyManager = new KeyManager(this); if (!getBooleanProperty("i2p.vmCommSystem")) _commSystem = new CommSystemFacadeImpl(this); @@ -371,10 +370,23 @@ public class RouterContext extends I2PAppContext { /** * Our db cache + * @since 0.9.60 */ public SegmentedNetworkDatabaseFacade netDbSegmentor() { return _netDb; } - public FloodfillNetworkDatabaseFacade netDb() { return _netDb.mainNetDB(); } - public FloodfillNetworkDatabaseFacade clientNetDb(Hash id) { return _netDb.clientNetDB(id); } + + public NetworkDatabaseFacade netDb() { return _netDb.mainNetDB(); } + + /** + * Get the client netDb for the given id. + * Will return the main netDb if + * the dbid is null or the client db is not found. + * + * @since 0.9.60 + * @param id may be null + * @return non-null + */ + public NetworkDatabaseFacade clientNetDb(Hash id) { return _netDb.clientNetDB(id); } + /** * The actual driver of the router, where all jobs are enqueued and processed. */ diff --git a/router/java/src/net/i2p/router/dummy/DummyNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/dummy/DummyNetworkDatabaseFacade.java index 3eced438f969482d829cae5e2dcaa6b09d31b8e5..9fbea9b812228af4b0b725bf1459005b54d44bd7 100644 --- a/router/java/src/net/i2p/router/dummy/DummyNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/dummy/DummyNetworkDatabaseFacade.java @@ -11,7 +11,6 @@ package net.i2p.router.dummy; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; @@ -21,29 +20,18 @@ import net.i2p.data.Hash; import net.i2p.data.LeaseSet; import net.i2p.data.router.RouterInfo; import net.i2p.router.Job; +import net.i2p.router.NetworkDatabaseFacade; import net.i2p.router.RouterContext; -import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; -import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseSegmentor; -import net.i2p.router.networkdb.kademlia.KademliaNetworkDatabaseFacade; -import net.i2p.router.networkdb.kademlia.SegmentedNetworkDatabaseFacade; -public class DummyNetworkDatabaseFacade extends SegmentedNetworkDatabaseFacade { +public class DummyNetworkDatabaseFacade extends NetworkDatabaseFacade { private final Map<Hash, RouterInfo> _routers; private final RouterContext _context; - private final FloodfillNetworkDatabaseFacade _fndb; public DummyNetworkDatabaseFacade(RouterContext ctx) { - super(ctx); - _fndb = new FloodfillNetworkDatabaseFacade(ctx, FloodfillNetworkDatabaseSegmentor.MAIN_DBID); - _fndb.startup(); _routers = Collections.synchronizedMap(new HashMap<Hash, RouterInfo>()); _context = ctx; } - public FloodfillNetworkDatabaseFacade getSubNetDB(Hash dbid){ - return null; - } - public void restart() {} public void shutdown() {} public void startup() { @@ -89,14 +77,4 @@ public class DummyNetworkDatabaseFacade extends SegmentedNetworkDatabaseFacade { public Set<Hash> getAllRouters() { return new HashSet<Hash>(_routers.keySet()); } public Set<Hash> findNearestRouters(Hash key, int maxNumRouters, Set<Hash> peersToIgnore) { return getAllRouters(); } - - @Override - public FloodfillNetworkDatabaseFacade mainNetDB() { - return _fndb; - } - - @Override - public FloodfillNetworkDatabaseFacade clientNetDB(Hash id) { - return _fndb; - } } diff --git a/router/java/src/net/i2p/router/dummy/DummyNetworkDatabaseSegmentor.java b/router/java/src/net/i2p/router/dummy/DummyNetworkDatabaseSegmentor.java new file mode 100644 index 0000000000000000000000000000000000000000..6d00af605915fbafeccb76ef5f77afc67d4832ce --- /dev/null +++ b/router/java/src/net/i2p/router/dummy/DummyNetworkDatabaseSegmentor.java @@ -0,0 +1,33 @@ +package net.i2p.router.dummy; + +import net.i2p.data.Hash; +import net.i2p.router.RouterContext; +import net.i2p.router.NetworkDatabaseFacade; +import net.i2p.router.networkdb.kademlia.SegmentedNetworkDatabaseFacade; + +/** + * @since 0.9.60 + */ +public class DummyNetworkDatabaseSegmentor extends SegmentedNetworkDatabaseFacade { + private final NetworkDatabaseFacade _fndb; + + public DummyNetworkDatabaseSegmentor(RouterContext ctx) { + _fndb = new DummyNetworkDatabaseFacade(ctx); + } + + public void shutdown() { + _fndb.shutdown(); + } + + public void startup() { + _fndb.startup(); + } + + public NetworkDatabaseFacade mainNetDB() { + return _fndb; + } + + public NetworkDatabaseFacade clientNetDB(Hash id) { + return _fndb; + } +} diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseSegmentor.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseSegmentor.java index c47043910e56604534a90df77f4aa8e69eb23917..611c38abc0f1fc42ddbc28ce83a78be502d0585b 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseSegmentor.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseSegmentor.java @@ -1,15 +1,7 @@ package net.i2p.router.networkdb.kademlia; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import net.i2p.data.BlindData; import net.i2p.data.Hash; -import net.i2p.data.LeaseSet; -import net.i2p.data.SigningPublicKey; -import net.i2p.data.router.RouterInfo; +import net.i2p.router.NetworkDatabaseFacade; import net.i2p.router.RouterContext; import net.i2p.util.Log; @@ -48,8 +40,8 @@ import net.i2p.util.Log; * @since 0.9.60 */ public class FloodfillNetworkDatabaseSegmentor extends SegmentedNetworkDatabaseFacade { - protected final Log _log; - private RouterContext _context; + private final Log _log; + private final RouterContext _context; //private static final String PROP_NETDB_ISOLATION = "router.netdb.isolation"; public static final Hash MAIN_DBID = null; private final FloodfillNetworkDatabaseFacade _mainDbid; @@ -62,10 +54,8 @@ public class FloodfillNetworkDatabaseSegmentor extends SegmentedNetworkDatabaseF * @since 0.9.60 */ public FloodfillNetworkDatabaseSegmentor(RouterContext context) { - super(context); _log = context.logManager().getLog(getClass()); - if (_context == null) - _context = context; + _context = context; _mainDbid = new FloodfillNetworkDatabaseFacade(_context, MAIN_DBID); } @@ -81,11 +71,11 @@ public class FloodfillNetworkDatabaseSegmentor extends SegmentedNetworkDatabaseF * @param id the ID of the FloodfillNetworkDatabaseFacade object to retrieve * @return the FloodfillNetworkDatabaseFacade object corresponding to the ID or null if it does not exist. */ - @Override - protected FloodfillNetworkDatabaseFacade getSubNetDB(Hash id) { + private NetworkDatabaseFacade getSubNetDB(Hash id) { return _context.clientManager().getClientFloodfillNetworkDatabaseFacade(id); } + /** * If we are floodfill, turn it off and tell everybody for the _mainDbid * @@ -117,7 +107,7 @@ public class FloodfillNetworkDatabaseSegmentor extends SegmentedNetworkDatabaseF * @return may be null */ @Override - public FloodfillNetworkDatabaseFacade mainNetDB() { + public NetworkDatabaseFacade mainNetDB() { return _mainDbid; } @@ -130,11 +120,11 @@ public class FloodfillNetworkDatabaseSegmentor extends SegmentedNetworkDatabaseF * @return may be null if the client netDb does not exist */ @Override - public FloodfillNetworkDatabaseFacade clientNetDB(Hash id) { + public NetworkDatabaseFacade clientNetDB(Hash id) { if (_log.shouldDebug()) _log.debug("looked up clientNetDB: " + id); if (id != null){ - FloodfillNetworkDatabaseFacade fndf = getSubNetDB(id); + NetworkDatabaseFacade fndf = getSubNetDB(id); if (fndf != null) return fndf; } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java index ae9cd1a4c823a9e1776786f4dc2578fa57c20556..df5d1e02273a32f278b43319ec0de576782fa6bc 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java @@ -248,12 +248,13 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad * This checks if we're the main DB already and returns our blind * cache if we are. If not, it looks up the main Db and gets it. * - * @return + * @return non-null + * @since 0.9.60 */ protected BlindCache blindCache() { if (!isClientDb()) return _blindCache; - return _context.netDb().blindCache(); + return ((FloodfillNetworkDatabaseFacade) _context.netDb()).blindCache(); } /** @@ -365,7 +366,7 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad RouterInfo ri = _context.router().getRouterInfo(); String dbDir = _context.getProperty(PROP_DB_DIR, DEFAULT_DB_DIR); if (isClientDb()) - _kb = _context.netDb().getKBuckets(); + _kb = ((FloodfillNetworkDatabaseFacade) _context.netDb()).getKBuckets(); else _kb = new KBucketSet<Hash>(_context, ri.getIdentity().getHash(), BUCKET_SIZE, KAD_B, new RejectTrimmer<Hash>()); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SegmentedNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/SegmentedNetworkDatabaseFacade.java index 6a308f8fbb423d6bedcbc87f83c56f46b7d9ca91..4ba48034ea8eb5413664be52c8c46dc8ad1ca99e 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SegmentedNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SegmentedNetworkDatabaseFacade.java @@ -1,24 +1,7 @@ package net.i2p.router.networkdb.kademlia; -import java.io.IOException; -import java.io.Writer; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.HashSet; - -import net.i2p.data.BlindData; -import net.i2p.data.DatabaseEntry; -import net.i2p.data.Destination; import net.i2p.data.Hash; -import net.i2p.data.LeaseSet; -import net.i2p.data.SigningPublicKey; -import net.i2p.data.router.RouterInfo; -import net.i2p.router.Job; import net.i2p.router.NetworkDatabaseFacade; -import net.i2p.router.RouterContext; -import net.i2p.router.networkdb.reseed.ReseedChecker; -import net.i2p.util.Log; /** * SegmentedNetworkDatabaseFacade @@ -57,23 +40,15 @@ import net.i2p.util.Log; * @since 0.9.60 */ public abstract class SegmentedNetworkDatabaseFacade { - public SegmentedNetworkDatabaseFacade(RouterContext context) { - } - /** - * Get a sub-netDb using a Hash identifier - * - * @return client subDb for hash, or null if it does not exist - * @since 0.9.60 - */ - protected abstract FloodfillNetworkDatabaseFacade getSubNetDB(Hash dbid); /** * Get the main netDb, the one which is used if we're a floodfill * * @return may be null if main netDb is not initialized * @since 0.9.60 */ - public abstract FloodfillNetworkDatabaseFacade mainNetDB(); + public abstract NetworkDatabaseFacade mainNetDB(); + /** * Get a client netDb for a given client Hash identifier. Will never * return the mainNetDB. @@ -81,13 +56,15 @@ public abstract class SegmentedNetworkDatabaseFacade { * @return may be null if the client netDb does not exist * @since 0.9.60 */ - public abstract FloodfillNetworkDatabaseFacade clientNetDB(Hash dbid); + public abstract NetworkDatabaseFacade clientNetDB(Hash dbid); + /** * Shut down the network databases * * @since 0.9.60 */ public abstract void shutdown(); + /** * Start up the network databases * diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java index c78ccf5597ee4824d2f06b264f4f4c57c6b8c5eb..651170bf86f5e5ca322a0ed5261b2ff66704e6de 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java @@ -207,7 +207,7 @@ abstract class StoreJob extends JobImpl { for (Hash peer : closestHashes) { DatabaseEntry ds; if (_facade.isClientDb()) - ds = getContext().netDb().getDataStore().get(peer); + ds = ((FloodfillNetworkDatabaseFacade) getContext().netDb()).getDataStore().get(peer); else ds = _facade.getDataStore().get(peer); if ( (ds == null) || !(ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) ) { diff --git a/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java b/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java index 42a7010d19c502ad2ad30a038025699882681130..a11afdbb0f9970592be9668a1802d16bf4cfb452 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java +++ b/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java @@ -691,7 +691,7 @@ class InboundEstablishState extends EstablishBase implements NTCP2Payload.Payloa try { RouterInfo old = _context.netDb().store(h, ri); if (flood && !ri.equals(old)) { - FloodfillNetworkDatabaseFacade fndf = _context.netDb(); + FloodfillNetworkDatabaseFacade fndf = (FloodfillNetworkDatabaseFacade) _context.netDb(); if (fndf.floodConditional(ri)) { if (_log.shouldDebug()) _log.debug("Flooded the RI: " + h); diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java index 2cc789fd04850708fc9f648c8b835216a53fa208..936f0edd0d9e5fce46e374c5a1a2d2ea778156a2 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java @@ -1670,7 +1670,7 @@ public class NTCPConnection implements Closeable { return; RouterInfo old = _context.netDb().store(h, ri); if (flood && !ri.equals(old)) { - FloodfillNetworkDatabaseFacade fndf = _context.netDb(); + FloodfillNetworkDatabaseFacade fndf = (FloodfillNetworkDatabaseFacade) _context.netDb(); if ((old == null || ri.getPublished() > old.getPublished()) && fndf.floodConditional(ri)) { if (_log.shouldDebug()) diff --git a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java index 077a5a367d6db3960c68038ec75dcfc1a709a48e..65e3b8fb050e375021155d839f690d7204012888 100644 --- a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java +++ b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java @@ -376,7 +376,7 @@ class InboundEstablishState2 extends InboundEstablishState implements SSU2Payloa try { RouterInfo old = _context.netDb().store(h, ri); if (flood && !ri.equals(old)) { - FloodfillNetworkDatabaseFacade fndf = _context.netDb(); + FloodfillNetworkDatabaseFacade fndf = (FloodfillNetworkDatabaseFacade) _context.netDb(); if (fndf.floodConditional(ri)) { if (_log.shouldDebug()) _log.debug("Flooded the RI: " + h); diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState2.java b/router/java/src/net/i2p/router/transport/udp/PeerState2.java index ed7acb5442f93b8dc100e634d23ff20bfb8d8747..608c147f3fc4acb2249dc516c48b8cd19dd3af43 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerState2.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerState2.java @@ -634,7 +634,7 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback return; RouterInfo old = _context.netDb().store(h, ri); if (flood && !ri.equals(old)) { - FloodfillNetworkDatabaseFacade fndf = _context.netDb(); + FloodfillNetworkDatabaseFacade fndf = (FloodfillNetworkDatabaseFacade) _context.netDb(); if ((old == null || ri.getPublished() > old.getPublished()) && fndf.floodConditional(ri)) { if (_log.shouldDebug()) diff --git a/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java b/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java index 9b65edf2b83ce3c94eba14ce796ac553ffb22838..f17f58a6a5b1d03ca878ee3e30e64eaefe0d29ee 100644 --- a/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java +++ b/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java @@ -267,7 +267,7 @@ class InboundMessageDistributor implements GarlicMessageReceiver.CloveReceiver { if (dsm.getEntry().isLeaseSet()) { if (_log.shouldLog(Log.INFO)) _log.info("[client: " + _clientNickname + "] Saving LS DSM from client tunnel."); - FloodfillDatabaseStoreMessageHandler _FDSMH = new FloodfillDatabaseStoreMessageHandler(_context, _context.clientNetDb(_client)); + FloodfillDatabaseStoreMessageHandler _FDSMH = new FloodfillDatabaseStoreMessageHandler(_context, (FloodfillNetworkDatabaseFacade) _context.clientNetDb(_client)); Job j = _FDSMH.createJob(msg, null, null); j.runJob(); if (sz > 0) { @@ -399,7 +399,7 @@ class InboundMessageDistributor implements GarlicMessageReceiver.CloveReceiver { // ToDo: This should actually have a try and catch. if (_log.shouldLog(Log.INFO)) _log.info("Store the LS in the correct dbid subDb: " + _client.toBase32()); - FloodfillDatabaseStoreMessageHandler _FDSMH = new FloodfillDatabaseStoreMessageHandler(_context, _context.clientNetDb(_client)); + FloodfillDatabaseStoreMessageHandler _FDSMH = new FloodfillDatabaseStoreMessageHandler(_context, (FloodfillNetworkDatabaseFacade) _context.clientNetDb(_client)); Job j = _FDSMH.createJob(data, null, null); j.runJob(); if (sz > 0) {