def checkSuccessor(self): if self.successor[1] == self.id: return ip, port = self.successor[0][0], self.successor[0][1] # print(helper.isNodeAlive(ip,port)) if helper.isNodeAlive(ip, port) == False: i = 2 self.successor = self.successorList[i] ip, port = self.successor[0][0], self.successor[0][1] while helper.isNodeAlive(ip, port) == False and i <= R: self.successor = self.successorList[i] ip, port = self.successor[0][0], self.successor[0][1] i += 1 if i > R: self.successor = [[self.getIpAddress(), self.getPortNumber()], self.id] helper.getRecoveryKeysFromSuccessor(self, self.successor[0][0], self.successor[0][1]) self.updateSuccessorList()
def updateOthers(X): t_nodes = X.neighborhoodSet + X.upLeafSet + X.downLeafSet for routeTableRow in X.routingTable: for routeTableEntry in routeTableRow: if(isNodeAlive(routeTableEntry)): t_nodes.append(routeTableEntry) t_nodes = list(set(t_nodes)) # Updating neighborhoodSet of others for otherNode in t_nodes: # adding X into the neighborhoodSet of otherNode if not enough neighbors if(len(otherNode.neighborhoodSet) < neighborSetLen): otherNode.neighborhoodSet.append(X) break # replacing neighbor of otherNode with X if more closer for neighborOfOtherNode in otherNode.neighborhoodSet: if(getRelativeDistance(neighborOfOtherNode, otherNode) > getRelativeDistance(X, otherNode)): otherNode.neighborhoodSet.remove(neighborOfOtherNode) otherNode.neighborhoodSet.append(X) break # updating leafs of others for otherNode in t_nodes: # adding X into the leafSet of leaf if not enough leafs if(len(otherNode.downLeafSet) < lowLeafSetLen and isEligibleDownLeaf(X, otherNode)): otherNode.downLeafSet.append(X) break elif(len(otherNode.upLeafSet) < upLeafSetLen and isEligibleUpLeaf(X, otherNode)): otherNode.upLeafSet.append(X) break # replacing leaf of otherNode with X if more numerically closer t_leafOfOtherNodeSet = otherNode.downLeafSet + otherNode.upLeafSet for leafOfOtherNode in t_leafOfOtherNodeSet: if leafOfOtherNode in otherNode.downLeafSet and X.nodeKey < otherNode.nodeKey: if(getNumericDistance(leafOfOtherNode, otherNode) > getNumericDistance(X, otherNode)): otherNode.downLeafSet.remove(leafOfOtherNode) otherNode.downLeafSet.append(X) break if leafOfOtherNode in otherNode.upLeafSet and X.nodeKey > otherNode.nodeKey: if(getNumericDistance(leafOfOtherNode, otherNode) > getNumericDistance(X, otherNode)): otherNode.upLeafSet.remove(leafOfOtherNode) otherNode.upLeafSet.append(X) break # updating nodes in routing table with X for otherNode in t_nodes: prefixLen = helper.shl(otherNode.nodeKey, X.nodeKey) row = prefixLen col = int(X.nodeKey[prefixLen], 16) routeTableEntry = otherNode.routingTable[row][col] if not(isNodeAlive(routeTableEntry)): otherNode.routingTable[row][col] = X
def nodeDeleted(X): X.isNodeActive = False for node in nodes: # Repair leaf set if X in node.upLeafSet: node.upLeafSet.remove(X) temp = getMaxLeaf(node) if temp: t_leafSet = temp.downLeafSet + temp.upLeafSet for leaf in t_leafSet: if isEligibleUpLeaf(leaf, node) and leaf not in node.upLeafSet and isNodeAlive(leaf): node.upLeafSet.append(leaf) break elif X in node.downLeafSet: node.downLeafSet.remove(X) temp = getMinLeaf(node) if temp: t_leafSet = temp.downLeafSet + temp.upLeafSet for leaf in t_leafSet: if isEligibleDownLeaf(leaf, node) and leaf not in node.downLeafSet and isNodeAlive(leaf): node.downLeafSet.append(leaf) break # Repair neighborhood set if X in node.neighborhoodSet: node.neighborhoodSet.remove(X) t_neighborOfNeighborList = [] # getting all the neighbor of neighbors for neighbor in node.neighborhoodSet: if(isNodeAlive(neighbor)): t_neighborOfNeighborList += neighbor.neighborhoodSet t_neighborOfNeighborList = list(set(t_neighborOfNeighborList)) while t_neighborOfNeighborList: closestNeighborOfNeighbor = getClosestNode(t_neighborOfNeighborList, node) if(closestNeighborOfNeighbor.nodeKey == node.nodeKey): t_neighborOfNeighborList.remove(closestNeighborOfNeighbor) continue node.neighborhoodSet.append(closestNeighborOfNeighbor) break # Repair routing table for routeTableRow in node.routingTable: try: if X in routeTableRow: row = node.routingTable.index(routeTableRow) col = routeTableRow.index(X) repairRouteTableEntry(node, row, col) break except ValueError: continue
def repairRouteTableEntry(A, row, col): # asking nodes in the same row for replacement node for r in range(row, len(A.routingTable)): for c in range(0, len(A.routingTable[r])): t_node = A.routingTable[r][c] if(c != col and isNodeAlive(t_node)): t_node_routeTableEntry = t_node.routingTable[row][col] if(isNodeAlive(t_node_routeTableEntry)): A.routingTable[row][col] = t_node_routeTableEntry return
def routeForAdd(A, X): i = -1 routePath = [] while(1): i += 1 routePath.append(A) # returning if found the node if A.nodeKey == X.nodeKey: return routePath # search in routing table row = i col = int(X.nodeKey[i], 16) routeTableEntry = A.routingTable[row][col] if not(isNodeAlive(routeTableEntry)): return routePath A = routeTableEntry return routePath
def fixFingers(self): next_node = 1 mod = 2**M while next_node <= M: if helper.isNodeAlive(self.successor[0][0], self.successor[0][1]) == False: return newId = self.id + 2**(next_node - 1) newId = newId % mod node = self.findSuccessor(newId) if node[0][0] == "" or node[1] == -1 or node[0][1] == -1: break self.fingerTable[next_node] = node next_node += 1
def checkPredecessor(self): if self.predecessor[1] == -1: return ip = self.predecessor[0][0] port = self.predecessor[0][1] if helper.isNodeAlive(ip, port) == False: #/* if node has same successor and self.predecessor then set node as it's successor itself */ if self.predecessor[1] == self.successor[1]: self.successor[0][0] = self.getIpAddress() self.successor[0][1] = self.getPortNumber() self.successor[1] = self.id self.setSuccessorList(self.successor[0][0], self.successor[0][1], self.id) helper.getRecoveryKeysFromSuccessor(self, self.successor[0][0], self.successor[0][1]) self.predecessor[0][0] = "" self.predecessor[0][1] = -1 self.predecessor[1] = -1
def stabilize(self): ownIp = self.getIpAddress() ownPort = self.getPortNumber() if helper.isNodeAlive(self.successor[0][0], self.successor[0][1]) == False: return #get predecessor of self.successor predNode = helper.getPredecessorNode(self.successor[0][0], self.successor[0][1], ownIp, ownPort, True) predecessorHash = predNode[1] if predecessorHash == -1 or self.predecessor[1] == -1: return if predecessorHash > self.id or ( predecessorHash > self.id and predecessorHash < self.successor[1]) or ( predecessorHash < self.id and predecessorHash < self.successor[1]): self.successor = predNode
def route(A, X): routePath = [] while(1): routePath.append(A) if len(routePath) > 20: print "route path too much" # returning if found the node if A.nodeKey == X.nodeKey: return routePath # search in leafSet leafSet = A.downLeafSet + A.upLeafSet if leafSet: # checking if the leafSet is not empty minLeaf = getMinLeaf(A) if minLeaf is None: minLeaf = A maxLeaf = getMaxLeaf(A) if maxLeaf is None: maxLeaf = A if(minLeaf.nodeKey <= X.nodeKey <= maxLeaf.nodeKey): leafSet.append(A) # Adding the currentNode in the leafSet...currentNode can be nearest nearestleaf = getMinDistNode(leafSet, X) # no need to append the routePath if nearestLeaf is the current node '''if A.nodeKey != nearestleaf.nodeKey: routePath.append(nearestleaf) return routePath''' if A.nodeKey == nearestleaf.nodeKey: return routePath A = nearestleaf continue # search in routing table prefixLen = helper.shl(A.nodeKey, X.nodeKey) row = prefixLen col = int(X.nodeKey[prefixLen], 16) distFromA = helper.getNumericDistance(A, X) routeTableEntry = A.routingTable[row][col] if(isNodeAlive(routeTableEntry)): A = routeTableEntry continue # forwarded to the closer node else: # repair the routingTableEntry '''repairRouteTableEntry(A, row, col)''' # commented here since handled in the deletion # Send to numerically closer node t_list = A.downLeafSet + A.upLeafSet + A.neighborhoodSet for rowEntry in A.routingTable[row]: if(isNodeAlive(rowEntry)): t_list.append(rowEntry) t_list = list(set(t_list)) for node in t_list: t_prefixLen = helper.shl(node.nodeKey, X.nodeKey) t_dist = helper.getNumericDistance(node, X) if(t_prefixLen >= prefixLen and t_dist < distFromA): A = node break # returning if no node more near to the last node in the routePath if routePath[-1].nodeKey == A.nodeKey: return routePath return routePath
def getRandomNode(): while 1: randomNode = nodes[random.randint(0, len(nodes) - 1)] if isNodeAlive(randomNode): return randomNode
def noisyDelete(X): X.isNodeActive = False affectedCount = 0 for node in nodes: if not(isNodeAlive(node)): # no need to repair the dead nodes continue affectedFlag = False # Repair leaf set if X in node.upLeafSet: affectedFlag = True node.upLeafSet.remove(X) temp = getMaxLeaf(node) if temp: t_leafSet = temp.downLeafSet + temp.upLeafSet for leaf in t_leafSet: if isEligibleUpLeaf(leaf, node) and leaf not in node.upLeafSet and isNodeAlive(leaf): node.upLeafSet.append(leaf) break elif X in node.downLeafSet: affectedFlag = True node.downLeafSet.remove(X) temp = getMinLeaf(node) if temp: t_leafSet = temp.downLeafSet + temp.upLeafSet for leaf in t_leafSet: if isEligibleDownLeaf(leaf, node) and leaf not in node.downLeafSet and isNodeAlive(leaf): node.downLeafSet.append(leaf) break # Repair neighborhood set if X in node.neighborhoodSet: affectedFlag = True node.neighborhoodSet.remove(X) t_neighborOfNeighborList = [] # getting all the neighbor of neighbors for neighbor in node.neighborhoodSet: if(isNodeAlive(neighbor)): for neighborOfneighbor in neighbor.neighborhoodSet: if(isNodeAlive(neighborOfneighbor)): t_neighborOfNeighborList.append(neighborOfneighbor) t_neighborOfNeighborList = list(set(t_neighborOfNeighborList)) while t_neighborOfNeighborList: closestNeighborOfNeighbor = getClosestNode(t_neighborOfNeighborList, node) try: if(closestNeighborOfNeighbor.nodeKey == node.nodeKey): t_neighborOfNeighborList.remove(closestNeighborOfNeighbor) continue node.neighborhoodSet.append(closestNeighborOfNeighbor) break except AttributeError: print ("Error") # Repair routing table for routeTableRow in node.routingTable: try: if X in routeTableRow: affectedFlag = True row = node.routingTable.index(routeTableRow) col = routeTableRow.index(X) repairRouteTableEntry(node, row, col) break except ValueError: continue if affectedFlag: affectedCount += 1 return affectedCount
def route(A, X): routePath = [] accessArr = [0,0,0,0,0,0] while(1): routePath.append(A) prefixLen = helper.shl(A.nodeKey, X.nodeKey) if len(routePath) > 20: print ("route path too much") # returning if found the node if A.nodeKey == X.nodeKey: return routePath, accessArr # search in leafSet accessArr[0] += 1 leafSet = A.downLeafSet + A.upLeafSet if leafSet: # checking if the leafSet is not empty minLeaf = getMinLeaf(A) maxLeaf = getMaxLeaf(A) if minLeaf and maxLeaf: if(minLeaf.nodeKey <= X.nodeKey <= maxLeaf.nodeKey): t_leafSet = [] for leaf in leafSet: t_prefixLen = helper.shl(leaf.nodeKey, X.nodeKey) if t_prefixLen >= prefixLen: t_leafSet.append(leaf) nearestleaf = getMinDistNode(t_leafSet, X) # no need to append the routePath if nearestLeaf is the current node '''if A.nodeKey != nearestleaf.nodeKey: routePath.append(nearestleaf) return routePath''' accessArr[1] += 1 A = nearestleaf continue # search in routing table accessArr[2] += 1 row = prefixLen col = int(X.nodeKey[prefixLen], 16) routeTableEntry = A.routingTable[row][col] if(isNodeAlive(routeTableEntry)): accessArr[3] += 1 A = routeTableEntry continue # forwarded to the closer node else: accessArr[4] += 1 '''# repair the routingTableEntry''' # if(routeTableEntry): # Repairing only if it is not null (i.e it is not active) repairRouteTableEntry(A, row, col) # commented here since handled in the deletion''' # Send to numerically closer node t_list = A.downLeafSet + A.upLeafSet + A.neighborhoodSet for k in range(row, len(A.routingTable)): for rowEntry in A.routingTable[k]: if(isNodeAlive(rowEntry)): t_list.append(rowEntry) t_list = list(set(t_list)) t_list.remove(A) t_t_list = [] for node in t_list: # Getting all nodes with >= prefixLen than the current node t_prefixLen = helper.shl(node.nodeKey, X.nodeKey) if t_prefixLen >= prefixLen: t_t_list.append(node) nearestNode = getMinDistNode(t_t_list, X) distFromA = helper.getNumericDistance(A, X) t_dist = helper.getNumericDistance(nearestNode, X) if(t_dist < distFromA): if nearestNode in A.neighborhoodSet: accessArr[5] += 1 A = nearestNode continue else: # print ("----No more routing possible") return routePath, accessArr return routePath, accessArr