Skip to content

Commit

Permalink
Make RHTNode immutable
Browse files Browse the repository at this point in the history
  • Loading branch information
justiceHui committed Jan 9, 2024
1 parent 4426a41 commit 7d0134e
Showing 1 changed file with 10 additions and 22 deletions.
32 changes: 10 additions & 22 deletions pkg/document/crdt/rht.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,26 +32,15 @@ type RHTNode struct {
isRemoved bool
}

func newRHTNode(key, val string, updatedAt *time.Ticket) *RHTNode {
func newRHTNode(key, val string, updatedAt *time.Ticket, isRemoved bool) *RHTNode {
return &RHTNode{
key: key,
val: val,
updatedAt: updatedAt,
isRemoved: false,
isRemoved: isRemoved,
}
}

// Remove removes this node. It only marks the deleted time (tombstone).
func (n *RHTNode) Remove(removedAt *time.Ticket) {
n.updatedAt = removedAt
n.isRemoved = true
}

// IsRemoved returns the node has been removed.
func (n *RHTNode) IsRemoved() bool {
return n.isRemoved
}

// Key returns the key of this node.
func (n *RHTNode) Key() string {
return n.key
Expand Down Expand Up @@ -86,7 +75,7 @@ func NewRHT() *RHT {
// Get returns the value of the given key.
func (rht *RHT) Get(key string) string {
if node, ok := rht.nodeMapByKey[key]; ok {
if node.IsRemoved() {
if node.isRemoved {
return ""
}
return node.val
Expand All @@ -98,7 +87,7 @@ func (rht *RHT) Get(key string) string {
// Has returns whether the element exists of the given key or not.
func (rht *RHT) Has(key string) bool {
if node, ok := rht.nodeMapByKey[key]; ok {
return node != nil && !node.IsRemoved()
return node != nil && !node.isRemoved
}

return false
Expand All @@ -107,25 +96,24 @@ func (rht *RHT) Has(key string) bool {
// Set sets the value of the given key.
func (rht *RHT) Set(k, v string, executedAt *time.Ticket) {
if node, ok := rht.nodeMapByKey[k]; !ok || node.updatedAt == nil || executedAt.After(node.updatedAt) {
if node != nil && node.IsRemoved() {
if node != nil && node.isRemoved {
rht.numberOfRemovedElement--
}
newNode := newRHTNode(k, v, executedAt)
newNode := newRHTNode(k, v, executedAt, false)
rht.nodeMapByKey[k] = newNode
}
}

// 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 && (node.updatedAt == nil || executedAt.After(node.updatedAt)) {
alreadyRemoved := node.IsRemoved()
alreadyRemoved := node.isRemoved
if !alreadyRemoved {
rht.numberOfRemovedElement++
}
// node is removed if and only if updatedAt = removedAt
newNode := newRHTNode(k, node.val, executedAt)
newNode := newRHTNode(k, node.val, executedAt, true)
rht.nodeMapByKey[k] = newNode
newNode.Remove(executedAt)

if alreadyRemoved {
return ""
Expand All @@ -141,7 +129,7 @@ func (rht *RHT) Remove(k string, executedAt *time.Ticket) string {
func (rht *RHT) Elements() map[string]string {
members := make(map[string]string)
for _, node := range rht.nodeMapByKey {
if !node.IsRemoved() {
if !node.isRemoved {
members[node.key] = node.val
}
}
Expand All @@ -154,7 +142,7 @@ func (rht *RHT) Elements() map[string]string {
func (rht *RHT) Nodes() []*RHTNode {
var nodes []*RHTNode
for _, node := range rht.nodeMapByKey {
if !node.IsRemoved() {
if !node.isRemoved {
nodes = append(nodes, node)
}
}
Expand Down

1 comment on commit 7d0134e

@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: 7d0134e Previous: 50b3c50 Ratio
BenchmarkDocument/constructor_test - ns/op 1392 ns/op 1542 ns/op 0.90
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 779 ns/op 780 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 7111 ns/op 7138 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 18577 ns/op 16248 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 22031 ns/op 22078 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 8273 ns/op 8387 ns/op 0.99
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 28938 ns/op 28691 ns/op 1.01
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 30238 ns/op 31234 ns/op 0.97
BenchmarkDocument/text_test - B/op 14883 B/op 15412 B/op 0.97
BenchmarkDocument/text_test - allocs/op 468 allocs/op 479 allocs/op 0.98
BenchmarkDocument/text_composition_test - ns/op 28691 ns/op 28838 ns/op 0.99
BenchmarkDocument/text_composition_test - B/op 18398 B/op 18590 B/op 0.99
BenchmarkDocument/text_composition_test - allocs/op 477 allocs/op 481 allocs/op 0.99
BenchmarkDocument/rich_text_test - ns/op 80155 ns/op 84725 ns/op 0.95
BenchmarkDocument/rich_text_test - B/op 38645 B/op 47959 B/op 0.81
BenchmarkDocument/rich_text_test - allocs/op 1147 allocs/op 1216 allocs/op 0.94
BenchmarkDocument/counter_test - ns/op 16532 ns/op 16633 ns/op 0.99
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 2896293 ns/op 2896824 ns/op 1.00
BenchmarkDocument/text_edit_gc_100 - B/op 1658316 B/op 1658595 B/op 1.00
BenchmarkDocument/text_edit_gc_100 - allocs/op 17092 allocs/op 17092 allocs/op 1
BenchmarkDocument/text_edit_gc_1000 - ns/op 230023862 ns/op 232593749 ns/op 0.99
BenchmarkDocument/text_edit_gc_1000 - B/op 144381158 B/op 144379059 B/op 1.00
BenchmarkDocument/text_edit_gc_1000 - allocs/op 200932 allocs/op 200906 allocs/op 1.00
BenchmarkDocument/text_split_gc_100 - ns/op 3373153 ns/op 3420377 ns/op 0.99
BenchmarkDocument/text_split_gc_100 - B/op 2316687 B/op 2316994 B/op 1.00
BenchmarkDocument/text_split_gc_100 - allocs/op 16193 allocs/op 16196 allocs/op 1.00
BenchmarkDocument/text_split_gc_1000 - ns/op 288999620 ns/op 291333302 ns/op 0.99
BenchmarkDocument/text_split_gc_1000 - B/op 228928940 B/op 228919328 B/op 1.00
BenchmarkDocument/text_split_gc_1000 - allocs/op 203983 allocs/op 203934 allocs/op 1.00
BenchmarkDocument/text_delete_all_10000 - ns/op 10704970 ns/op 11818492 ns/op 0.91
BenchmarkDocument/text_delete_all_10000 - B/op 5810647 B/op 5810678 B/op 1.00
BenchmarkDocument/text_delete_all_10000 - allocs/op 40675 allocs/op 40675 allocs/op 1
BenchmarkDocument/text_delete_all_100000 - ns/op 189392216 ns/op 201368223 ns/op 0.94
BenchmarkDocument/text_delete_all_100000 - B/op 81906458 B/op 81900570 B/op 1.00
BenchmarkDocument/text_delete_all_100000 - allocs/op 411641 allocs/op 411626 allocs/op 1.00
BenchmarkDocument/text_100 - ns/op 221358 ns/op 220270 ns/op 1.00
BenchmarkDocument/text_100 - B/op 120107 B/op 120107 B/op 1
BenchmarkDocument/text_100 - allocs/op 5080 allocs/op 5080 allocs/op 1
BenchmarkDocument/text_1000 - ns/op 2412676 ns/op 2429840 ns/op 0.99
BenchmarkDocument/text_1000 - B/op 1169094 B/op 1169078 B/op 1.00
BenchmarkDocument/text_1000 - allocs/op 50084 allocs/op 50084 allocs/op 1
BenchmarkDocument/array_1000 - ns/op 1183430 ns/op 1191138 ns/op 0.99
BenchmarkDocument/array_1000 - B/op 1091319 B/op 1091341 B/op 1.00
BenchmarkDocument/array_1000 - allocs/op 11826 allocs/op 11826 allocs/op 1
BenchmarkDocument/array_10000 - ns/op 13264308 ns/op 13214012 ns/op 1.00
BenchmarkDocument/array_10000 - B/op 9799662 B/op 9800667 B/op 1.00
BenchmarkDocument/array_10000 - allocs/op 120290 allocs/op 120294 allocs/op 1.00
BenchmarkDocument/array_gc_100 - ns/op 143630 ns/op 144166 ns/op 1.00
BenchmarkDocument/array_gc_100 - B/op 132489 B/op 132489 B/op 1
BenchmarkDocument/array_gc_100 - allocs/op 1248 allocs/op 1248 allocs/op 1
BenchmarkDocument/array_gc_1000 - ns/op 1369710 ns/op 1375392 ns/op 1.00
BenchmarkDocument/array_gc_1000 - B/op 1158951 B/op 1158914 B/op 1.00
BenchmarkDocument/array_gc_1000 - allocs/op 12865 allocs/op 12864 allocs/op 1.00
BenchmarkDocument/counter_1000 - ns/op 198298 ns/op 198354 ns/op 1.00
BenchmarkDocument/counter_1000 - B/op 192852 B/op 192853 B/op 1.00
BenchmarkDocument/counter_1000 - allocs/op 5765 allocs/op 5765 allocs/op 1
BenchmarkDocument/counter_10000 - ns/op 2142970 ns/op 2157794 ns/op 0.99
BenchmarkDocument/counter_10000 - B/op 2087782 B/op 2087766 B/op 1.00
BenchmarkDocument/counter_10000 - allocs/op 59772 allocs/op 59772 allocs/op 1
BenchmarkDocument/object_1000 - ns/op 1325845 ns/op 1354096 ns/op 0.98
BenchmarkDocument/object_1000 - B/op 1427897 B/op 1428036 B/op 1.00
BenchmarkDocument/object_1000 - allocs/op 9844 allocs/op 9845 allocs/op 1.00
BenchmarkDocument/object_10000 - ns/op 14860908 ns/op 15028111 ns/op 0.99
BenchmarkDocument/object_10000 - B/op 12166106 B/op 12166744 B/op 1.00
BenchmarkDocument/object_10000 - allocs/op 100560 allocs/op 100559 allocs/op 1.00
BenchmarkDocument/tree_100 - ns/op 1093171 ns/op 1049112 ns/op 1.04
BenchmarkDocument/tree_100 - B/op 943678 B/op 943678 B/op 1
BenchmarkDocument/tree_100 - allocs/op 6099 allocs/op 6099 allocs/op 1
BenchmarkDocument/tree_1000 - ns/op 79281328 ns/op 79782715 ns/op 0.99
BenchmarkDocument/tree_1000 - B/op 86460366 B/op 86460627 B/op 1.00
BenchmarkDocument/tree_1000 - allocs/op 60112 allocs/op 60114 allocs/op 1.00
BenchmarkDocument/tree_10000 - ns/op 9735855376 ns/op 9957562898 ns/op 0.98
BenchmarkDocument/tree_10000 - B/op 8580984008 B/op 8580990424 B/op 1.00
BenchmarkDocument/tree_10000 - allocs/op 600254 allocs/op 600232 allocs/op 1.00
BenchmarkDocument/tree_delete_all_1000 - ns/op 73321567 ns/op 77379744 ns/op 0.95
BenchmarkDocument/tree_delete_all_1000 - B/op 86990836 B/op 86990891 B/op 1.00
BenchmarkDocument/tree_delete_all_1000 - allocs/op 67752 allocs/op 67751 allocs/op 1.00
BenchmarkDocument/tree_edit_gc_100 - ns/op 3644011 ns/op 3743356 ns/op 0.97
BenchmarkDocument/tree_edit_gc_100 - B/op 4121006 B/op 4120983 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 299022840 ns/op 311312288 ns/op 0.96
BenchmarkDocument/tree_edit_gc_1000 - B/op 383467210 B/op 383465558 B/op 1.00
BenchmarkDocument/tree_edit_gc_1000 - allocs/op 145414 allocs/op 145406 allocs/op 1.00
BenchmarkDocument/tree_split_gc_100 - ns/op 2468969 ns/op 2564917 ns/op 0.96
BenchmarkDocument/tree_split_gc_100 - B/op 2386821 B/op 2386900 B/op 1.00
BenchmarkDocument/tree_split_gc_100 - allocs/op 10341 allocs/op 10341 allocs/op 1
BenchmarkDocument/tree_split_gc_1000 - ns/op 182668193 ns/op 194397785 ns/op 0.94
BenchmarkDocument/tree_split_gc_1000 - B/op 221990745 B/op 221990026 B/op 1.00
BenchmarkDocument/tree_split_gc_1000 - allocs/op 112249 allocs/op 112248 allocs/op 1.00
BenchmarkRPC/client_to_server - ns/op 360159852 ns/op 364396329 ns/op 0.99
BenchmarkRPC/client_to_server - B/op 17530088 B/op 18067424 B/op 0.97
BenchmarkRPC/client_to_server - allocs/op 166866 allocs/op 165863 allocs/op 1.01
BenchmarkRPC/client_to_client_via_server - ns/op 609530375 ns/op 625660123 ns/op 0.97
BenchmarkRPC/client_to_client_via_server - B/op 32405960 B/op 32815272 B/op 0.99
BenchmarkRPC/client_to_client_via_server - allocs/op 311905 allocs/op 310207 allocs/op 1.01
BenchmarkRPC/attach_large_document - ns/op 1342915096 ns/op 1355198048 ns/op 0.99
BenchmarkRPC/attach_large_document - B/op 1869063464 B/op 1868233624 B/op 1.00
BenchmarkRPC/attach_large_document - allocs/op 7513 allocs/op 7466 allocs/op 1.01
BenchmarkRPC/adminCli_to_server - ns/op 540286039 ns/op 549909416 ns/op 0.98
BenchmarkRPC/adminCli_to_server - B/op 37207380 B/op 36780108 B/op 1.01
BenchmarkRPC/adminCli_to_server - allocs/op 289693 allocs/op 288662 allocs/op 1.00
BenchmarkLocker - ns/op 64.15 ns/op 65.86 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.55 ns/op 38.59 ns/op 1.00
BenchmarkLockerParallel - B/op 0 B/op 0 B/op NaN
BenchmarkLockerParallel - allocs/op 0 allocs/op 0 allocs/op NaN
BenchmarkLockerMoreKeys - ns/op 142.8 ns/op 148.9 ns/op 0.96
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 3804157 ns/op 3838436 ns/op 0.99
BenchmarkChange/Push_10_Changes - B/op 126123 B/op 125677 B/op 1.00
BenchmarkChange/Push_10_Changes - allocs/op 1254 allocs/op 1254 allocs/op 1
BenchmarkChange/Push_100_Changes - ns/op 14214416 ns/op 14440415 ns/op 0.98
BenchmarkChange/Push_100_Changes - B/op 643945 B/op 647975 B/op 0.99
BenchmarkChange/Push_100_Changes - allocs/op 6540 allocs/op 6540 allocs/op 1
BenchmarkChange/Push_1000_Changes - ns/op 114025636 ns/op 115497921 ns/op 0.99
BenchmarkChange/Push_1000_Changes - B/op 6164873 B/op 6151829 B/op 1.00
BenchmarkChange/Push_1000_Changes - allocs/op 62160 allocs/op 62159 allocs/op 1.00
BenchmarkChange/Pull_10_Changes - ns/op 2847936 ns/op 2909758 ns/op 0.98
BenchmarkChange/Pull_10_Changes - B/op 100482 B/op 100076 B/op 1.00
BenchmarkChange/Pull_10_Changes - allocs/op 952 allocs/op 952 allocs/op 1
BenchmarkChange/Pull_100_Changes - ns/op 4309581 ns/op 4414877 ns/op 0.98
BenchmarkChange/Pull_100_Changes - B/op 257691 B/op 256121 B/op 1.01
BenchmarkChange/Pull_100_Changes - allocs/op 3154 allocs/op 3154 allocs/op 1
BenchmarkChange/Pull_1000_Changes - ns/op 8355264 ns/op 8566513 ns/op 0.98
BenchmarkChange/Pull_1000_Changes - B/op 1397368 B/op 1392837 B/op 1.00
BenchmarkChange/Pull_1000_Changes - allocs/op 26873 allocs/op 26865 allocs/op 1.00
BenchmarkSnapshot/Push_3KB_snapshot - ns/op 16762107 ns/op 17384863 ns/op 0.96
BenchmarkSnapshot/Push_3KB_snapshot - B/op 802803 B/op 802328 B/op 1.00
BenchmarkSnapshot/Push_3KB_snapshot - allocs/op 6546 allocs/op 6549 allocs/op 1.00
BenchmarkSnapshot/Push_30KB_snapshot - ns/op 117981005 ns/op 118971166 ns/op 0.99
BenchmarkSnapshot/Push_30KB_snapshot - B/op 6047847 B/op 6156721 B/op 0.98
BenchmarkSnapshot/Push_30KB_snapshot - allocs/op 62160 allocs/op 62158 allocs/op 1.00
BenchmarkSnapshot/Pull_3KB_snapshot - ns/op 6565897 ns/op 6602183 ns/op 0.99
BenchmarkSnapshot/Pull_3KB_snapshot - B/op 905280 B/op 902235 B/op 1.00
BenchmarkSnapshot/Pull_3KB_snapshot - allocs/op 14879 allocs/op 14878 allocs/op 1.00
BenchmarkSnapshot/Pull_30KB_snapshot - ns/op 14483736 ns/op 14754933 ns/op 0.98
BenchmarkSnapshot/Pull_30KB_snapshot - B/op 6981185 B/op 6981411 B/op 1.00
BenchmarkSnapshot/Pull_30KB_snapshot - allocs/op 144136 allocs/op 144131 allocs/op 1.00
BenchmarkSync/memory_sync_10_test - ns/op 6782 ns/op 6984 ns/op 0.97
BenchmarkSync/memory_sync_10_test - B/op 1286 B/op 1286 B/op 1
BenchmarkSync/memory_sync_10_test - allocs/op 38 allocs/op 38 allocs/op 1
BenchmarkSync/memory_sync_100_test - ns/op 51399 ns/op 51752 ns/op 0.99
BenchmarkSync/memory_sync_100_test - B/op 8661 B/op 8655 B/op 1.00
BenchmarkSync/memory_sync_100_test - allocs/op 274 allocs/op 274 allocs/op 1
BenchmarkSync/memory_sync_1000_test - ns/op 592040 ns/op 593943 ns/op 1.00
BenchmarkSync/memory_sync_1000_test - B/op 74481 B/op 74410 B/op 1.00
BenchmarkSync/memory_sync_1000_test - allocs/op 2117 allocs/op 2113 allocs/op 1.00
BenchmarkSync/memory_sync_10000_test - ns/op 7206904 ns/op 7699568 ns/op 0.94
BenchmarkSync/memory_sync_10000_test - B/op 765707 B/op 761656 B/op 1.01
BenchmarkSync/memory_sync_10000_test - allocs/op 20621 allocs/op 20495 allocs/op 1.01
BenchmarkTextEditing - ns/op 18957293581 ns/op 19296651559 ns/op 0.98
BenchmarkTextEditing - B/op 9041599416 B/op 9041594456 B/op 1.00
BenchmarkTextEditing - allocs/op 19920781 allocs/op 19920775 allocs/op 1.00

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

Please sign in to comment.