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')
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)
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)
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()