def run(self): self.lock.acquire() remote = Peer(self.remoteName) print remote print "start",self.name self.result = remote.doMapReduce(self.datapile) print "done",self.name self.lock.release() return True
def updatePredecessorList(self): # what if pred = self? try: self.predecessorList = Peer(self.pred.name).getPredecessorList()[1:] + [self.pred.name] except Exception as e: # infinite recursion occured here print self.name, "failed to updatePredecessorList", self.pred.name, self.predecessorList self.predecessorList.pop() if len(self.predecessorList) == 0: self.pred = None self.predecessorList = [self.name]*NUM_PREDECESSORS else: self.pred = Peer(self.predecessorList[-1]) self.updatePredecessorList()
class DHTnode(Node): def __init__(self,host,ip): Node.__init__(self,host,ip) self.data = {} # data I'm responsible for self.backups = {} # data I'm holding onto for someone else self.predecessorList = [self.name]*NUM_PREDECESSORS self.predecessorLock = Lock() self.addNewFunc(self.getPredecessorList, "getPredecessorList") self.addNewFunc(self.put,"put") self.addNewFunc(self.get,"get") self.addNewFunc(self.store,"store") self.addNewFunc(self.storeFile,"storeFile") self.addNewFunc(self.retrieve,"retrieve") self.addNewFunc(self.retrieveFile,"retrieveFile") self.addNewFunc(self.backup,"backup") self.addNewFunc(self.myInfo,"myInfo") def myInfo(self): return str(self.predecessorList) + self.name + str(self.successorList)+ "\n" +self.ringInfo() + "\nData: " + str(self.data.values()) + "\nBackups: " + str(self.backups.values()) + "\n\n" #print self.data def ringInfo(self): info = "" for x in self.predecessorList: info = info + str(Peer(x).hashid)[:6] + " " info = info + str(self.hashid)[:6] + " " for x in self.successorList: info = info + str(Peer(x).hashid)[:6] + " " return info def findSuccessor(self, key, dataRequest = False): if dataRequest and (key in self.data.keys() or key in self.backups.keys()): #print self.name, "short circuited the request" return self.name else: return super(DHTnode,self).findSuccessor(key,dataRequest) def find(self, key, dataRequest): if dataRequest and (key in self.data.keys() or key in self.backups.keys()): #print self.name, "short circuited the request" return self.name, True else: return super(DHTnode,self).find(key,dataRequest) def updateSuccessorList(self): oldList = self.successorList[:] super(DHTnode,self).updateSuccessorList() newSuccessors = [node for node in self.successorList if node not in oldList] for node in newSuccessors: self.backupToNewSuccessor(node) def notify(self,poker): hasNewPred = super(DHTnode,self).notify(poker) self.updatePredecessorList() if hasNewPred: try: for key in self.data.keys()[:]: if hashBetweenRightInclusive(long(key,16), Peer(self.predecessorList[-2]).hashid, self.pred.hashid): #check here for weird behavioer self.relinquishData(key) except Exception: print self.name, "couldn't relinquish data" traceback.print_exc(file=sys.stdout) self.predecessorList.pop() self.pred = Peer(self.predecessorList[-1]) self.updatePredecessorList() return hasNewPred def checkPred(self): if super(DHTnode,self).checkPred(): self.purgeBackups() return True else: self.predecessorList.pop() self.pred = Peer(self.predecessorList[-1]) self.updatePredecessorList() return False def updatePredecessorList(self): # what if pred = self? try: self.predecessorList = Peer(self.pred.name).getPredecessorList()[1:] + [self.pred.name] except Exception as e: # infinite recursion occured here print self.name, "failed to updatePredecessorList", self.pred.name, self.predecessorList self.predecessorList.pop() if len(self.predecessorList) == 0: self.pred = None self.predecessorList = [self.name]*NUM_PREDECESSORS else: self.pred = Peer(self.predecessorList[-1]) self.updatePredecessorList() # public def getPredecessorList(self): return self.predecessorList[:] def purgeBackups(self): for key in self.backups.keys()[:]: if self.pred is not None and not self.pred.name == self.name: #possible logic error location if not hashBetweenRightInclusive(long(key,16), Peer(self.predecessorList[0]).hashid, self.hashid): try: deletions.append((self.backups[key], str(Peer(self.predecessorList[0]).hashid)[:6], str(key)[:6], str(self.hashid)[:6])) del self.backups[key] except Exception, e: print self.backups, e elif self.keyIsMine(key): print self.name, "taking over key", key self.makeBackupMine(key)