-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathblockserver.py
More file actions
117 lines (93 loc) · 3.06 KB
/
blockserver.py
File metadata and controls
117 lines (93 loc) · 3.06 KB
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import pickle, logging
import argparse
import time
import fsconfig
from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler
import hashlib
# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)
class DiskBlocks():
def __init__(self, total_num_blocks, block_size, delayat, cblk):
self.checksums = {}
# This class stores the raw block array
self.block = []
# initialize request counter
self.counter = 0
self.delayat = delayat
self.cblk = cblk
# if cblk has been provided
if cblk != -1:
self.checksums[cblk] = -1
# Initialize raw blocks
for i in range (0, total_num_blocks):
putdata = bytearray(block_size)
self.block.insert(i,putdata)
def Sleep(self):
self.counter += 1
if (self.counter % self.delayat) == 0:
time.sleep(10)
if __name__ == "__main__":
# Construct the argument parser
ap = argparse.ArgumentParser()
ap.add_argument('-nb', '--total_num_blocks', type=int, help='an integer value')
ap.add_argument('-bs', '--block_size', type=int, help='an integer value')
ap.add_argument('-port', '--port', type=int, help='an integer value')
ap.add_argument('-delayat', '--delayat', type=int, help='an integer value')
ap.add_argument('-cblk', '--cblk', type=int, help='an integer value')
args = ap.parse_args()
if args.total_num_blocks:
TOTAL_NUM_BLOCKS = args.total_num_blocks
else:
print('Must specify total number of blocks')
quit()
if args.block_size:
BLOCK_SIZE = args.block_size
else:
print('Must specify block size')
quit()
if args.port:
PORT = args.port
else:
print('Must specify port number')
quit()
if args.delayat:
delayat = args.delayat
else:
# initialize delayat with artificially large number
delayat = 1000000000
if args.cblk:
cblk = args.cblk
else:
cblk = -1
# initialize blocks
RawBlocks = DiskBlocks(TOTAL_NUM_BLOCKS, BLOCK_SIZE, delayat, cblk)
# Create server
server = SimpleXMLRPCServer(("127.0.0.1", PORT), requestHandler=RequestHandler)
def Get(block_number):
if block_number == cblk:
return -1#, "CORRUPTED_BLOCK"
result = RawBlocks.block[block_number]
RawBlocks.Sleep()
return result
server.register_function(Get)
def Put(block_number, data):
if block_number == cblk:
return -1#, "CORRUPTED_BLOCK"
RawBlocks.checksums[block_number] = hashlib.md5(data.data).hexdigest()
RawBlocks.block[block_number] = data.data
RawBlocks.Sleep()
return 0
server.register_function(Put)
def RSM(block_number):
RSM_LOCKED = bytearray(b'\x01') * 1
result = RawBlocks.block[block_number]
# RawBlocks.block[block_number] = RSM_LOCKED
RawBlocks.block[block_number] = bytearray(RSM_LOCKED.ljust(BLOCK_SIZE,b'\x01'))
RawBlocks.Sleep()
return result
server.register_function(RSM)
# Run the server's main loop
print ("Running block server with nb=" + str(TOTAL_NUM_BLOCKS) + ", bs=" + str(BLOCK_SIZE) + " on port " + str(PORT))
server.serve_forever()