def __init__(self): self.devices = [] self.mapping_table = {} self.stripe_buffer = [] self.semi_stripe_table = {} self.binded_stripe_table = {} self.ppc = [] for i in range(5): self.devices.append( data_structure.Device(i, self.mapping_table, self.devices, self.semi_stripe_table, self.binded_stripe_table, self.ppc, self.max_ppc_size, self.result))
def replace_device(self): # Write file f = open('write count.txt', 'a') counts = str(self.result[0]) for i in range(5): counts = counts + ', ' + str(self.devices[i].write_count) f.write(counts) f.close() f = open('parity count.txt', 'a') counts = str(self.result[1]) for i in range(5): counts = counts + ', ' + str(self.devices[i].parity_count) f.write(counts) f.close() f = open('erase count.txt', 'a') counts = str(self.result[2]) for i in range(5): counts = counts + ', ' + str(self.devices[i].erase_count) f.write(counts) f.close() temp_mapping_table = {} temp_device = data_structure.Device(device_number=self.replacement, mapping_table=temp_mapping_table) temp_parity = [] # [index, physical address] num_migrate_page = math.ceil(len(self.semi_stripe_table) * 90 / 100) dst = 0 if self.replacement == 4: dst = 0 else: dst = self.replacement + 1 # Migrate 90% parity for i in range(len(self.semi_stripe_table)): if num_migrate_page == 0: break check_physical_addr = self.semi_stripe_table[i][self.replacement] if self.devices[self.replacement].is_parity_page(check_physical_addr) == True: if self.semi_stripe_table[i][dst] == self.binded_stripe_table[i][dst]: old_device, old_block, old_page = self.physical_to_reallocation(self.semi_stripe_table[i][dst]) new_physical_addr = temp_device.migrate(self.devices[old_device].get_state(old_block, old_page), self.devices[old_device].get_logical_addr(old_block, old_page), i) self.devices[old_device].physical_space[old_block][old_page][0] = 2 temp_parity.append([i, self.semi_stripe_table[i][self.replacement]]) self.semi_stripe_table[i][self.replacement] = new_physical_addr self.binded_stripe_table[i][self.replacement] = new_physical_addr else: # migrate semi old_device, old_block, old_page = self.physical_to_reallocation(self.semi_stripe_table[i][dst]) new_physical_addr = temp_device.migrate(self.devices[old_device].get_state(old_block, old_page), self.devices[old_device].get_logical_addr(old_block, old_page), i) self.devices[old_device].physical_space[old_block][old_page][0] = 2 temp_parity.append([i, self.semi_stripe_table[i][self.replacement]]) self.semi_stripe_table[i][self.replacement] = new_physical_addr # migrate binded old_device, old_block, old_page = self.physical_to_reallocation(self.binded_stripe_table[i][dst]) new_physical_addr = temp_device.migrate(self.devices[old_device].get_state(old_block, old_page), self.devices[old_device].get_logical_addr(old_block, old_page), i) self.devices[old_device].physical_space[old_block][old_page][0] = 2 self.binded_stripe_table[i][self.replacement] = new_physical_addr num_migrate_page -= 1 # Migrate 90% data for lst in temp_parity: if self.devices[dst].is_free() == True: phy_addr = self.devices[dst].new_parity(lst[0]) old_device, old_block, old_page = self.physical_to_reallocation(lst[1]) self.devices[old_device].physical_space[old_block][old_page][0] = 2 self.semi_stripe_table[lst[0]][dst] = phy_addr self.binded_stripe_table[lst[0]][dst] = phy_addr if lst[1] in self.ppc: ppc_index = self.ppc.index(lst[1]) self.ppc[ppc_index] = phy_addr else: print('Too much valid data') exit() #Migrate rest of pages for i in range(self.num_block): for j in range(self.num_page): old_data = self.devices[self.replacement].physical_space[i][j] if old_data[0] == 1: physical_addr = temp_device.migrate(old_data[0], old_data[1], old_data[2]) self.binded_stripe_table[old_data[2]][self.replacement] = physical_addr elif old_data[0] == 3: physical_addr = temp_device.migrate(old_data[0], old_data[1], old_data[2]) old_physical_addr = (self.replacement * self.num_block * self.num_page) + (i * self.num_page) + j if old_physical_addr in self.ppc: ppc_index = self.ppc.index(old_physical_addr) self.ppc[ppc_index] = physical_addr self.semi_stripe_table[old_data[2]][self.replacement] = physical_addr self.binded_stripe_table[old_data[2]][self.replacement] = physical_addr elif old_data[0] == 4: physical_addr = temp_device.migrate(old_data[0], old_data[1], old_data[2]) self.semi_stripe_table[old_data[2]][self.replacement] = physical_addr self.binded_stripe_table[old_data[2]][self.replacement] = physical_addr elif old_data[0] == 5: physical_addr = temp_device.migrate(old_data[0], old_data[1], old_data[2]) self.semi_stripe_table[old_data[2]][self.replacement] = physical_addr #Merge mapping table for logical in temp_mapping_table: self.mapping_table[logical] = temp_mapping_table[logical] del self.devices[self.replacement] temp_device.devices = self.devices temp_device.mapping_table = self.mapping_table temp_device.semi_stripe_table = self.semi_stripe_table temp_device.binded_stripe_table = self.binded_stripe_table temp_device.ppc = self.ppc temp_device.max_ppc_size = self.max_ppc_size self.devices.insert(self.replacement, temp_device) if self.replacement == 4: self.replacement = 0 else: self.replacement += 1