@Override public void setStorageHandler(Class<? extends DhtStorablePacket> packetType, DhtStorageHandler storageHandler) { storageHandlers.put(packetType, storageHandler); replicateThread.addDhtStoreToReplicate(storageHandler); }
@Override public void run() { nextReplicationTime = System.currentTimeMillis(); while (!Thread.interrupted()) { try { replicate(); long waitTime = randomTime(REPLICATE_INTERVAL-REPLICATE_VARIANCE, REPLICATE_INTERVAL+REPLICATE_VARIANCE); nextReplicationTime += waitTime; log.debug("Next replication at " + new Date(nextReplicationTime)); TimeUnit.SECONDS.sleep(waitTime); } catch (InterruptedException e) { break; } catch (RuntimeException e) { // catch unexpected exceptions to keep the thread running log.debug("Exception caught in ReplicateThread loop", e); } } log.debug("ReplicateThread interrupted, exiting."); }
@Override public void run() { i2pReceiver.addPacketListener(this); bootstrap(); replicateThread.start(); while (!Thread.interrupted()) { try { if (bucketManager.getUnlockedPeerCount() == 0) { log.info("All peers are gone. Re-bootstrapping."); bootstrap(); } refreshOldBuckets(); TimeUnit.MINUTES.sleep(1); } catch (InterruptedException e) { break; } catch (RuntimeException e) { // catch unexpected exceptions to keep the thread running log.error("Exception caught in KademliaDHT loop", e); } } replicateThread.interrupt(); i2pReceiver.removePacketListener(this); writePeersSorted(peerFile); log.debug("KademliaDHT thread exiting."); } }
/** * Stores a DHT packet locally. The folder the packet is stored in depends on the packet type. * @param packetToStore * @param sender The peer that sent the store request; can be <code>null</code> for the local node */ private void storeLocally(DhtStorablePacket packetToStore, Destination sender) { if (packetToStore != null) { DhtStorageHandler storageHandler = storageHandlers.get(packetToStore.getClass()); if (storageHandler != null) { // If another peer is trying to store a packet that we know has been deleted, let them know and don't store the packet. if (storageHandler instanceof DeletionAwareDhtFolder<?> && sender!=null) { DeletionAwareDhtFolder<?> folder = (DeletionAwareDhtFolder<?>)storageHandler; DeleteRequest delRequest = folder.storeAndCreateDeleteRequest(packetToStore); if (delRequest != null) sendQueue.send(delRequest, sender); } else storageHandler.store(packetToStore); replicateThread.packetStored(storageHandler, packetToStore); } else log.warn("No storage handler found for type " + packetToStore.getClass().getSimpleName() + "."); } }
sendDeleteRequest(delRequest, closestPeers, peer); break;
replicateThread = new ReplicateThread(localDestination, sendQueue, i2pReceiver, bucketManager);