Exemplo n.º 1
0
 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
Exemplo n.º 2
0
 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()
Exemplo n.º 3
0
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)