Example #1
0
    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))
Example #2
0
    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