public void leave(ProgressStatus progressStatus) throws StorageException { try { Key[] keys = overlayNode.leave(); Set<String> resourcesNames = resourceManager.getAllKeys(); log.info("Leaving..."); log.debug("Number of files to transfer: [" + resourcesNames.size() + "]"); if (!keys[0].equals(overlayNode.getKey())) { for (String name : resourcesNames) { Resource resource = resourceManager.find(name); put(resource, keys[0], false, progressStatus); resource.close(); } } resourceManager.deleteAll(); communicationManager.removeObserver(overlayNode.getKey().getValue()); } catch (OverlayException | IOException e) { log.error("Error while leaving dhash node: '" + overlayNode.getKey().toString() + "'"); } }
boolean putSync(Resource resource, ProgressStatus progressStatus) throws StorageException { progressStatus.status("put", 0L, 1L); progressStatus.status("overlay-node-lookup", 0L, 1L); Key key = keyFactory.newKey(resource.getId()); log.debug("Resource to put: [" + resource.getId() + "] Hashing: [" + key.getHashing() + "]"); Key lookupKey = overlayNode.lookUp(key); progressStatus.status("overlay-node-lookup", 1L, 1L); if (lookupKey == null) { log.error("Impossible to do put the resource: " + resource.getId() + " in this moment"); throw new StorageException("Impossible to do put the resource: " + resource.getId() + " in this moment"); } log.debug("Lookup key for " + key.getHashing() + ": [" + lookupKey.getValue() + "]"); boolean success = put(resource, lookupKey, true, progressStatus); progressStatus.status("put", 1L, 1L); return success; }
} else { log.debug("Node '" + nodeChord.getKey().getValue() + "' found '" + findNode.getValue() + "'"); nodeChord.join(findNode);
/** * Join a Chord ring using node <code>node</code>. * <p> * The <code>join</code> function asks <code>node</code> to find the * immediate successor of <code>n</code>. * * @param node Identifier of the known node. */ public void join(Key node) { Message lookupMessage; predecessor = null; lookupMessage = Message.builder() .id(idGenerator.newId()) .sendType(Message.SendType.REQUEST) .messageType(Protocol.LOOKUP) .address(Address.builder() .destination(node.getValue()) .source(key.getValue()) .build()) .param(Protocol.LookupParams.HASHING.name(), key.getHashing().toString()) .param(Protocol.LookupParams.TYPE.name(), LookupType.JOIN.name()) .build(); successor = communicationManager.send(lookupMessage, ChordKey.class, LookupResponseParams.NODE_FIND.name()); successorList.initializeSuccessors(); }
.messageType(Protocol.PUT) .address(Address.builder() .destination(lookupKey.getValue()) .source(name) .build())
.messageType(Protocol.LOOKUP) .address(Address.builder() .destination(next.getValue()) .source(key.getValue()) .build())