Beispiel #1
0
class Supervisor():
    def __init__(self, time, retries, owner, actors = []):
        self.owner = owner
        self.s_actor = new_supervisor(self.owner.aref)
        self.actors = {}
        self.retries = {}
        self.max_retries = retries

        self.multiActors = SMulti( self.s_actor, actors)
        self.add_actors(actors)
        interval(time, self.ask_actors)
        #timer to indicate the frequency to ask to actors
    def add_actor(self, actor):
        self.actors[actor.get_aref()] = actor
        self.retries[actor.get_aref()] = 0
        self.multiActors.attach(actor)

    def add_actors(self, actors):
        for actor in actors:
            self.add_actor(actor)

    def ask_actors(self):
        try:
            result = self.multiActors.keep_alive()
            for k in result.keys():
                self.retries[k] = 0
        except:
            for key in self.actors.keys():
                self.retries[key] +=1
                if self.retries[key] > self.max_retries:
                    self.owner.failure_detect(self.actors[key])
                    self.retries[key] = 0
        else:
            if len(result.keys()) != len(self.actors.keys()):
                fault_list_keys = result.keys() - self.actors.keys()
                for key in fault_list_keys:
                    self.retries[key] += 1
                    if (self.retries[key] > self.max_retries):
                        self.owner.failure_detect(self.actors[key])
                        self.retries[key] = 0