···16161717 @spec new(keyword) :: t
1818 def new(opts) do
1919+ block_size = Keyword.fetch!(opts, :block_size)
2020+ # TODO: constant or configurable?
2121+ superblock_copies = 4
2222+ # This is the number of blocks reserved up-front to hold the superblock copies
2323+ # These blocks will never be reserved and therefore never freed
2424+ superblock_reserved_blocks = ceil((c_superblock_size() * superblock_copies) / block_size)
2525+ assert superblock_reserved_blocks >= 1
2626+1927 extent_block_count = Keyword.fetch!(opts, :extent_block_count)
2028 assert is_integer(extent_block_count)
2129 assert extent_block_count >= 1
22302331 table = :ets.new(__MODULE__, [:ordered_set, :public])
2424- :ets.insert(table, {:max_block, 0})
3232+3333+ # Set max_block to ensure that superblock space is never reserved
3434+ # -1 here because the first block allocated will be (max_block + 1)
3535+ max_block = superblock_reserved_blocks - 1
3636+ assert max_block >= 0
3737+ :ets.insert(table, {:max_block, max_block})
2538 :ets.insert(table, {:extent_block_count, extent_block_count})
26392740 table