this repo has no description
2
fork

Configure Feed

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

Fix superblock overwriting data blocks with smaller block sizes

garrison e04f24c6 1b002bcb

+16 -3
+14 -1
lib/xks/free_list.ex
··· 16 16 17 17 @spec new(keyword) :: t 18 18 def new(opts) do 19 + block_size = Keyword.fetch!(opts, :block_size) 20 + # TODO: constant or configurable? 21 + superblock_copies = 4 22 + # This is the number of blocks reserved up-front to hold the superblock copies 23 + # These blocks will never be reserved and therefore never freed 24 + superblock_reserved_blocks = ceil((c_superblock_size() * superblock_copies) / block_size) 25 + assert superblock_reserved_blocks >= 1 26 + 19 27 extent_block_count = Keyword.fetch!(opts, :extent_block_count) 20 28 assert is_integer(extent_block_count) 21 29 assert extent_block_count >= 1 22 30 23 31 table = :ets.new(__MODULE__, [:ordered_set, :public]) 24 - :ets.insert(table, {:max_block, 0}) 32 + 33 + # Set max_block to ensure that superblock space is never reserved 34 + # -1 here because the first block allocated will be (max_block + 1) 35 + max_block = superblock_reserved_blocks - 1 36 + assert max_block >= 0 37 + :ets.insert(table, {:max_block, max_block}) 25 38 :ets.insert(table, {:extent_block_count, extent_block_count}) 26 39 27 40 table
+2 -2
lib/xks/xks.ex
··· 107 107 opts: opts, 108 108 109 109 block_store: block_store, 110 - free_list: FreeList.new(extent_block_count: opts.extent_block_count), 110 + free_list: FreeList.new(block_size: opts.block_size, extent_block_count: opts.extent_block_count), 111 111 manifest: Manifest.new(), 112 112 manifest_log: ManifestLog.new(), 113 113 work_queue: WorkQueue.new(), ··· 166 166 opts: opts, 167 167 168 168 block_store: block_store, 169 - free_list: FreeList.new(extent_block_count: opts.extent_block_count), 169 + free_list: FreeList.new(block_size: opts.block_size, extent_block_count: opts.extent_block_count), 170 170 manifest: Manifest.new(), 171 171 manifest_log: ManifestLog.new(), 172 172 work_queue: WorkQueue.new(),