-
Notifications
You must be signed in to change notification settings - Fork 110
/
kvstorage.py
62 lines (48 loc) · 1.46 KB
/
kvstorage.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/env python
from __future__ import print_function
import sys
sys.path.append("../")
from pysyncobj import SyncObj, SyncObjConf, replicated
class KVStorage(SyncObj):
def __init__(self, selfAddress, partnerAddrs):
cfg = SyncObjConf(dynamicMembershipChange = True)
super(KVStorage, self).__init__(selfAddress, partnerAddrs, cfg)
self.__data = {}
@replicated
def set(self, key, value):
self.__data[key] = value
@replicated
def pop(self, key):
self.__data.pop(key, None)
def get(self, key):
return self.__data.get(key, None)
_g_kvstorage = None
def main():
if len(sys.argv) < 2:
print('Usage: %s selfHost:port partner1Host:port partner2Host:port ...')
sys.exit(-1)
selfAddr = sys.argv[1]
if selfAddr == 'readonly':
selfAddr = None
partners = sys.argv[2:]
global _g_kvstorage
_g_kvstorage = KVStorage(selfAddr, partners)
def get_input(v):
if sys.version_info >= (3, 0):
return input(v)
else:
return raw_input(v)
while True:
cmd = get_input(">> ").split()
if not cmd:
continue
elif cmd[0] == 'set':
_g_kvstorage.set(cmd[1], cmd[2])
elif cmd[0] == 'get':
print(_g_kvstorage.get(cmd[1]))
elif cmd[0] == 'pop':
print(_g_kvstorage.pop(cmd[1]))
else:
print('Wrong command')
if __name__ == '__main__':
main()