Esempio n. 1
0
    def __init__(self, kvcconnectinghost):
        # Sequence variable to used for value
        self.seqstart = 0
        self.seqend = 0
        self.seq = 0
        self.seqlimit = 25000

        # Key value on which the project is run
        self.key = 'DS:'

        # lock so that the sequence is incremented and assigned atomically
        self.lock = threading.Lock()

        # Connect to the Key Value Store at the address mentioned in the command prompt
        # Make Socket
        kvcserveraddr, kvcserverport = kvcconnectinghost.split(":")
        self.transport = TSocket.TSocket(kvcserveraddr, int(kvcserverport))

        # Buffering
        self.transport = TTransport.TBufferedTransport(self.transport)

        # Wrap in protocol
        protocol = TBinaryProtocol.TBinaryProtocol(self.transport)

        # Create client
        self.client = KVStore.Client(protocol)

        # Connect!
        self.transport.open()
        print "Connected to server: {0}".format(str(kvcconnectinghost))

        self.sequenceClient = KVSequenceClient('localhost:10100')
Esempio n. 2
0
    def __storeAndReplicate(self, kvpair, clevel):
        clevel_str = "ONE" if clevel == ONE else "QUORUM"
        id0 = self.__partition(kvpair.key)
        p(1, "\tPut kvpair %s at consistency level %s to server %d" % (kvpair.key, clevel_str, id0))
        servers_reached = 0
        failed_servers = []
        for i in range(3):
            idx = (id0+i) % len(self.servers)
            id, ip, port = self.servers[idx][0], self.servers[idx][1], self.servers[idx][2]

            # Write locally if this server
            if id == self.meta.id:
                p(1, "\t\tPut to this server")
                self._put(kvpair, clevel)
                servers_reached = servers_reached + 1

            # Otherwise send to remote server
            else:
                p(1, "\t\tPut to another server...")
                transport = TSocket.TSocket(ip, port);
                transport = TTransport.TBufferedTransport(transport)
                protocol = TBinaryProtocol.TBinaryProtocol(transport)
                client = KVStore.Client(protocol)
                try:
                    transport.open()
                    client._put(kvpair, clevel)
                except:
                    print("\t\t\tServer %d %s:%d not found" % (id, ip, port))
                    failed_servers.append(id)

                else:
                    servers_reached = servers_reached + 1
                transport.close()
        p(1, ("\t%d servers reached clevel %d" % (servers_reached, clevel)))
        if (clevel == ONE and servers_reached >= 1) or (clevel == QUORUM and servers_reached >= 2):
            p(1, ("\tconsistency level %s achieved" % "ONE" if clevel == ONE else "QUORUM"))
            if len(failed_servers) > 0:            
                # Store hinted handoff
                for i in failed_servers:
                    if i in self.hinted:
                        kv = self.hinted[i]
                        kv.append(KVPair(kvpair.key, kvpair.val))
                        self.hinted[i] = kv 
                    else:
                        self.hinted[i] = [KVPair(kvpair.key, kvpair.val)]
                    p(1, "\t\tHinted handoff to server %d, contents of self.hinted %s" % (i, self.hinted))
            return True
        else:
            raise SystemException("Consistently level %s not achieved" % clevel_str)
Esempio n. 3
0
    def __getFromReplicas(self, key, clevel):
        clevel_str = "ONE" if clevel == ONE else "QUORUM"
        getlist = []
        id0 = self.__partition(key)
        p(1, "\tGet key %d at consistency level %s from server %d" % (key, clevel_str, id0))
        servers_reached = 0
        for i in range(3):
            idx = (id0+i) % len(self.servers)
            id, ip, port = self.servers[idx][0], self.servers[idx][1], self.servers[idx][2]
            p(1, "%d %s:%d" % (id, ip, port))

            # Read locally if this server
            if id == self.meta.id:
                p(1, "\t\tGet from this server")
                # ret = self._get(key, clevel)
                ret = self._get(key)
                getlist.append(ret)
                servers_reached = servers_reached + 1

            # Otherwise request from remote server
            else:
                p(1, "\t\tGet from another server...")
                transport = TSocket.TSocket(ip, port);
                transport = TTransport.TBufferedTransport(transport)
                protocol = TBinaryProtocol.TBinaryProtocol(transport)
                client = KVStore.Client(protocol)
                try:
                    transport.open()
                    ret = client._get(key)
                    getlist.append(ret)
                except:
                    print("\t\t\tServer %d %s:%d not found" % (id, ip, port))
                else:
                    servers_reached = servers_reached + 1
                transport.close()
        p(1, ("\t%d servers reached" % servers_reached))
        if (clevel == ONE and servers_reached >= 1) or (clevel == QUORUM and servers_reached >= 2):
            p(1, ("\tconsistency level %s achieved" % "ONE" if clevel == ONE else "QUORUM"))
            most_recent = 0
            for i, l in enumerate(getlist):
                if l.time > getlist[most_recent].time:
                    most_recent = i
            return GetRet(getlist[most_recent].val, getlist[most_recent].ret) 
        else:
            raise SystemException("Consistently level %s not achieved" % clevel_str)
Esempio n. 4
0
def main():
    print(sys.argv[0])
    print(sys.argv[1:])

    # Connect to KVStore Thrift server
    transport = TSocket.TSocket(sys.argv[1], int(sys.argv[2]))
    transport = TTransport.TBufferedTransport(transport)
    protocol = TBinaryProtocol.TBinaryProtocol(transport)
    client = KVStore.Client(protocol)
    transport.open()

    # Main program loop (CTRL-C to exit)
    while (True):

        # Choose get (1) or put (2)
        inputstr = input('Enter 1 for get(), 2 for put()\n')
        try:
            func = int(inputstr)
        except ValueError:
            print("> Error:", "'" + inputstr + "'", "is not a number")
            continue
        if func < 1 or func > 2:
            print('> Error: you entered', inputstr + '.\n',
                  'Enter 1 for get(), 2 for put()')
            continue

        # Indicate consistenty level ONE (1) or QUORUM (2)
        inputstr = input('Enter 1 for consistently level ONE, 2 for QUORUM\n')
        try:
            clevel = int(inputstr)
        except ValueError:
            print("> Error:", "'" + inputstr + "'", "is not a number")
            continue
        if clevel < 1 or clevel > 2:
            print('> Error: you entered', inputstr + '.\n',
                  'Enter 1 for get(), 2 for put()')
            continue

        # get()
        if func == 1:
            inputstr = input("Enter a number in range [0, 255]: ")
            try:
                key = int(inputstr)
            except ValueError:
                print("> Error:", "'" + inputstr + "'", "is not a number")
                continue
            if (key < 0 or key > 255):
                print("> Error:", key, "is not between 0 and 255")
            else:
                getret = client.get(key, clevel - 1)
                val = getret.val
                ret = getret.ret
                if ret:
                    print(ret)
                    print("\nValue =", val)
                else:
                    print("\nValue for key", key, "not found")

                print("\nPress CTRL-C to exit, or...")

        # put()
        else:
            inputstr = input("Enter a number in range [0, 255]: ")
            try:
                key = int(inputstr)
            except ValueError:
                print("> Error:", "'" + inputstr + "'", "is not a number")
                continue

            if (key < 0 or key > 255):
                print("> Error:", key, "is not between 0 and 255")
            else:
                val = input("Enter a string of characters: ")
                client.put(KVPair(key, val), clevel - 1)
                print("\nSuccess!\n")
                print("Press CTRL-C to exit, or...")

    transport.close()