this repo has no description
2
fork

Configure Feed

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

Support point clears in BTree

garrison cebd1157 4be97387

+32 -23
+5 -1
lib/btree/fuzz/model_fuzz.ex
··· 152 152 {start_key, end_key} = make_range(opt_key_bits) 153 153 reverse? = Enum.random([true, false]) 154 154 limit = random_limit() 155 + #{start_key, end_key, limit, reverse?} = {"", "\xFF\xFF\xFF\xFF", :infinity, true} 155 156 #dbg SimpleKV.dump(simple_kv, read_version), limit: :infinity 156 157 #dbg {start_key, end_key, reverse?, limit} 157 158 ··· 185 186 end 186 187 187 188 defp make_mutation(opt_key_bits) do 188 - case Enum.random(1..1) do 189 + case Enum.random(1..2) do 189 190 1 -> 190 191 key = make_key(opt_key_bits) 191 192 value = String.duplicate(String.reverse(key), 2) 192 193 {:write, key, value} 194 + 2 -> 195 + key = make_key(opt_key_bits) 196 + {:clear, key} 193 197 end 194 198 end 195 199
+26 -22
lib/btree/writer.ex
··· 20 20 defp do_apply_versioned_mutations([mut | rest], vtree, version) do 21 21 case mut do 22 22 {:write, key, value} -> :ets.insert(vtree, {[key | version], value}) 23 + {:clear, key} -> :ets.insert(vtree, {[key | version], :tombstone}) 23 24 end 24 25 do_apply_versioned_mutations(rest, vtree, version) 25 26 end ··· 61 62 {:write, key, value} -> 62 63 :ets.delete(versioned_tree, [key | version]) 63 64 :ets.insert(write_buffer, {key, value}) 65 + 66 + {:clear, key} -> 67 + :ets.delete(versioned_tree, [key | version]) 68 + :ets.insert(write_buffer, {key, :tombstone}) 64 69 end 65 70 do_apply_logged_mutations(mutations_rest, version, versioned_tree, write_buffer) 66 71 end ··· 390 395 leaf_key == :empty and buffer_key == :empty -> 391 396 {page_acc, Enum.reverse(offsets_acc), count_acc} 392 397 393 - buffer_key == :empty -> 398 + # leaf_key < buffer_key 399 + (buffer_key == :empty) or ((leaf_key != :empty) and (leaf_key < buffer_key)) -> 394 400 offset = byte_size(page_acc) 395 401 page_acc = append_pair(page_acc, leaf_key, leaf_value) 396 402 do_merge_pairs(leaf_next(leaf_it), buffer_it, page_acc, [offset | offsets_acc], count_acc + 1) 397 403 398 - leaf_key == :empty -> 399 - offset = byte_size(page_acc) 400 - page_acc = append_pair(page_acc, buffer_key, buffer_value) 401 - do_merge_pairs(leaf_it, buffer_next(buffer_it), page_acc, [offset | offsets_acc], count_acc + 1) 404 + # buffer_key <= leaf_key 405 + true -> 406 + assert buffer_key != :empty 407 + assert (leaf_key == :empty) or (buffer_key <= leaf_key) 402 408 403 - leaf_key < buffer_key -> 404 - offset = byte_size(page_acc) 405 - page_acc = append_pair(page_acc, leaf_key, leaf_value) 406 - do_merge_pairs(leaf_next(leaf_it), buffer_it, page_acc, [offset | offsets_acc], count_acc + 1) 409 + leaf_it = case buffer_key == leaf_key do 410 + # If the leaf key is being overwritten, we need to advance both iterators 411 + true -> leaf_next(leaf_it) 412 + false -> leaf_it 413 + end 407 414 408 - buffer_key < leaf_key -> 409 - offset = byte_size(page_acc) 410 - page_acc = append_pair(page_acc, buffer_key, buffer_value) 411 - do_merge_pairs(leaf_it, buffer_next(buffer_it), page_acc, [offset | offsets_acc], count_acc + 1) 415 + case buffer_value == :tombstone do 416 + true -> 417 + # This is a delete, write nothing 418 + do_merge_pairs(leaf_it, buffer_next(buffer_it), page_acc, offsets_acc, count_acc) 412 419 413 - true -> 414 - assert buffer_key != :empty 415 - assert leaf_key != :empty 416 - assert buffer_key == leaf_key 417 - 418 - # Keep the buffer pair but advance both iterators 419 - offset = byte_size(page_acc) 420 - page_acc = append_pair(page_acc, buffer_key, buffer_value) 421 - do_merge_pairs(leaf_next(leaf_it), buffer_next(buffer_it), page_acc, [offset | offsets_acc], count_acc + 1) 420 + false -> 421 + # Write the pair from the buffer 422 + offset = byte_size(page_acc) 423 + page_acc = append_pair(page_acc, buffer_key, buffer_value) 424 + do_merge_pairs(leaf_it, buffer_next(buffer_it), page_acc, [offset | offsets_acc], count_acc + 1) 425 + end 422 426 end 423 427 end 424 428
+1
test/btree_test.exs
··· 14 14 test "fuzz" do 15 15 Hobbes.BTree.Fuzz.ModelFuzz.run(100, [ 16 16 iterations: 400, 17 + #key_bits: 8, 17 18 key_bits: 32, 18 19 ]) 19 20 end