From de2d5503d49758f97166b0e04b1a9c18c869987b Mon Sep 17 00:00:00 2001 From: devleejb Date: Mon, 1 Jan 2024 15:54:48 +0900 Subject: [PATCH 1/5] Fix typo in `MAINTAINING.md` To correct a mislinked hyperlink for the HELM Chart file line within the `MAINTAINING.md` file. --- MAINTAINING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MAINTAINING.md b/MAINTAINING.md index d9eb2ded8..e96b05d68 100644 --- a/MAINTAINING.md +++ b/MAINTAINING.md @@ -5,10 +5,10 @@ ### 1. Update the version number. - Update `YORKIE_VERSION` in [Makefile](https://github.com/yorkie-team/yorkie/blob/main/Makefile#L1). -- Update `version` and `appVersion` in [yorkie-cluster Helm Chart](https://github.com/yorkie-team/yorkie/blob/main/build/charts/yorkie-cluster/Chart.yaml#L16-L17). +- Update `version` and `appVersion` in [yorkie-cluster Helm Chart](https://github.com/yorkie-team/yorkie/blob/main/build/charts/yorkie-cluster/Chart.yaml#L14-L15). - If `yorkie-monitoring` or `yorkie-argocd` Helm Chart have changes, you also need to update `version` and `appVersion` for each chart. - - [yorkie-monitoring Helm Chart](https://github.com/yorkie-team/yorkie/blob/main/build/charts/yorkie-monitoring/Chart.yaml#L16-L17) - - [yorkie-argocd Helm Chart](https://github.com/yorkie-team/yorkie/blob/main/build/charts/yorkie-argocd/Chart.yaml#L16-L17) + - [yorkie-monitoring Helm Chart](https://github.com/yorkie-team/yorkie/blob/main/build/charts/yorkie-monitoring/Chart.yaml#L14-L15) + - [yorkie-argocd Helm Chart](https://github.com/yorkie-team/yorkie/blob/main/build/charts/yorkie-argocd/Chart.yaml#L14-L15) - Also, you need to update `helmChartTargetRevision` in `yorkie-argocd` Helm Chart's [values.yaml](https://github.com/yorkie-team/yorkie/blob/main/build/charts/yorkie-argocd/values.yaml#L13) ### 2. Write changelog of this version in [CHANGELOG.md](https://github.com/yorkie-team/yorkie/blob/main/CHANGELOG.md). From c40c07434180bd7fa3f3d123342c9390946556c1 Mon Sep 17 00:00:00 2001 From: JongBeom Lee Date: Thu, 4 Jan 2024 10:57:06 +0900 Subject: [PATCH 2/5] Fix `getGarbageLen` to retrun correct size --- pkg/document/crdt/root.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pkg/document/crdt/root.go b/pkg/document/crdt/root.go index 5fbe8fe7f..775ec4c39 100644 --- a/pkg/document/crdt/root.go +++ b/pkg/document/crdt/root.go @@ -151,19 +151,22 @@ func (r *Root) RemovedElementLen() int { // GarbageLen returns the count of removed elements. func (r *Root) GarbageLen() int { count := 0 + seen := make(map[string]bool) for _, pair := range r.removedElementPairMapByCreatedAt { - count++ + seen[pair.elem.CreatedAt().ToTestString()] = true switch elem := pair.elem.(type) { case Container: elem.Descendants(func(elem Element, parent Container) bool { - count++ + seen[elem.CreatedAt().ToTestString()] = true return false }) } } + count += len(seen) + for _, element := range r.elementHasRemovedNodesSetByCreatedAt { count += element.removedNodesLen() } From 84dee981facdbf8b7d045f2c56c98dd801dda9e7 Mon Sep 17 00:00:00 2001 From: JongBeom Lee Date: Thu, 4 Jan 2024 10:57:34 +0900 Subject: [PATCH 3/5] Add test case for garbage collection with overlapped removal --- test/integration/gc_test.go | 93 +++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/test/integration/gc_test.go b/test/integration/gc_test.go index 7403d75f1..714e905b5 100644 --- a/test/integration/gc_test.go +++ b/test/integration/gc_test.go @@ -382,4 +382,97 @@ func TestGarbageCollection(t *testing.T) { assert.Equal(t, 0, d1.GarbageLen()) assert.Equal(t, 6, d2.GarbageLen()) }) + + t.Run("garbage collection with overlapped removal", func(t *testing.T) { + ctx := context.Background() + docKey := helper.TestDocKey(t) + d1 := document.New(docKey) + d2 := document.New(docKey) + + err := c1.Attach(ctx, d1) + assert.NoError(t, err) + + err = d1.Update(func(root *json.Object, p *presence.Presence) error { + root.SetNewObject("point"). + SetInteger("point.x", 0) + return nil + }) + err = c1.Sync(ctx) + assert.NoError(t, err) + err = c2.Attach(ctx, d2) + assert.NoError(t, err) + + err = d1.Update(func(root *json.Object, p *presence.Presence) error { + root.Delete("point") + return nil + }) + assert.Equal(t, 2, d1.GarbageLen()) + + err = d2.Update(func(root *json.Object, p *presence.Presence) error { + root.GetObject("point").Delete("point.x") + return nil + }) + assert.NoError(t, err) + + err = c1.Sync(ctx) + assert.NoError(t, err) + err = c2.Sync(ctx) + assert.NoError(t, err) + err = c1.Sync(ctx) + assert.NoError(t, err) + + assert.Equal(t, 2, d1.GarbageLen()) + assert.Equal(t, 2, d2.GarbageLen()) + + assert.Equal(t, d1.GarbageCollect(time.MaxTicket), 2) + assert.Equal(t, d2.GarbageCollect(time.MaxTicket), 2) + }) + + t.Run("garbage collection with overlapped removal 2", func(t *testing.T) { + ctx := context.Background() + docKey := helper.TestDocKey(t) + d1 := document.New(docKey) + d2 := document.New(docKey) + + err := c1.Attach(ctx, d1) + assert.NoError(t, err) + + err = d1.Update(func(root *json.Object, p *presence.Presence) error { + root.SetNewObject("point"). + SetInteger("point.x", 0). + SetInteger("point.y", 0) + return nil + }) + err = c1.Sync(ctx) + assert.NoError(t, err) + err = c2.Attach(ctx, d2) + assert.NoError(t, err) + + err = d1.Update(func(root *json.Object, p *presence.Presence) error { + root.Delete("point") + return nil + }) + assert.NoError(t, err) + assert.Equal(t, 3, d1.GarbageLen()) + + err = d2.Update(func(root *json.Object, p *presence.Presence) error { + root.GetObject("point").Delete("point.x") + return nil + }) + assert.NoError(t, err) + assert.Equal(t, 1, d2.GarbageLen()) + + err = c1.Sync(ctx) + assert.NoError(t, err) + err = c2.Sync(ctx) + assert.NoError(t, err) + err = c1.Sync(ctx) + assert.NoError(t, err) + + assert.Equal(t, 3, d1.GarbageLen()) + assert.Equal(t, 3, d2.GarbageLen()) + + assert.Equal(t, d1.GarbageCollect(time.MaxTicket), 3) + assert.Equal(t, d2.GarbageCollect(time.MaxTicket), 3) + }) } From 64818bc79d296f1bbf0604e9fd1589e8ab82086a Mon Sep 17 00:00:00 2001 From: JongBeom Lee Date: Thu, 4 Jan 2024 11:40:57 +0900 Subject: [PATCH 4/5] Remove similar test case for `GarbageLen` function --- test/integration/gc_test.go | 47 +------------------------------------ 1 file changed, 1 insertion(+), 46 deletions(-) diff --git a/test/integration/gc_test.go b/test/integration/gc_test.go index 714e905b5..543c51f15 100644 --- a/test/integration/gc_test.go +++ b/test/integration/gc_test.go @@ -383,52 +383,7 @@ func TestGarbageCollection(t *testing.T) { assert.Equal(t, 6, d2.GarbageLen()) }) - t.Run("garbage collection with overlapped removal", func(t *testing.T) { - ctx := context.Background() - docKey := helper.TestDocKey(t) - d1 := document.New(docKey) - d2 := document.New(docKey) - - err := c1.Attach(ctx, d1) - assert.NoError(t, err) - - err = d1.Update(func(root *json.Object, p *presence.Presence) error { - root.SetNewObject("point"). - SetInteger("point.x", 0) - return nil - }) - err = c1.Sync(ctx) - assert.NoError(t, err) - err = c2.Attach(ctx, d2) - assert.NoError(t, err) - - err = d1.Update(func(root *json.Object, p *presence.Presence) error { - root.Delete("point") - return nil - }) - assert.Equal(t, 2, d1.GarbageLen()) - - err = d2.Update(func(root *json.Object, p *presence.Presence) error { - root.GetObject("point").Delete("point.x") - return nil - }) - assert.NoError(t, err) - - err = c1.Sync(ctx) - assert.NoError(t, err) - err = c2.Sync(ctx) - assert.NoError(t, err) - err = c1.Sync(ctx) - assert.NoError(t, err) - - assert.Equal(t, 2, d1.GarbageLen()) - assert.Equal(t, 2, d2.GarbageLen()) - - assert.Equal(t, d1.GarbageCollect(time.MaxTicket), 2) - assert.Equal(t, d2.GarbageCollect(time.MaxTicket), 2) - }) - - t.Run("garbage collection with overlapped removal 2", func(t *testing.T) { + t.Run("GarbageLen should return the actual number of elements garbage-collected", func(t *testing.T) { ctx := context.Background() docKey := helper.TestDocKey(t) d1 := document.New(docKey) From 0b12f6324f3becd0617f563e91dae6630e7f0ecf Mon Sep 17 00:00:00 2001 From: JongBeom Lee Date: Thu, 4 Jan 2024 15:35:20 +0900 Subject: [PATCH 5/5] Change function call from `ToTestString` to `Key` --- pkg/document/crdt/root.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/document/crdt/root.go b/pkg/document/crdt/root.go index 775ec4c39..791a77c9f 100644 --- a/pkg/document/crdt/root.go +++ b/pkg/document/crdt/root.go @@ -154,12 +154,12 @@ func (r *Root) GarbageLen() int { seen := make(map[string]bool) for _, pair := range r.removedElementPairMapByCreatedAt { - seen[pair.elem.CreatedAt().ToTestString()] = true + seen[pair.elem.CreatedAt().Key()] = true switch elem := pair.elem.(type) { case Container: elem.Descendants(func(elem Element, parent Container) bool { - seen[elem.CreatedAt().ToTestString()] = true + seen[elem.CreatedAt().Key()] = true return false }) }