this repo has no description
2
fork

Configure Feed

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

Find the next table at epoch

garrison 3d9515ac ba832a38

+40 -5
+38 -4
lib/xks/manifest.ex
··· 97 97 # so we set the prev_tombstone? flag to cancel out the next entry 98 98 do_seek_table(manifest, epoch, level, seek_key, key, true) 99 99 100 - {{^level, sk_key, sk_ver, _ep}, [{_key, value}]} -> 100 + {{^level, sk_key, sk_ver, _ep} = key, [{_key, value}]} -> 101 101 # This entry is visible and may contain `seek_key` 102 - {ek_key, ek_ver, lb_index, lb_checksum, _id} = value 102 + {ek_key, ek_ver, _lb_index, _lb_checksum, _id} = value 103 103 104 104 # This invariant is guaranteed because we are calling prev(seek_key + 1) to get here 105 105 assert {sk_key, sk_ver} <= seek_key 106 106 case seek_key < {ek_key, ek_ver} do 107 107 true -> 108 108 # If seek_key < end_key, this table contains `seek_key` 109 - table = {:table, lb_index, lb_checksum, {sk_key, sk_ver}, {ek_key, ek_ver}} 110 - {:ok, table} 109 + {:ok, table_from_kv(key, value)} 111 110 112 111 false -> 113 112 # If seek_key >= end_key, that means there is a "hole" in the keyspace ··· 116 115 end 117 116 118 117 _ -> 118 + # Hit the start of the level without finding a table 119 + :error 120 + end 121 + end 122 + 123 + @spec next_table(t, non_neg_integer, non_neg_integer, tuple) :: {:ok, tuple} | :error 124 + def next_table(manifest, epoch, level, {:table, _i, _ck, _start_key, _end_key, table_key} = _table) do 125 + do_next_table(manifest, epoch, level, table_key) 126 + end 127 + 128 + defp do_next_table(manifest, epoch, level, prev_key) do 129 + case :ets.next_lookup(manifest, prev_key) do 130 + {{^level, _k, _ver, ep} = key, _obj} when ep > epoch -> 131 + # This entry is not visible at `epoch` 132 + do_next_table(manifest, epoch, level, key) 133 + 134 + {{^level, sk_key, sk_ver, _ep} = key, [{_key, value}]} -> 135 + case :ets.next_lookup(manifest, key) do 136 + {{^level, ^sk_key, ^sk_ver, _ep} = next_key, [{_key, :tombstone}]} -> 137 + # The entry was deleted, skip past the tombstone 138 + do_next_table(manifest, epoch, level, next_key) 139 + 140 + _ -> 141 + # The next entry is *not* a tombstone, so this entry is the next table visible at `epoch` 142 + {:ok, table_from_kv(key, value)} 143 + end 144 + 145 + _ -> 119 146 # Hit the end of the level without finding a table 120 147 :error 121 148 end 149 + end 150 + 151 + defp table_from_kv(manifest_key, manifest_value) do 152 + {_level, sk_key, sk_ver, _epoch} = manifest_key 153 + {ek_key, ek_ver, lb_index, lb_checksum, _id} = manifest_value 154 + 155 + {:table, lb_index, lb_checksum, {sk_key, sk_ver}, {ek_key, ek_ver}, manifest_key} 122 156 end 123 157 124 158 @spec list_overlapping_tables(t, non_neg_integer, non_neg_integer, {binary, non_neg_integer}, {binary, non_neg_integer}) :: [tuple]
+2 -1
lib/xks/xks.ex
··· 64 64 epoch = :atomics.get(xks.epoch_atomic, 1) 65 65 66 66 Manifest.seek_table(manifest, epoch, 1, key, version) 67 - |> dbg() 67 + #|> dbg() 68 + #|> tap(fn result -> is_tuple(result) && dbg(Manifest.next_table(manifest, epoch, 1, elem(result, 1))) end) 68 69 69 70 Manifest.list_memtables(xks.manifest, epoch) 70 71 |> Enum.find_value(:error, fn {_id, memtable} ->