예제 #1
0
    def send_fetch_response(self, gb):
        request_user = gb.user_id
        message = GBMessage()
        message.view_id = self.user_m.view_id
        message.action = "fetch_response"
        message.message = self.abcast.logManager.encodedRecord()
        print 'fetch response', message.message

        str_message = message.__encode__()
        self.cast_s.sendGB(str_message, request_user)
예제 #2
0
    def send_user_dict_request(self):
        self.status = 1
        user_dict = self.addrmanager.get_dict()
        str_json = json.dumps(user_dict)

        request_message = GBMessage()
        request_message.user_id = self.UID
        request_message.action = "ask for dict"
        request_message.message = str_json
        str_message = request_message.__encode__()
        self.cast_s.sendGB(str_message)

        if (len(self.user_m.temp_user_list.keys()) == 1):
            self.status = 2
예제 #3
0
    def send_prepare(self):
        self.status = 10
        user_list = self.addrmanager.user_dict.keys()
        user_list.remove(self.UID)
        new_user_list = user_list + [self.UID]
        self.user_m.update_user_list(new_user_list, self.user_m.view_id + 1)

        message = GBMessage()

        message.view_id = self.user_m.view_id + 1

        message.user_id = self.UID
        message.action = "prepare"

        user_list = self.addrmanager.user_dict.keys()
        user_list.remove(self.UID)
        new_user_list = user_list + [self.UID]
        str_json = json.dumps(new_user_list)
        print "PREPARE", "new_user_list", new_user_list

        message.message = str_json

        str_message = message.__encode__()

        self.cast_s.sendGB(str_message)
예제 #4
0
    def send_prepare(self):
        self.status = 10
        user_list = self.addrmanager.user_dict.keys()
        user_list.remove(self.UID)
        new_user_list = user_list + [self.UID]
        self.user_m.update_user_list(new_user_list, self.user_m.view_id + 1)

        message = GBMessage()

        message.view_id = self.user_m.view_id + 1
        
        message.user_id = self.UID
        message.action = "prepare"

        user_list = self.addrmanager.user_dict.keys()
        user_list.remove(self.UID)
        new_user_list = user_list + [self.UID]
        str_json = json.dumps(new_user_list)
        print "PREPARE", "new_user_list", new_user_list

        message.message = str_json

        str_message = message.__encode__()

        self.cast_s.sendGB(str_message)
예제 #5
0
    def test_clock(self, s):
        message = GBMessage()

        message.view_id = self.user_m.view_id
        message.user_id = self.UID
        message.action = "clock"
        message.message = s

        str_message = message.__encode__()

        self.cast_s.sendGB(str_message)
예제 #6
0
    def send_kick_message(self, message):
        print 'ERR', 'SEND Kick Message', message
        kick_message = GBMessage()

        kick_message.view_id = self.user_m.view_id
        kick_message.user_id = self.UID
        kick_message.action = "kick"
        kick_message.message = "B" + message

        str_message = kick_message.__encode__()

        self.cast_s.sendGB(str_message)
예제 #7
0
    def send_fetch_response(self, gb):
        request_user = gb.user_id
        message = GBMessage()
        message.view_id = self.user_m.view_id
        message.action = "fetch_response"
        message.message = self.abcast.logManager.encodedRecord()
        print 'fetch response', message.message

        str_message = message.__encode__()
        self.cast_s.sendGB(str_message, request_user)
예제 #8
0
    def test_clock(self, s):
        message = GBMessage()

        message.view_id = self.user_m.view_id
        message.user_id = self.UID
        message.action = "clock"
        message.message = s

        str_message = message.__encode__()

        self.cast_s.sendGB(str_message)
예제 #9
0
    def send_user_dict(self):
        user_dict = self.addrmanager.get_dict()
        #dumps to json format
        str_json = json.dumps(user_dict)

        dict_message = GBMessage()

        dict_message.view_id = self.user_m.view_id
        dict_message.user_id = self.UID
        dict_message.action = "dict"
        dict_message.message = str_json

        str_message = dict_message.__encode__()

        self.cast_s.sendGB(str_message)
예제 #10
0
    def send_kick_message(self, message):
        print 'ERR', 'SEND Kick Message', message
        kick_message = GBMessage()

        kick_message.view_id = self.user_m.view_id
        kick_message.user_id = self.UID
        kick_message.action = "kick"
        kick_message.message = "B" + message

        str_message = kick_message.__encode__()

        self.cast_s.sendGB(str_message)
예제 #11
0
    def send_fetch_all_data(self):
        message = GBMessage()
        message.view_id = self.user_m.view_id
        message.user_id = self.UID
        message.action = "fetch_request"
        message.message = "encode"

        str_message = message.__encode__()

        c = self.user_m.fetch_user_list()

        other_user = ""
        for user in c:
            if user is not self.UID:
                other_user = user

        self.cast_s.sendGB(str_message, other_user)
예제 #12
0
    def send_user_dict_request(self):
        self.status = 1
        user_dict = self.addrmanager.get_dict()
        str_json = json.dumps(user_dict)

        request_message = GBMessage()
        request_message.user_id = self.UID
        request_message.action = "ask for dict"
        request_message.message = str_json
        str_message = request_message.__encode__()
        self.cast_s.sendGB(str_message)

        if (len(self.user_m.temp_user_list.keys()) == 1):
            self.status = 2
예제 #13
0
    def send_user_dict(self):
        user_dict = self.addrmanager.get_dict()
        #dumps to json format
        str_json = json.dumps(user_dict)

        dict_message = GBMessage()

        dict_message.view_id = self.user_m.view_id
        dict_message.user_id = self.UID
        dict_message.action = "dict"
        dict_message.message = str_json

        str_message = dict_message.__encode__()

        self.cast_s.sendGB(str_message)
예제 #14
0
    def send_fetch_all_data(self):
        message = GBMessage()
        message.view_id = self.user_m.view_id
        message.user_id = self.UID
        message.action = "fetch_request"
        message.message = "encode"

        str_message = message.__encode__()

        c = self.user_m.fetch_user_list()
        
        other_user = ""
        for user in c:
            if user is not self.UID:
                other_user = user

        self.cast_s.sendGB(str_message, other_user)
예제 #15
0
    def recv_delete_msg(self, message, src):
        print 'ERR', "RECV delete message from", src, "msg:", message
        trim_message = message[1:]
        if message[0] == "B":
            message = self.ebcast.receiveErrorBroadCast(trim_message)
        if message[0] == "R":
            message = self.ebcast.receiveErrorReply(trim_message)

        if message == None:
            return
        else:
            kick_message = GBMessage()

            kick_message.view_id = self.user_m.view_id
            kick_message.user_id = self.UID
            kick_message.action = "kick"
            kick_message.message = "R" + message

            str_message = kick_message.__encode__()

            self.cast_s.sendGB(str_message, src)

        return
        '''
예제 #16
0
    def recv_delete_msg(self, message, src):
        print 'ERR', "RECV delete message from", src, "msg:", message
        trim_message = message[1:]
        if message[0] == "B":
            message = self.ebcast.receiveErrorBroadCast(trim_message)
        if message[0] == "R":
            message = self.ebcast.receiveErrorReply(trim_message)

        if message == None:
            return
        else:
            kick_message = GBMessage()

            kick_message.view_id = self.user_m.view_id
            kick_message.user_id = self.UID
            kick_message.action = "kick"
            kick_message.message = "R" + message

            str_message = kick_message.__encode__()

            self.cast_s.sendGB(str_message, src)
           
        return
        '''
예제 #17
0
    def recv_gbcast(self):
        #recv gbcast
        str_message = self.cast_s.recvGB()
        if len(str_message) < 1:
            return

        gb = GBMessage().__decode__(str_message)
        #View ID is too old

        print "action", gb.action
        if (gb.action == "clock"):
            print gb.user_id, gb.message
            pass
        if (gb.action == "kick"):
            #remote delete
            if (gb.view_id < self.user_m.view_id):
                print gb.view_id, self.user_m.view_id, ' view id is too old' 
                return
            if (gb.view_id > self.user_m.view_id):
                self.user_m.updateuser_dict(self.user_m.fetch_user_list(), gb.view_id)
            print 'kick', gb.message , "*"
            if (gb.user_id in self.user_m.fetch_user_list()):
                self.recv_delete_msg(gb.message, gb.user_id)

        if (gb.action == "ask for dict"):
            if (gb.user_id == self.UID):
                #self.send_user_dict()
                pass
            else:
                self.update_user_dict(gb.message)
                self.send_user_dict()

        if (gb.action == "dict"):
            if (gb.view_id > self.user_m.view_id):
                self.user_m.view_id = gb.view_id
            self.update_user_dict(gb.message)
            if self.status == 1:
                if (self.connect_user_dict()):
                    self.status = 2
                else:
                    print 'error!', 'cannot join the group, try again'
                    self.status = 0
            print 'status', self.status

        if (self.status == 2):
            print 'ready to send prepare'
            self.send_prepare()
            

        if (gb.action == "prepare"):
            if gb.view_id > self.user_m.view_id:
                self.viewchange.prepare(gb)
            else:
                print 'PREPARE', "old view id", gb.view_id
                pass

        if (gb.action == "prepare-ok"):
            print 'vid', gb.view_id
            print 'uid', gb.user_id
            print 'msg', gb.message
            if (self.viewchange.prepare_ok(gb)):
                #user_list = json.loads(gb.message)
                #self.user_m.uate_user_list(user_list)
                self.abcast.addUser("123")
                print 'abcast resume'
                self.abcast.resume()

        if (gb.action == "fetch_request"):
            print 'fetch data'
            #request the fetch
            #fetch local 
            #encode and send back
            self.send_fetch_response(gb)

        if (gb.action == "fetch_response"):
            if self.viewchange.joiner == True:
                if gb.view_id >= self.user_m.view_id:
                    #time.sleep(3)
                    print 'get fetched message'
                    self.viewchange.joiner = False
                    str_history = gb.message
                    t = self.abcast.logManager.decodedRecord(str_history)
                    self.abcast.synchronize(t)

                    gb.message = json.dumps(self.user_m.fetch_user_list())
                    print 'done'
                    #time.sleep(3)
                    self.abcast.start()
                    print 'send final prepare-ok'
                    self.send_prepare_ok(gb)
                else:
                    print 'old view'
                    pass


        #check whether to prepare OK

        self.notify_all()
        '''
예제 #18
0
    def recv_gbcast(self):
        #recv gbcast
        str_message = self.cast_s.recvGB()
        if len(str_message) < 1:
            return

        gb = GBMessage().__decode__(str_message)
        #View ID is too old

        print "action", gb.action
        if (gb.action == "clock"):
            print gb.user_id, gb.message
            pass
        if (gb.action == "kick"):
            #remote delete
            if (gb.view_id < self.user_m.view_id):
                print gb.view_id, self.user_m.view_id, ' view id is too old'
                return
            if (gb.view_id > self.user_m.view_id):
                self.user_m.updateuser_dict(self.user_m.fetch_user_list(),
                                            gb.view_id)
            print 'kick', gb.message, "*"
            if (gb.user_id in self.user_m.fetch_user_list()):
                self.recv_delete_msg(gb.message, gb.user_id)

        if (gb.action == "ask for dict"):
            if (gb.user_id == self.UID):
                #self.send_user_dict()
                pass
            else:
                self.update_user_dict(gb.message)
                self.send_user_dict()

        if (gb.action == "dict"):
            if (gb.view_id > self.user_m.view_id):
                self.user_m.view_id = gb.view_id
            self.update_user_dict(gb.message)
            if self.status == 1:
                if (self.connect_user_dict()):
                    self.status = 2
                else:
                    print 'error!', 'cannot join the group, try again'
                    self.status = 0
            print 'status', self.status

        if (self.status == 2):
            print 'ready to send prepare'
            self.send_prepare()

        if (gb.action == "prepare"):
            if gb.view_id > self.user_m.view_id:
                self.viewchange.prepare(gb)
            else:
                print 'PREPARE', "old view id", gb.view_id
                pass

        if (gb.action == "prepare-ok"):
            print 'vid', gb.view_id
            print 'uid', gb.user_id
            print 'msg', gb.message
            if (self.viewchange.prepare_ok(gb)):
                #user_list = json.loads(gb.message)
                #self.user_m.uate_user_list(user_list)
                self.abcast.addUser("123")
                print 'abcast resume'
                self.abcast.resume()

        if (gb.action == "fetch_request"):
            print 'fetch data'
            #request the fetch
            #fetch local
            #encode and send back
            self.send_fetch_response(gb)

        if (gb.action == "fetch_response"):
            if self.viewchange.joiner == True:
                if gb.view_id >= self.user_m.view_id:
                    #time.sleep(3)
                    print 'get fetched message'
                    self.viewchange.joiner = False
                    str_history = gb.message
                    t = self.abcast.logManager.decodedRecord(str_history)
                    self.abcast.synchronize(t)

                    gb.message = json.dumps(self.user_m.fetch_user_list())
                    print 'done'
                    #time.sleep(3)
                    self.abcast.start()
                    print 'send final prepare-ok'
                    self.send_prepare_ok(gb)
                else:
                    print 'old view'
                    pass

        #check whether to prepare OK

        self.notify_all()
        '''
예제 #19
0

if __name__ == "__main__":
    class FakeUserManager():
        def __init__(self):
            pass
        def fetch_user_list():
            return ['a', 'b', 'c']

    class FakeGBCAST():
        def __init__(self):
            self.user_m = FakeUserManager()
        def send_prepare_ok(self, message):
            print 'send prepare ok', message
    class FakeABCAST():
        def block():
            print 'block local'
           
    #Prepare OK
    vc = ViewChange(FakeABCAST(), FakeGBCAST())
    gb = GBMessage()
    gb.view_id = 1
    gb.user_id = 'a'
    gb.message = json.dumps(['a', 'b', 'c', 'd'])
    vc.prepare(gb)


    #


예제 #20
0
if __name__ == "__main__":

    class FakeUserManager():
        def __init__(self):
            pass

        def fetch_user_list():
            return ['a', 'b', 'c']

    class FakeGBCAST():
        def __init__(self):
            self.user_m = FakeUserManager()

        def send_prepare_ok(self, message):
            print 'send prepare ok', message

    class FakeABCAST():
        def block():
            print 'block local'

    #Prepare OK
    vc = ViewChange(FakeABCAST(), FakeGBCAST())
    gb = GBMessage()
    gb.view_id = 1
    gb.user_id = 'a'
    gb.message = json.dumps(['a', 'b', 'c', 'd'])
    vc.prepare(gb)

    #