Beispiel #1
0
    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
Beispiel #6
0
    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
Beispiel #7
0
    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
Beispiel #8
0
    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