package net.i2p.router.networkdb.kademlia; import java.util.Collections; import java.util.List; import net.i2p.data.Hash; import net.i2p.data.i2np.DatabaseStoreMessage; import net.i2p.data.router.RouterAddress; import net.i2p.data.router.RouterInfo; import net.i2p.router.JobImpl; import net.i2p.router.OutNetMessage; import net.i2p.router.Router; import net.i2p.router.RouterContext; import net.i2p.stat.Rate; import net.i2p.stat.RateStat; import net.i2p.util.Log; /** * Job to flood nearby floodfill routers with our RI. * Speeds up integration of new ffs. Created for #1195. * Also called when opting out of ff to call off the hounds ASAP. * Currently floods FNDF.MAX_TO_FLOOD * 2 routers nearest to us. * * @since 0.9.21 */ class FloodfillRouterInfoFloodJob extends JobImpl { private final Log _log; private final FloodfillNetworkDatabaseFacade _facade; private static final int FLOOD_PEERS = 2 * FloodfillNetworkDatabaseFacade.MAX_TO_FLOOD; public FloodfillRouterInfoFloodJob(RouterContext context, FloodfillNetworkDatabaseFacade facade) { super(context); _facade = facade; _log = context.logManager().getLog(FloodfillRouterInfoFloodJob.class); } public String getName() { return "Flood our RouterInfo to nearby floodfills"; } public void runJob() { FloodfillPeerSelector sel = (FloodfillPeerSelector)_facade.getPeerSelector(); DatabaseStoreMessage dsm; OutNetMessage outMsg; RouterInfo nextPeerInfo; List<Hash> peers = sel.selectFloodfillParticipants(getContext().routerHash(), FLOOD_PEERS, null); for(Hash ri: peers) { // Iterate through list of nearby (ff) peers dsm = new DatabaseStoreMessage(getContext()); dsm.setMessageExpiration(getContext().clock().now() + 10*1000); dsm.setEntry(getContext().router().getRouterInfo()); nextPeerInfo = getContext().netDb().lookupRouterInfoLocally(ri); if(nextPeerInfo == null) { continue; } outMsg = new OutNetMessage(getContext(), dsm, getContext().clock().now()+10*1000, OutNetMessage.PRIORITY_MY_NETDB_STORE, nextPeerInfo); getContext().outNetMessagePool().add(outMsg); // Whoosh! if(_log.shouldLog(Log.DEBUG)) { _log.logAlways(Log.DEBUG, "Sending our RI to: " + nextPeerInfo.getHash()); } } } }