···9797 # so we set the prev_tombstone? flag to cancel out the next entry
9898 do_seek_table(manifest, epoch, level, seek_key, key, true)
9999100100- {{^level, sk_key, sk_ver, _ep}, [{_key, value}]} ->
100100+ {{^level, sk_key, sk_ver, _ep} = key, [{_key, value}]} ->
101101 # This entry is visible and may contain `seek_key`
102102- {ek_key, ek_ver, lb_index, lb_checksum, _id} = value
102102+ {ek_key, ek_ver, _lb_index, _lb_checksum, _id} = value
103103104104 # This invariant is guaranteed because we are calling prev(seek_key + 1) to get here
105105 assert {sk_key, sk_ver} <= seek_key
106106 case seek_key < {ek_key, ek_ver} do
107107 true ->
108108 # If seek_key < end_key, this table contains `seek_key`
109109- table = {:table, lb_index, lb_checksum, {sk_key, sk_ver}, {ek_key, ek_ver}}
110110- {:ok, table}
109109+ {:ok, table_from_kv(key, value)}
111110112111 false ->
113112 # If seek_key >= end_key, that means there is a "hole" in the keyspace
···116115 end
117116118117 _ ->
118118+ # Hit the start of the level without finding a table
119119+ :error
120120+ end
121121+ end
122122+123123+ @spec next_table(t, non_neg_integer, non_neg_integer, tuple) :: {:ok, tuple} | :error
124124+ def next_table(manifest, epoch, level, {:table, _i, _ck, _start_key, _end_key, table_key} = _table) do
125125+ do_next_table(manifest, epoch, level, table_key)
126126+ end
127127+128128+ defp do_next_table(manifest, epoch, level, prev_key) do
129129+ case :ets.next_lookup(manifest, prev_key) do
130130+ {{^level, _k, _ver, ep} = key, _obj} when ep > epoch ->
131131+ # This entry is not visible at `epoch`
132132+ do_next_table(manifest, epoch, level, key)
133133+134134+ {{^level, sk_key, sk_ver, _ep} = key, [{_key, value}]} ->
135135+ case :ets.next_lookup(manifest, key) do
136136+ {{^level, ^sk_key, ^sk_ver, _ep} = next_key, [{_key, :tombstone}]} ->
137137+ # The entry was deleted, skip past the tombstone
138138+ do_next_table(manifest, epoch, level, next_key)
139139+140140+ _ ->
141141+ # The next entry is *not* a tombstone, so this entry is the next table visible at `epoch`
142142+ {:ok, table_from_kv(key, value)}
143143+ end
144144+145145+ _ ->
119146 # Hit the end of the level without finding a table
120147 :error
121148 end
149149+ end
150150+151151+ defp table_from_kv(manifest_key, manifest_value) do
152152+ {_level, sk_key, sk_ver, _epoch} = manifest_key
153153+ {ek_key, ek_ver, lb_index, lb_checksum, _id} = manifest_value
154154+155155+ {:table, lb_index, lb_checksum, {sk_key, sk_ver}, {ek_key, ek_ver}, manifest_key}
122156 end
123157124158 @spec list_overlapping_tables(t, non_neg_integer, non_neg_integer, {binary, non_neg_integer}, {binary, non_neg_integer}) :: [tuple]