this repo has no description
2
fork

Configure Feed

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

Clear old versions from RangeForest after flush

+42 -2
+36 -2
lib/range_forest.ex
··· 78 78 end 79 79 end 80 80 81 + @spec clear_up_to(RangeTree.t, non_neg_integer) :: RangeTree.t 82 + def clear_up_to(tree, ceil_version) do 83 + iterator = :gb_trees.iterator(tree) 84 + do_clear_up_to(iterator, tree, ceil_version) 85 + end 86 + 87 + defp do_clear_up_to(iterator, tree, ceil_version) do 88 + case :gb_trees.next(iterator) do 89 + {sk, {_ek, v}, iterator} -> 90 + case v <= ceil_version do 91 + true -> 92 + do_clear_up_to(iterator, :gb_trees.delete(sk, tree), ceil_version) 93 + false -> 94 + do_clear_up_to(iterator, tree, ceil_version) 95 + end 96 + :none -> 97 + tree 98 + end 99 + end 100 + 81 101 @spec split_at(RangeTree.t, non_neg_integer, binary) :: {:updated, RangeTree.t} | :noop 82 102 def split_at(tree, version, key) do 83 103 next = key <> "\x00" ··· 204 224 {nil, forest} -> 205 225 {[], forest} 206 226 207 - {last_tree, forest} -> 227 + {tree_at_version, forest} -> 228 + forest = 229 + case :gb_trees.is_empty(forest) do 230 + false -> 231 + {latest_version, latest_tree} = :gb_trees.largest(forest) 232 + # Clear out the flushed versions from the latest copy of the tree 233 + # Note that trees in the range [version, latest_version) will still 234 + # contain these versions, but we ignore them during reads with 235 + # the `min_version` argument in RangeTree 236 + latest_tree = RangeTree.clear_up_to(latest_tree, version) 237 + :gb_trees.update(latest_version, latest_tree, forest) 238 + true -> 239 + forest 240 + end 241 + 208 242 # TODO: clear these ranges from the newest tree 209 243 # TODO: should end_key be four \xFFs to include special space? 210 - ranges = RangeTree.intersect_range(last_tree, min_version, "", "\xFF\xFF") 244 + ranges = RangeTree.intersect_range(tree_at_version, min_version, "", "\xFF\xFF") 211 245 {ranges, forest} 212 246 end 213 247 end
+6
test/range_forest_test.exs
··· 193 193 194 194 assert {ranges1, rf1} = RangeForest.flush(rf, 1, 0) 195 195 196 + assert [{3, _}] = RangeForest.dump(rf1) 197 + assert RangeForest.tree_at(rf1, 3) |> RangeTree.dump() == [ 198 + {"foo_b", "foo_c", 3}, 199 + {"foo_c\x00", "foo_f", 3}, 200 + ] 201 + 196 202 assert ranges1 == [ 197 203 {"foo_a", "foo_d", 1}, 198 204 {"foo_e", "foo_g", 1},