this repo has no description
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

Fix compaction leaking unused blocks

garrison 6d4d0195 46d577b9

+9 -3
+4 -1
lib/xks/compaction.ex
··· 74 74 @type t :: %__MODULE__{ 75 75 last_block_address: {non_neg_integer, Blocks.checksum}, 76 76 block_addresses: [{non_neg_integer, Blocks.checksum}], 77 + left_over_block_indexes: [non_neg_integer], 77 78 first_key: binary, 78 79 last_key: binary, 79 80 } 80 81 @enforce_keys [ 81 82 :last_block_address, 82 83 :block_addresses, 84 + :left_over_block_indexes, 83 85 :first_key, 84 86 :last_key, 85 87 ] ··· 143 145 144 146 {data_blocks_reversed, subtable_iterator} = do_compact_table(xks, subtable_iterator, block_offsets, [], 0) 145 147 data_blocks = Enum.reverse(data_blocks_reversed) 146 - # TODO: unused data block indexes are never freed 148 + {_, left_over_block_indexes} = Enum.split(block_offsets, length(data_blocks)) 147 149 148 150 %DataBlockMetadata{first_key: {fk_key, _fk_ver}} = hd(data_blocks) 149 151 %DataBlockMetadata{last_key: {lk_key, _lk_ver}} = hd(data_blocks_reversed) ··· 183 185 table = %OutputTable{ 184 186 last_block_address: last_trailer_block_address, 185 187 block_addresses: all_block_addresses, 188 + left_over_block_indexes: left_over_block_indexes, 186 189 first_key: table_first_key, 187 190 last_key: table_last_key, 188 191 }
+5 -2
lib/xks/xks.ex
··· 782 782 end) 783 783 784 784 Enum.each(output_tables, fn 785 - %Compaction.OutputTable{last_block_address: last_block_address, block_addresses: block_addresses, first_key: first_key, last_key: last_key} -> 785 + %Compaction.OutputTable{last_block_address: last_block_address, block_addresses: block_addresses, left_over_block_indexes: left_over_block_indexes, first_key: first_key, last_key: last_key} -> 786 786 # Mark table blocks (which may have been reserved concurrently with commits) as acquired 787 787 block_indexes = Enum.map(block_addresses, fn {bi, _checksum} -> bi end) 788 - FreeList.acquire_blocks(free_list, block_indexes) 788 + :ok = FreeList.acquire_blocks(free_list, block_indexes) 789 + 790 + :ok = FreeList.acquire_blocks(free_list, left_over_block_indexes) 791 + Enum.each(left_over_block_indexes, &FreeList.release_block(free_list, &1)) 789 792 790 793 # Insert table 791 794 table_info = %Manifest.TableInfo{