Skip to content

Commit

Permalink
Fix RHT.Len returns correct value
Browse files Browse the repository at this point in the history
  • Loading branch information
justiceHui committed Jan 5, 2024
1 parent 4ea4eae commit e38d78f
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 10 deletions.
17 changes: 11 additions & 6 deletions pkg/document/crdt/rht.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,13 +74,15 @@ func (n *RHTNode) RemovedAt() *time.Ticket {
// RHT is a hashtable with logical clock(Replicated hashtable).
// For more details about RHT: http://csl.skku.edu/papers/jpdc11.pdf
type RHT struct {
nodeMapByKey map[string]*RHTNode
nodeMapByKey map[string]*RHTNode
numberOfRemovedElement int
}

// NewRHT creates a new instance of RHT.
func NewRHT() *RHT {
return &RHT{
nodeMapByKey: make(map[string]*RHTNode),
nodeMapByKey: make(map[string]*RHTNode),
numberOfRemovedElement: 0,
}
}

Expand Down Expand Up @@ -115,9 +117,12 @@ func (rht *RHT) Set(k, v string, executedAt *time.Ticket) {

// Remove removes the Element of the given key.
func (rht *RHT) Remove(k string, executedAt *time.Ticket) string {
if node, ok := rht.nodeMapByKey[k]; ok && executedAt.After(node.removedAt) {
node.Remove(executedAt)
return node.val
if node, ok := rht.nodeMapByKey[k]; ok && (node.updatedAt == nil || executedAt.After(node.updatedAt)) {
if rht.Has(k) {
node.Remove(executedAt)
rht.numberOfRemovedElement++
return node.val
}
}

return ""
Expand Down Expand Up @@ -149,7 +154,7 @@ func (rht *RHT) Nodes() []*RHTNode {

// Len returns the number of elements.
func (rht *RHT) Len() int {
return len(rht.nodeMapByKey)
return len(rht.nodeMapByKey) - rht.numberOfRemovedElement
}

// DeepCopy copies itself deeply.
Expand Down
20 changes: 20 additions & 0 deletions pkg/document/crdt/rht_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,24 @@ func TestMarshal(t *testing.T) {
actual := rht.Marshal()
assert.Equal(t, expected, actual)
})

/*t.Run("make XML after remove element", func(t *testing.T) {
rht := NewRHT()
rht.Set("key1", "value1", nil)
rht.Set("key2", "value2", nil)
expected1 := `key1="value1" key2="value2"`
actual1 := rht.ToXML()
assert.Equal(t, expected1, actual1)
rht.Remove("key1", nil)
expected2 := `key2="value2"`
actual2 := rht.ToXML()
assert.Equal(t, expected2, actual2)
rht.Remove("key2", nil)
expected3 := ``
actual3 := rht.ToXML()
assert.Equal(t, expected3, actual3)
})*/
}
7 changes: 3 additions & 4 deletions test/integration/tree_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -753,8 +753,7 @@ func TestTree(t *testing.T) {
assert.Equal(t, `<root><p>ab</p><p italic="true">cd</p></root>`, d1.Root().GetTree("t").ToXML())

assert.NoError(t, d1.Update(func(root *json.Object, p *presence.Presence) error {
// NOTE(sejongk): 0, 4 -> 0,1 / 3,4
root.GetTree("t").RemoveStyle(0, 4, []string{"italic"})
root.GetTree("t").RemoveStyle(4, 8, []string{"italic"})
return nil
}))

Expand All @@ -765,8 +764,8 @@ func TestTree(t *testing.T) {
assert.Equal(t, `<root><p>ab</p><p>cd</p></root>`, d1.Root().GetTree("t").ToXML())
assert.Equal(t, `<root><p>ab</p><p>cd</p></root>`, d2.Root().GetTree("t").ToXML())

assert.Equal(t, `{"type":"root","children":[{"type":"p","children":[{"type":"text","value":"ab"}],"attributes":{}},{"type":"p","children":[{"type":"text","value":"cd"}],"attributes":{}}]}`, d1.Root().GetTree("t").Marshal())
assert.Equal(t, `{"type":"root","children":[{"type":"p","children":[{"type":"text","value":"ab"}],"attributes":{}},{"type":"p","children":[{"type":"text","value":"cd"}],"attributes":{}}]}`, d2.Root().GetTree("t").Marshal())
assert.Equal(t, `{"type":"root","children":[{"type":"p","children":[{"type":"text","value":"ab"}]},{"type":"p","children":[{"type":"text","value":"cd"}],"attributes":{}}]}`, d1.Root().GetTree("t").Marshal())
assert.Equal(t, `{"type":"root","children":[{"type":"p","children":[{"type":"text","value":"ab"}]},{"type":"p","children":[{"type":"text","value":"cd"}],"attributes":{}}]}`, d2.Root().GetTree("t").Marshal())
})

// Concurrent editing, overlapping range test
Expand Down

1 comment on commit e38d78f

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Go Benchmark

Benchmark suite Current: e38d78f Previous: 4ea4eae Ratio
BenchmarkDocument/constructor_test - ns/op 1340 ns/op 1336 ns/op 1.00
BenchmarkDocument/constructor_test - B/op 1208 B/op 1208 B/op 1
BenchmarkDocument/constructor_test - allocs/op 20 allocs/op 20 allocs/op 1
BenchmarkDocument/status_test - ns/op 784.7 ns/op 785.2 ns/op 1.00
BenchmarkDocument/status_test - B/op 1176 B/op 1176 B/op 1
BenchmarkDocument/status_test - allocs/op 18 allocs/op 18 allocs/op 1
BenchmarkDocument/equals_test - ns/op 7073 ns/op 7092 ns/op 1.00
BenchmarkDocument/equals_test - B/op 6913 B/op 6913 B/op 1
BenchmarkDocument/equals_test - allocs/op 120 allocs/op 120 allocs/op 1
BenchmarkDocument/nested_update_test - ns/op 18403 ns/op 16151 ns/op 1.14
BenchmarkDocument/nested_update_test - B/op 11963 B/op 11963 B/op 1
BenchmarkDocument/nested_update_test - allocs/op 254 allocs/op 254 allocs/op 1
BenchmarkDocument/delete_test - ns/op 21932 ns/op 21933 ns/op 1.00
BenchmarkDocument/delete_test - B/op 15187 B/op 15188 B/op 1.00
BenchmarkDocument/delete_test - allocs/op 333 allocs/op 333 allocs/op 1
BenchmarkDocument/object_test - ns/op 8330 ns/op 8361 ns/op 1.00
BenchmarkDocument/object_test - B/op 6721 B/op 6721 B/op 1
BenchmarkDocument/object_test - allocs/op 116 allocs/op 116 allocs/op 1
BenchmarkDocument/array_test - ns/op 28350 ns/op 32610 ns/op 0.87
BenchmarkDocument/array_test - B/op 11819 B/op 11819 B/op 1
BenchmarkDocument/array_test - allocs/op 270 allocs/op 270 allocs/op 1
BenchmarkDocument/text_test - ns/op 30311 ns/op 30219 ns/op 1.00
BenchmarkDocument/text_test - B/op 14884 B/op 14795 B/op 1.01
BenchmarkDocument/text_test - allocs/op 468 allocs/op 468 allocs/op 1
BenchmarkDocument/text_composition_test - ns/op 28775 ns/op 28748 ns/op 1.00
BenchmarkDocument/text_composition_test - B/op 18398 B/op 18278 B/op 1.01
BenchmarkDocument/text_composition_test - allocs/op 477 allocs/op 477 allocs/op 1
BenchmarkDocument/rich_text_test - ns/op 79534 ns/op 79589 ns/op 1.00
BenchmarkDocument/rich_text_test - B/op 38644 B/op 38540 B/op 1.00
BenchmarkDocument/rich_text_test - allocs/op 1147 allocs/op 1147 allocs/op 1
BenchmarkDocument/counter_test - ns/op 16542 ns/op 16595 ns/op 1.00
BenchmarkDocument/counter_test - B/op 10210 B/op 10210 B/op 1
BenchmarkDocument/counter_test - allocs/op 236 allocs/op 236 allocs/op 1
BenchmarkDocument/text_edit_gc_100 - ns/op 2885870 ns/op 2884438 ns/op 1.00
BenchmarkDocument/text_edit_gc_100 - B/op 1658667 B/op 1655268 B/op 1.00
BenchmarkDocument/text_edit_gc_100 - allocs/op 17093 allocs/op 17093 allocs/op 1
BenchmarkDocument/text_edit_gc_1000 - ns/op 227827415 ns/op 230271811 ns/op 0.99
BenchmarkDocument/text_edit_gc_1000 - B/op 144393961 B/op 144376180 B/op 1.00
BenchmarkDocument/text_edit_gc_1000 - allocs/op 200995 allocs/op 201058 allocs/op 1.00
BenchmarkDocument/text_split_gc_100 - ns/op 3384079 ns/op 3383745 ns/op 1.00
BenchmarkDocument/text_split_gc_100 - B/op 2317142 B/op 2314004 B/op 1.00
BenchmarkDocument/text_split_gc_100 - allocs/op 16196 allocs/op 16197 allocs/op 1.00
BenchmarkDocument/text_split_gc_1000 - ns/op 287391687 ns/op 288385837 ns/op 1.00
BenchmarkDocument/text_split_gc_1000 - B/op 228890512 B/op 228887600 B/op 1.00
BenchmarkDocument/text_split_gc_1000 - allocs/op 203806 allocs/op 203930 allocs/op 1.00
BenchmarkDocument/text_delete_all_10000 - ns/op 11225827 ns/op 11000897 ns/op 1.02
BenchmarkDocument/text_delete_all_10000 - B/op 5809849 B/op 5809330 B/op 1.00
BenchmarkDocument/text_delete_all_10000 - allocs/op 40672 allocs/op 40669 allocs/op 1.00
BenchmarkDocument/text_delete_all_100000 - ns/op 174068575 ns/op 182534409 ns/op 0.95
BenchmarkDocument/text_delete_all_100000 - B/op 81902453 B/op 81903677 B/op 1.00
BenchmarkDocument/text_delete_all_100000 - allocs/op 411628 allocs/op 411647 allocs/op 1.00
BenchmarkDocument/text_100 - ns/op 219968 ns/op 218449 ns/op 1.01
BenchmarkDocument/text_100 - B/op 120107 B/op 118483 B/op 1.01
BenchmarkDocument/text_100 - allocs/op 5080 allocs/op 5080 allocs/op 1
BenchmarkDocument/text_1000 - ns/op 2393314 ns/op 2374004 ns/op 1.01
BenchmarkDocument/text_1000 - B/op 1169094 B/op 1153070 B/op 1.01
BenchmarkDocument/text_1000 - allocs/op 50084 allocs/op 50084 allocs/op 1
BenchmarkDocument/array_1000 - ns/op 1207384 ns/op 1196526 ns/op 1.01
BenchmarkDocument/array_1000 - B/op 1091290 B/op 1091301 B/op 1.00
BenchmarkDocument/array_1000 - allocs/op 11826 allocs/op 11826 allocs/op 1
BenchmarkDocument/array_10000 - ns/op 12771093 ns/op 13416629 ns/op 0.95
BenchmarkDocument/array_10000 - B/op 9799888 B/op 9799640 B/op 1.00
BenchmarkDocument/array_10000 - allocs/op 120290 allocs/op 120291 allocs/op 1.00
BenchmarkDocument/array_gc_100 - ns/op 144684 ns/op 143463 ns/op 1.01
BenchmarkDocument/array_gc_100 - B/op 132489 B/op 132481 B/op 1.00
BenchmarkDocument/array_gc_100 - allocs/op 1248 allocs/op 1248 allocs/op 1
BenchmarkDocument/array_gc_1000 - ns/op 1379316 ns/op 1378307 ns/op 1.00
BenchmarkDocument/array_gc_1000 - B/op 1158879 B/op 1158986 B/op 1.00
BenchmarkDocument/array_gc_1000 - allocs/op 12864 allocs/op 12865 allocs/op 1.00
BenchmarkDocument/counter_1000 - ns/op 198993 ns/op 198075 ns/op 1.00
BenchmarkDocument/counter_1000 - B/op 192853 B/op 192851 B/op 1.00
BenchmarkDocument/counter_1000 - allocs/op 5765 allocs/op 5765 allocs/op 1
BenchmarkDocument/counter_10000 - ns/op 2154458 ns/op 2156556 ns/op 1.00
BenchmarkDocument/counter_10000 - B/op 2087782 B/op 2087769 B/op 1.00
BenchmarkDocument/counter_10000 - allocs/op 59772 allocs/op 59772 allocs/op 1
BenchmarkDocument/object_1000 - ns/op 1331952 ns/op 1317018 ns/op 1.01
BenchmarkDocument/object_1000 - B/op 1428040 B/op 1427906 B/op 1.00
BenchmarkDocument/object_1000 - allocs/op 9845 allocs/op 9845 allocs/op 1
BenchmarkDocument/object_10000 - ns/op 14696144 ns/op 14690867 ns/op 1.00
BenchmarkDocument/object_10000 - B/op 12166019 B/op 12166752 B/op 1.00
BenchmarkDocument/object_10000 - allocs/op 100559 allocs/op 100562 allocs/op 1.00
BenchmarkDocument/tree_100 - ns/op 1025533 ns/op 1009303 ns/op 1.02
BenchmarkDocument/tree_100 - B/op 943674 B/op 943675 B/op 1.00
BenchmarkDocument/tree_100 - allocs/op 6099 allocs/op 6099 allocs/op 1
BenchmarkDocument/tree_1000 - ns/op 73513629 ns/op 72072982 ns/op 1.02
BenchmarkDocument/tree_1000 - B/op 86460281 B/op 86459854 B/op 1.00
BenchmarkDocument/tree_1000 - allocs/op 60113 allocs/op 60114 allocs/op 1.00
BenchmarkDocument/tree_10000 - ns/op 9256145567 ns/op 9443141797 ns/op 0.98
BenchmarkDocument/tree_10000 - B/op 8580654072 B/op 8580991992 B/op 1.00
BenchmarkDocument/tree_10000 - allocs/op 600221 allocs/op 600248 allocs/op 1.00
BenchmarkDocument/tree_delete_all_1000 - ns/op 74100262 ns/op 71663719 ns/op 1.03
BenchmarkDocument/tree_delete_all_1000 - B/op 86990567 B/op 86990239 B/op 1.00
BenchmarkDocument/tree_delete_all_1000 - allocs/op 67754 allocs/op 67749 allocs/op 1.00
BenchmarkDocument/tree_edit_gc_100 - ns/op 3645948 ns/op 3632525 ns/op 1.00
BenchmarkDocument/tree_edit_gc_100 - B/op 4121002 B/op 4121046 B/op 1.00
BenchmarkDocument/tree_edit_gc_100 - allocs/op 14356 allocs/op 14356 allocs/op 1
BenchmarkDocument/tree_edit_gc_1000 - ns/op 298424992 ns/op 295614209 ns/op 1.01
BenchmarkDocument/tree_edit_gc_1000 - B/op 383466678 B/op 383467646 B/op 1.00
BenchmarkDocument/tree_edit_gc_1000 - allocs/op 145410 allocs/op 145413 allocs/op 1.00
BenchmarkDocument/tree_split_gc_100 - ns/op 2454518 ns/op 2433512 ns/op 1.01
BenchmarkDocument/tree_split_gc_100 - B/op 2386805 B/op 2386869 B/op 1.00
BenchmarkDocument/tree_split_gc_100 - allocs/op 10340 allocs/op 10341 allocs/op 1.00
BenchmarkDocument/tree_split_gc_1000 - ns/op 182560508 ns/op 183611128 ns/op 0.99
BenchmarkDocument/tree_split_gc_1000 - B/op 221991190 B/op 221991942 B/op 1.00
BenchmarkDocument/tree_split_gc_1000 - allocs/op 112252 allocs/op 112259 allocs/op 1.00
BenchmarkRPC/client_to_server - ns/op 359251395 ns/op 355717978 ns/op 1.01
BenchmarkRPC/client_to_server - B/op 18896741 B/op 17228981 B/op 1.10
BenchmarkRPC/client_to_server - allocs/op 166938 allocs/op 166831 allocs/op 1.00
BenchmarkRPC/client_to_client_via_server - ns/op 611712949 ns/op 606482578 ns/op 1.01
BenchmarkRPC/client_to_client_via_server - B/op 31594072 B/op 32116544 B/op 0.98
BenchmarkRPC/client_to_client_via_server - allocs/op 311891 allocs/op 312901 allocs/op 1.00
BenchmarkRPC/attach_large_document - ns/op 1301328430 ns/op 1170164855 ns/op 1.11
BenchmarkRPC/attach_large_document - B/op 1879538232 B/op 1888403296 B/op 1.00
BenchmarkRPC/attach_large_document - allocs/op 7547 allocs/op 7527 allocs/op 1.00
BenchmarkRPC/adminCli_to_server - ns/op 537915744 ns/op 542495623 ns/op 0.99
BenchmarkRPC/adminCli_to_server - B/op 36806156 B/op 36802124 B/op 1.00
BenchmarkRPC/adminCli_to_server - allocs/op 289707 allocs/op 289677 allocs/op 1.00
BenchmarkLocker - ns/op 64.23 ns/op 65.96 ns/op 0.97
BenchmarkLocker - B/op 16 B/op 16 B/op 1
BenchmarkLocker - allocs/op 1 allocs/op 1 allocs/op 1
BenchmarkLockerParallel - ns/op 38.34 ns/op 38.94 ns/op 0.98
BenchmarkLockerParallel - B/op 0 B/op 0 B/op NaN
BenchmarkLockerParallel - allocs/op 0 allocs/op 0 allocs/op NaN
BenchmarkLockerMoreKeys - ns/op 139.7 ns/op 141.9 ns/op 0.98
BenchmarkLockerMoreKeys - B/op 15 B/op 15 B/op 1
BenchmarkLockerMoreKeys - allocs/op 0 allocs/op 0 allocs/op NaN
BenchmarkChange/Push_10_Changes - ns/op 3855351 ns/op 3782260 ns/op 1.02
BenchmarkChange/Push_10_Changes - B/op 125946 B/op 125995 B/op 1.00
BenchmarkChange/Push_10_Changes - allocs/op 1254 allocs/op 1253 allocs/op 1.00
BenchmarkChange/Push_100_Changes - ns/op 14157809 ns/op 14268879 ns/op 0.99
BenchmarkChange/Push_100_Changes - B/op 645435 B/op 639349 B/op 1.01
BenchmarkChange/Push_100_Changes - allocs/op 6539 allocs/op 6540 allocs/op 1.00
BenchmarkChange/Push_1000_Changes - ns/op 113716693 ns/op 114005417 ns/op 1.00
BenchmarkChange/Push_1000_Changes - B/op 6115711 B/op 6146349 B/op 1.00
BenchmarkChange/Push_1000_Changes - allocs/op 62161 allocs/op 62158 allocs/op 1.00
BenchmarkChange/Pull_10_Changes - ns/op 2967299 ns/op 2883610 ns/op 1.03
BenchmarkChange/Pull_10_Changes - B/op 100496 B/op 100810 B/op 1.00
BenchmarkChange/Pull_10_Changes - allocs/op 952 allocs/op 952 allocs/op 1
BenchmarkChange/Pull_100_Changes - ns/op 4579962 ns/op 4323201 ns/op 1.06
BenchmarkChange/Pull_100_Changes - B/op 257184 B/op 258124 B/op 1.00
BenchmarkChange/Pull_100_Changes - allocs/op 3153 allocs/op 3153 allocs/op 1
BenchmarkChange/Pull_1000_Changes - ns/op 8582893 ns/op 8208312 ns/op 1.05
BenchmarkChange/Pull_1000_Changes - B/op 1397372 B/op 1395853 B/op 1.00
BenchmarkChange/Pull_1000_Changes - allocs/op 26859 allocs/op 26874 allocs/op 1.00
BenchmarkSnapshot/Push_3KB_snapshot - ns/op 17027679 ns/op 16781594 ns/op 1.01
BenchmarkSnapshot/Push_3KB_snapshot - B/op 806532 B/op 806918 B/op 1.00
BenchmarkSnapshot/Push_3KB_snapshot - allocs/op 6542 allocs/op 6543 allocs/op 1.00
BenchmarkSnapshot/Push_30KB_snapshot - ns/op 119525108 ns/op 117538584 ns/op 1.02
BenchmarkSnapshot/Push_30KB_snapshot - B/op 6390307 B/op 6293910 B/op 1.02
BenchmarkSnapshot/Push_30KB_snapshot - allocs/op 62415 allocs/op 62159 allocs/op 1.00
BenchmarkSnapshot/Pull_3KB_snapshot - ns/op 6589250 ns/op 6555276 ns/op 1.01
BenchmarkSnapshot/Pull_3KB_snapshot - B/op 900879 B/op 905327 B/op 1.00
BenchmarkSnapshot/Pull_3KB_snapshot - allocs/op 14860 allocs/op 14879 allocs/op 1.00
BenchmarkSnapshot/Pull_30KB_snapshot - ns/op 15444521 ns/op 14921599 ns/op 1.04
BenchmarkSnapshot/Pull_30KB_snapshot - B/op 6981906 B/op 6982547 B/op 1.00
BenchmarkSnapshot/Pull_30KB_snapshot - allocs/op 144136 allocs/op 144138 allocs/op 1.00
BenchmarkSync/memory_sync_10_test - ns/op 7627 ns/op 6869 ns/op 1.11
BenchmarkSync/memory_sync_10_test - B/op 1287 B/op 1286 B/op 1.00
BenchmarkSync/memory_sync_10_test - allocs/op 38 allocs/op 38 allocs/op 1
BenchmarkSync/memory_sync_100_test - ns/op 61312 ns/op 51839 ns/op 1.18
BenchmarkSync/memory_sync_100_test - B/op 8748 B/op 8646 B/op 1.01
BenchmarkSync/memory_sync_100_test - allocs/op 279 allocs/op 273 allocs/op 1.02
BenchmarkSync/memory_sync_1000_test - ns/op 645283 ns/op 597671 ns/op 1.08
BenchmarkSync/memory_sync_1000_test - B/op 75008 B/op 74301 B/op 1.01
BenchmarkSync/memory_sync_1000_test - allocs/op 2147 allocs/op 2106 allocs/op 1.02
BenchmarkSync/memory_sync_10000_test - ns/op 8551181 ns/op 7337210 ns/op 1.17
BenchmarkSync/memory_sync_10000_test - B/op 758725 B/op 759441 B/op 1.00
BenchmarkSync/memory_sync_10000_test - allocs/op 20582 allocs/op 20499 allocs/op 1.00
BenchmarkTextEditing - ns/op 18942489808 ns/op 18812245791 ns/op 1.01
BenchmarkTextEditing - B/op 9042371312 B/op 9038099880 B/op 1.00
BenchmarkTextEditing - allocs/op 19924507 allocs/op 19923868 allocs/op 1.00

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.