예제 #1
0
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
예제 #2
0
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)
예제 #3
0
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)
예제 #4
0
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))
예제 #6
0
def get_data_block(block_number, delay_sec):
    return ''.join(client_stub.get_data_block(block_number, delay_sec))