From 28761ac0960127c12d3c317e0388d27f16965c08 Mon Sep 17 00:00:00 2001 From: raararaara Date: Thu, 4 Jul 2024 13:06:39 +0900 Subject: [PATCH 1/3] Remove node from indexes during text.GC --- pkg/document/crdt/rga_tree_split.go | 3 +++ pkg/document/crdt/text.go | 11 +++++++++++ pkg/document/document_test.go | 27 +++++++++++++++++++++++++++ test/integration/text_test.go | 2 ++ 4 files changed, 43 insertions(+) diff --git a/pkg/document/crdt/rga_tree_split.go b/pkg/document/crdt/rga_tree_split.go index 98a686ef6..b2e9448b3 100644 --- a/pkg/document/crdt/rga_tree_split.go +++ b/pkg/document/crdt/rga_tree_split.go @@ -628,6 +628,9 @@ func (s *RGATreeSplit[V]) ToTestString() string { func (s *RGATreeSplit[V]) Purge(child GCChild) error { node := child.(*RGATreeSplitNode[V]) + s.treeByIndex.Delete(node.indexNode) + s.treeByID.Remove(node.id) + node.prev.next = node.next if node.next != nil { node.next.prev = node.prev diff --git a/pkg/document/crdt/text.go b/pkg/document/crdt/text.go index 6cd09295f..241f46ec7 100644 --- a/pkg/document/crdt/text.go +++ b/pkg/document/crdt/text.go @@ -18,6 +18,8 @@ package crdt import ( "fmt" + "github.com/yorkie-team/yorkie/pkg/llrb" + "github.com/yorkie-team/yorkie/pkg/splay" "strings" "unicode/utf16" @@ -366,3 +368,12 @@ func (t *Text) ToTestString() string { func (t *Text) CheckWeight() bool { return t.rgaTreeSplit.CheckWeight() } + +func (t *Text) TreeByIndex() *splay.Tree[*RGATreeSplitNode[*TextValue]] { + return t.rgaTreeSplit.treeByIndex +} + +// TreeByID returns the tree by ID for debugging purpose. +func (t *Text) TreeByID() *llrb.Tree[*RGATreeSplitNodeID, *RGATreeSplitNode[*TextValue]] { + return t.rgaTreeSplit.treeByID +} diff --git a/pkg/document/document_test.go b/pkg/document/document_test.go index 1046efd53..fedf7459f 100644 --- a/pkg/document/document_test.go +++ b/pkg/document/document_test.go @@ -524,4 +524,31 @@ func TestDocument(t *testing.T) { assert.Equal(t, "{}", doc.Marshal()) assert.Equal(t, 0, doc.GarbageLen()) }) + + t.Run("purge node from index during GC test", func(t *testing.T) { + doc := document.New("d1") + + assert.NoError(t, doc.Update(func(root *json.Object, p *presence.Presence) error { + root.SetNewText("k1") + return nil + })) + assert.Equal(t, 1, doc.Root().GetText("k1").TreeByID().Len()) + + assert.NoError(t, doc.Update(func(root *json.Object, p *presence.Presence) error { + text := root.GetText("k1") + text.Edit(0, 0, "ABC", nil) + return nil + })) + assert.Equal(t, 2, doc.Root().GetText("k1").TreeByID().Len()) + + assert.NoError(t, doc.Update(func(root *json.Object, p *presence.Presence) error { + text := root.GetText("k1") + text.Edit(1, 3, "", nil) + return nil + })) + assert.Equal(t, 3, doc.Root().GetText("k1").TreeByID().Len()) + + doc.GarbageCollect(time.MaxTicket) + assert.Equal(t, 2, doc.Root().GetText("k1").TreeByID().Len()) + }) } diff --git a/test/integration/text_test.go b/test/integration/text_test.go index b85be27d4..890c4857f 100644 --- a/test/integration/text_test.go +++ b/test/integration/text_test.go @@ -262,6 +262,8 @@ func TestText(t *testing.T) { syncClientsThenAssertEqual(t, []clientAndDocPair{{c1, d1}, {c2, d2}}) assert.True(t, d1.Root().GetText("k1").CheckWeight()) assert.True(t, d2.Root().GetText("k1").CheckWeight()) + assert.True(t, d1.Root().GetText("k1").TreeByIndex().CheckWeight()) + assert.True(t, d2.Root().GetText("k1").TreeByIndex().CheckWeight()) }) // Peritext test From 3dfcc78b64f1faa558b0e6b2086335c1b1afeca3 Mon Sep 17 00:00:00 2001 From: raararaara Date: Thu, 4 Jul 2024 13:08:36 +0900 Subject: [PATCH 2/3] Lint --- pkg/document/crdt/text.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/document/crdt/text.go b/pkg/document/crdt/text.go index 241f46ec7..09f3520f3 100644 --- a/pkg/document/crdt/text.go +++ b/pkg/document/crdt/text.go @@ -18,12 +18,12 @@ package crdt import ( "fmt" - "github.com/yorkie-team/yorkie/pkg/llrb" - "github.com/yorkie-team/yorkie/pkg/splay" "strings" "unicode/utf16" "github.com/yorkie-team/yorkie/pkg/document/time" + "github.com/yorkie-team/yorkie/pkg/llrb" + "github.com/yorkie-team/yorkie/pkg/splay" ) // TextValue is a value of Text which has an attributes that represent @@ -369,6 +369,7 @@ func (t *Text) CheckWeight() bool { return t.rgaTreeSplit.CheckWeight() } +// TreeByIndex returns IndexTree of the text for debugging purpose. func (t *Text) TreeByIndex() *splay.Tree[*RGATreeSplitNode[*TextValue]] { return t.rgaTreeSplit.treeByIndex } From 7031160469166a374cedef83db8d08c6732c23cd Mon Sep 17 00:00:00 2001 From: Youngteac Hong Date: Thu, 4 Jul 2024 14:14:37 +0900 Subject: [PATCH 3/3] Apply suggestions from code review --- pkg/document/document_test.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pkg/document/document_test.go b/pkg/document/document_test.go index fedf7459f..c5beb855b 100644 --- a/pkg/document/document_test.go +++ b/pkg/document/document_test.go @@ -535,15 +535,13 @@ func TestDocument(t *testing.T) { assert.Equal(t, 1, doc.Root().GetText("k1").TreeByID().Len()) assert.NoError(t, doc.Update(func(root *json.Object, p *presence.Presence) error { - text := root.GetText("k1") - text.Edit(0, 0, "ABC", nil) + root.GetText("k1").Edit(0, 0, "ABC", nil) return nil })) assert.Equal(t, 2, doc.Root().GetText("k1").TreeByID().Len()) assert.NoError(t, doc.Update(func(root *json.Object, p *presence.Presence) error { - text := root.GetText("k1") - text.Edit(1, 3, "", nil) + root.GetText("k1").Edit(1, 3, "", nil) return nil })) assert.Equal(t, 3, doc.Root().GetText("k1").TreeByID().Len())