def get_data_block(virtual_block_number): server_number, block_number = block_number_translate( virtual_block_number) #where the data is actually located print("Data is in Server Number ", 8000 + server_number) a = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' test = '\0' for i in server_failure: #checking if a server has failed if i != 0: test = i if server_number == test: #if yes, if you want to read from server then get the data from all the servers and XOR them all for servers in range(num_servers): if servers != server_number: b, state = client_stub.get_data_block(block_number, servers) b = ''.join(b) parity_data = ''.join( chr(ord(a) ^ ord(b)) for a, b in zip(a, b)) a = parity_data return a #return data else: b, state = client_stub.get_data_block(block_number, server_number) if state is False: for servers in range(num_servers): if servers != server_number: b, state = client_stub.get_data_block( block_number, servers) b = ''.join(b) parity_data = ''.join( chr(ord(a) ^ ord(b)) for a, b in zip(a, b)) a = parity_data return a else: return b
def free_data_block(vir_block_number): if vir_block_number != -1: server_number, block_number = block_number_translate(vir_block_number) global mapping mapping[block_number - initial_blk_number][server_number] = 0 #print(mapping) block_data, state = client_stub.get_data_block(block_number, server_number) for j in range( num_servers ): #finding the server number on which parity is located if mapping[block_number][j] == 'P': # xor(j,block_data,block_number) old_data, state = client_stub.get_data_block(block_number, j) a = old_data b = block_data data = ''.join(chr(ord(a) ^ ord(b)) for a, b in zip(a, b)) client_stub.update_data_block(block_number, data, j) client_stub.free_data_block(server_number, block_number)
def xor(server_number, new_data, block_number): print "Writing to Parity Block" old_data, state = client_stub.get_data_block( block_number, server_number) #getting old parity if state is False: #when the parity resides on a server that is corrupted, then XOR data from all the other servers and get the parity for servers in range(num_servers): if servers != server_number: a = old_data b = new_data b, state = client_stub.get_data_block(block_number, servers) b = ''.join(b) parity_data = ''.join( chr(ord(a) ^ ord(b)) for a, b in zip(a, b)) a = parity_data else: a = old_data b = new_data data = ''.join( chr(ord(a) ^ ord(b)) for a, b in zip(a, b)) #XORing the old parity with new data check_parity(block_number, server_number) client_stub.update_data_block( block_number, data, server_number ) #writing the new parity (while writing the data block)
def get_data_block(block_number): return ''.join(client_stub.get_data_block(block_number))
def get_data_block(block_number): if (RAID_5.has_been_called == True): return ''.join(client_stub.get_data_block(block_number)) if (RAID_1.has_been_called == True): return ''.join(client_stub_RAID1.get_data_block(block_number))
def get_data_block(block_number, delay_sec): return ''.join(client_stub.get_data_block(block_number, delay_sec))