From 5f329705849d502117003b5f9fdc14b34105c6d3 Mon Sep 17 00:00:00 2001 From: yeongha Date: Sun, 10 Dec 2023 22:07:39 +0900 Subject: [PATCH 01/24] Add document hard deletion functionality to housekeeping tasks. --- cmd/yorkie/server.go | 6 ++ server/backend/database/database.go | 14 ++++ server/backend/database/memory/database.go | 20 +++++ server/backend/database/mongo/client.go | 87 +++++++++++++++++++++ server/backend/housekeeping/config.go | 3 + server/backend/housekeeping/housekeeping.go | 72 ++++++++++++++++- server/config.go | 14 ++-- server/config.sample.yml | 3 + 8 files changed, 209 insertions(+), 10 deletions(-) diff --git a/cmd/yorkie/server.go b/cmd/yorkie/server.go index ecfb3d2f1..f5de83bdc 100644 --- a/cmd/yorkie/server.go +++ b/cmd/yorkie/server.go @@ -223,6 +223,12 @@ func init() { server.DefaultHousekeepingCandidatesLimitPerProject, "candidates limit per project for a single housekeeping run", ) + cmd.Flags().IntVar( + &conf.Housekeeping.HardDeletionLimitPerProject, + "housekeeping-HardDeletion-limit-per-project", + server.DefaultHousekeepingHardDeletionLimitPerProject, + "hardDeletion limit per project for a single housekeeping run", + ) cmd.Flags().IntVar( &conf.Housekeeping.ProjectFetchSize, "housekeeping-project-fetch-size", diff --git a/server/backend/database/database.go b/server/backend/database/database.go index be0118e2f..eebb25e58 100644 --- a/server/backend/database/database.go +++ b/server/backend/database/database.go @@ -142,6 +142,20 @@ type Database interface { lastProjectID types.ID, ) (types.ID, []*ClientInfo, error) + // FindHardDeletionCandidates finds the housekeeping deletion candidates. + FindHardDeletionCandidates( + ctx context.Context, + candidatesLimitPerProject int, + projectFetchSize int, + lastProjectID types.ID, + ) (types.ID, []*ClientInfo, error) + + // HardDeletion Document complete deletion in progress + HardDeletion( + ctx context.Context, + candidates []*ClientInfo, + ) (types.ID, error) + // FindDocInfoByKey finds the document of the given key. FindDocInfoByKey( ctx context.Context, diff --git a/server/backend/database/memory/database.go b/server/backend/database/memory/database.go index aa46dcfef..080bf84d3 100644 --- a/server/backend/database/memory/database.go +++ b/server/backend/database/memory/database.go @@ -638,6 +638,26 @@ func (d *DB) FindDeactivateCandidates( return topProjectID, candidates, nil } +// FindHardDeletionCandidates finds the clients that need housekeeping. +func (d *DB) FindHardDeletionCandidates( + ctx context.Context, + candidatesLimitPerProject int, + projectFetchSize int, + lastProjectID types.ID, +) (types.ID, []*database.ClientInfo, error) { + // TODO developing... + return "1", nil, nil +} + +// HardDeletion Deletes the documents completely. +func (d *DB) HardDeletion( + ctx context.Context, + candidates []*database.ClientInfo, +) (types.ID, error) { + // TODO developing... + return "1", nil +} + // FindDocInfoByKeyAndOwner finds the document of the given key. If the // createDocIfNotExist condition is true, create the document if it does not // exist. diff --git a/server/backend/database/mongo/client.go b/server/backend/database/mongo/client.go index 65c319ef8..72f119aca 100644 --- a/server/backend/database/mongo/client.go +++ b/server/backend/database/mongo/client.go @@ -235,6 +235,32 @@ func (c *Client) CreateProjectInfo( return info, nil } +// HardDeletion Deletes the documents completely. +func (c *Client) HardDeletion( + ctx context.Context, + candidates []*database.ClientInfo, +) (types.ID, error) { + if len(candidates) <= 0 { + return database.DefaultProjectID, nil + } + + var idList []types.ID + for _, candidate := range candidates { + idList = append(idList, candidate.ID) + } + + _, err := c.collection(colDocuments).DeleteMany( + ctx, + bson.M{"_id": bson.M{"$in": idList}}, + ) + + if err != nil { + return database.DefaultProjectID, fmt.Errorf("deletion Error : %w", err) + } + + return idList[len(idList)-1], nil +} + // listProjectInfos returns all project infos rotationally. func (c *Client) listProjectInfos( ctx context.Context, @@ -628,6 +654,33 @@ func (c *Client) UpdateClientInfoAfterPushPull( return nil } +// FindHardDeletionCandidatesPerProject finds the clients that need housekeeping per project. +func (c *Client) FindHardDeletionCandidatesPerProject( + ctx context.Context, + project *database.ProjectInfo, + candidatesLimit int, +) ([]*database.ClientInfo, error) { + encodedProjectID, err := encodeID(project.ID) + if err != nil { + return nil, err + } + + var clientInfos []*database.ClientInfo + cursor, err := c.collection(colDocuments).Find(ctx, bson.M{ + "project_id": encodedProjectID, + "deleted_at": bson.M{"$ne": nil}, + }, options.Find().SetLimit(int64(candidatesLimit))) + + if err != nil { + return nil, fmt.Errorf("find deactivate candidates: %w", err) + } + + if err := cursor.All(ctx, &clientInfos); err != nil { + return nil, fmt.Errorf("fetch hard deletion candidates: %w", err) + } + return clientInfos, nil +} + // findDeactivateCandidatesPerProject finds the clients that need housekeeping per project. func (c *Client) findDeactivateCandidatesPerProject( ctx context.Context, @@ -695,6 +748,40 @@ func (c *Client) FindDeactivateCandidates( return topProjectID, candidates, nil } +// FindHardDeletionCandidates finds the clients that need housekeeping. +func (c *Client) FindHardDeletionCandidates( + ctx context.Context, + candidatesLimitPerProject int, + projectFetchSize int, + lastProjectID types.ID, +) (types.ID, []*database.ClientInfo, error) { + projects, err := c.listProjectInfos(ctx, projectFetchSize, lastProjectID) + if err != nil { + return database.DefaultProjectID, nil, err + } + + var candidates []*database.ClientInfo + for _, project := range projects { + clientInfos, err := c.FindHardDeletionCandidatesPerProject(ctx, project, candidatesLimitPerProject) + if err != nil { + return database.DefaultProjectID, nil, err + } + candidates = append(candidates, clientInfos...) + } + + return c.DetermineTopProjectID(projects, projectFetchSize), candidates, nil +} + +func (c *Client) DetermineTopProjectID( + projects []*database.ProjectInfo, + projectFetchSize int, +) types.ID { + if len(projects) < projectFetchSize { + return database.DefaultProjectID + } + return projects[len(projects)-1].ID +} + // FindDocInfoByKeyAndOwner finds the document of the given key. If the // createDocIfNotExist condition is true, create the document if it does not // exist. diff --git a/server/backend/housekeeping/config.go b/server/backend/housekeeping/config.go index 513bbd7a5..f220d4bab 100644 --- a/server/backend/housekeeping/config.go +++ b/server/backend/housekeeping/config.go @@ -29,6 +29,9 @@ type Config struct { // CandidatesLimitPerProject is the maximum number of candidates to be returned per project. CandidatesLimitPerProject int `yaml:"CandidatesLimitPerProject"` + // HardDeletionLimitPerProject is the maximum number of candidates to be returned per project. + HardDeletionLimitPerProject int `yaml:"HardDeletionLimitPerProject"` + // ProjectFetchSize is the maximum number of projects to be returned to deactivate candidates. ProjectFetchSize int `yaml:"HousekeepingProjectFetchSize"` } diff --git a/server/backend/housekeeping/housekeeping.go b/server/backend/housekeeping/housekeeping.go index 2672ab182..945c1654f 100644 --- a/server/backend/housekeeping/housekeeping.go +++ b/server/backend/housekeeping/housekeeping.go @@ -33,6 +33,7 @@ import ( const ( deactivateCandidatesKey = "housekeeping/deactivateCandidates" + hardDeletionLockKey = "housekeeping/hardDeletionLock" ) // Housekeeping is the housekeeping service. It periodically runs housekeeping @@ -95,19 +96,19 @@ func New( // Start starts the housekeeping service. func (h *Housekeeping) Start() error { - go h.run() + go h.AttachDeactivateCandidates() + go h.AttachDocumentHardDeletion() return nil } // Stop stops the housekeeping service. func (h *Housekeeping) Stop() error { h.cancelFunc() - return nil } -// run is the housekeeping loop. -func (h *Housekeeping) run() { +// AttachDeactivateCandidates is the housekeeping loop. +func (h *Housekeeping) AttachDeactivateCandidates() { housekeepingLastProjectID := database.DefaultProjectID for { @@ -117,6 +118,7 @@ func (h *Housekeeping) run() { logging.From(ctx).Error(err) continue } + housekeepingLastProjectID = lastProjectID select { @@ -127,6 +129,64 @@ func (h *Housekeeping) run() { } } +func (h *Housekeeping) AttachDocumentHardDeletion() { + housekeepingLastProjectID := database.DefaultProjectID + + for { + ctx := context.Background() + lastProjectID, err := h.documentHardDeletion(ctx, housekeepingLastProjectID) + if err != nil { + logging.From(ctx).Error(err) + continue + } + + housekeepingLastProjectID = lastProjectID + + select { + case <-time.After(h.interval): + case <-h.ctx.Done(): + return + } + } +} + +func (h *Housekeeping) documentHardDeletion( + ctx context.Context, + housekeepingLastProjectID types.ID, +) (types.ID, error) { + locker, err := h.coordinator.NewLocker(ctx, hardDeletionLockKey) + if err != nil { + return database.DefaultProjectID, err + } + if err := locker.Lock(ctx); err != nil { + return database.DefaultProjectID, err + } + defer func() { + if err := locker.Unlock(ctx); err != nil { + logging.From(ctx).Error(err) + } + }() + + lastProjectID, candidates, err := h.database.FindHardDeletionCandidates( + ctx, + h.candidatesLimitPerProject, + h.projectFetchSize, + housekeepingLastProjectID, + ) + + if err != nil { + return database.DefaultProjectID, err + } + + lastProjectID, err = h.database.HardDeletion(ctx, candidates) + + if err != nil { + return database.DefaultProjectID, err + } + + return lastProjectID, err +} + // deactivateCandidates deactivates candidates. func (h *Housekeeping) deactivateCandidates( ctx context.Context, @@ -148,6 +208,7 @@ func (h *Housekeeping) deactivateCandidates( } }() + // FindDeactivateCandidates 메서드를 호출하여 비활성화할 대상이 되는 후보(candidates)를 데이터베이스에서 조회합니다. lastProjectID, candidates, err := h.database.FindDeactivateCandidates( ctx, h.candidatesLimitPerProject, @@ -158,6 +219,9 @@ func (h *Housekeeping) deactivateCandidates( return database.DefaultProjectID, err } + //조회된 후보들에 대해서 for 루프를 사용해 순회하면서 각각을 비활성화합니다. + //clients.Deactivate 메서드를 사용하여 실제 비활성화 작업을 수행하고, + //그 결과를 deactivatedCount 변수에 누적하여 비활성화된 항목의 수를 추적합니다. deactivatedCount := 0 for _, clientInfo := range candidates { if _, err := clients.Deactivate( diff --git a/server/config.go b/server/config.go index 63d51af41..004853375 100644 --- a/server/config.go +++ b/server/config.go @@ -40,9 +40,10 @@ const ( DefaultProfilingPort = 11102 - DefaultHousekeepingInterval = 30 * time.Second - DefaultHousekeepingCandidatesLimitPerProject = 500 - DefaultHousekeepingProjectFetchSize = 100 + DefaultHousekeepingInterval = 30 * time.Second + DefaultHousekeepingCandidatesLimitPerProject = 500 + DefaultHousekeepingHardDeletionLimitPerProject = 500 + DefaultHousekeepingProjectFetchSize = 100 DefaultMongoConnectionURI = "mongodb://localhost:27017" DefaultMongoConnectionTimeout = 5 * time.Second @@ -240,9 +241,10 @@ func newConfig(port int, profilingPort int) *Config { Port: profilingPort, }, Housekeeping: &housekeeping.Config{ - Interval: DefaultHousekeepingInterval.String(), - CandidatesLimitPerProject: DefaultHousekeepingCandidatesLimitPerProject, - ProjectFetchSize: DefaultHousekeepingProjectFetchSize, + Interval: DefaultHousekeepingInterval.String(), + CandidatesLimitPerProject: DefaultHousekeepingCandidatesLimitPerProject, + HardDeletionLimitPerProject: DefaultHousekeepingHardDeletionLimitPerProject, + ProjectFetchSize: DefaultHousekeepingProjectFetchSize, }, Backend: &backend.Config{ ClientDeactivateThreshold: DefaultClientDeactivateThreshold, diff --git a/server/config.sample.yml b/server/config.sample.yml index e682b3fc3..f75e3f903 100644 --- a/server/config.sample.yml +++ b/server/config.sample.yml @@ -36,6 +36,9 @@ Housekeeping: # CandidatesLimitPerProject is the maximum number of candidates to be returned per project (default: 100). CandidatesLimitPerProject: 100 + # HardDeletionLimitPerProject is the maximum number of candidates to be returned per project (default: 100). + HardDeletionLimitPerProject: 100 + # ProjectFetchSize is the maximum number of projects to be returned to deactivate candidates. (default: 100). ProjectFetchSize: 100 From d4b61a64c750e4e6eadf8533b2b7935e404f3039 Mon Sep 17 00:00:00 2001 From: yeongha Date: Sat, 6 Jan 2024 21:45:18 +0900 Subject: [PATCH 02/24] Modified function for document removal, added memdb-based function, removed unnecessary comments --- server/backend/database/database.go | 4 +- server/backend/database/memory/database.go | 74 +++++++++++++++++++-- server/backend/database/mongo/client.go | 41 +++++------- server/backend/housekeeping/housekeeping.go | 11 ++- 4 files changed, 90 insertions(+), 40 deletions(-) diff --git a/server/backend/database/database.go b/server/backend/database/database.go index eebb25e58..cb239105c 100644 --- a/server/backend/database/database.go +++ b/server/backend/database/database.go @@ -148,12 +148,12 @@ type Database interface { candidatesLimitPerProject int, projectFetchSize int, lastProjectID types.ID, - ) (types.ID, []*ClientInfo, error) + ) ([]*DocInfo, error) // HardDeletion Document complete deletion in progress HardDeletion( ctx context.Context, - candidates []*ClientInfo, + candidates []*DocInfo, ) (types.ID, error) // FindDocInfoByKey finds the document of the given key. diff --git a/server/backend/database/memory/database.go b/server/backend/database/memory/database.go index 080bf84d3..d48f19e60 100644 --- a/server/backend/database/memory/database.go +++ b/server/backend/database/memory/database.go @@ -565,6 +565,41 @@ func (d *DB) UpdateClientInfoAfterPushPull( return nil } +// findHardDeletionCandidatesPerProject finds the documents that need housekeeping per project. +func (d *DB) findHardDeletionCandidatesPerProject( + ctx context.Context, + project *database.ProjectInfo, + candidatesLimit int, +) ([]*database.DocInfo, error) { + + txn := d.db.Txn(false) + defer txn.Abort() + + var documents []*database.DocInfo + iterator, err := txn.Get( + tblProjects, + "project_id", + project.ID.String(), + ) + + if err != nil { + return nil, fmt.Errorf("fetch hard deletion candidates: %w", err) + } + + for raw := iterator.Next(); raw != nil; raw = iterator.Next() { + document := raw.(*database.DocInfo) + if candidatesLimit <= len(documents) { + break + } + + if !document.RemovedAt.IsZero() { + documents = append(documents, document) + } + } + + return documents, nil +} + // findDeactivateCandidatesPerProject finds the clients that need housekeeping per project. func (d *DB) findDeactivateCandidatesPerProject( ctx context.Context, @@ -644,18 +679,45 @@ func (d *DB) FindHardDeletionCandidates( candidatesLimitPerProject int, projectFetchSize int, lastProjectID types.ID, -) (types.ID, []*database.ClientInfo, error) { - // TODO developing... - return "1", nil, nil +) ([]*database.DocInfo, error) { + projects, err := d.listProjectInfos(ctx, projectFetchSize, lastProjectID) + if err != nil { + return nil, err + } + + var candidates []*database.DocInfo + for _, project := range projects { + documents, err := d.findHardDeletionCandidatesPerProject(ctx, project, candidatesLimitPerProject) + if err != nil { + return nil, err + } + + candidates = append(candidates, documents...) + } + + return candidates, nil } // HardDeletion Deletes the documents completely. func (d *DB) HardDeletion( ctx context.Context, - candidates []*database.ClientInfo, + candidates []*database.DocInfo, ) (types.ID, error) { - // TODO developing... - return "1", nil + + var lastDeletedID types.ID + + txn := d.db.Txn(true) + defer txn.Abort() + + for _, candidate := range candidates { + if err := txn.Delete(tblDocuments, candidate); err != nil { + return database.DefaultProjectID, fmt.Errorf("fetch hard deletion candidates: %w", err) + } + lastDeletedID = candidate.ID + } + txn.Commit() + + return lastDeletedID, nil } // FindDocInfoByKeyAndOwner finds the document of the given key. If the diff --git a/server/backend/database/mongo/client.go b/server/backend/database/mongo/client.go index 72f119aca..7e5e52c57 100644 --- a/server/backend/database/mongo/client.go +++ b/server/backend/database/mongo/client.go @@ -238,7 +238,7 @@ func (c *Client) CreateProjectInfo( // HardDeletion Deletes the documents completely. func (c *Client) HardDeletion( ctx context.Context, - candidates []*database.ClientInfo, + candidates []*database.DocInfo, ) (types.ID, error) { if len(candidates) <= 0 { return database.DefaultProjectID, nil @@ -654,31 +654,32 @@ func (c *Client) UpdateClientInfoAfterPushPull( return nil } -// FindHardDeletionCandidatesPerProject finds the clients that need housekeeping per project. -func (c *Client) FindHardDeletionCandidatesPerProject( +// findHardDeletionCandidatesPerProject finds the clients that need housekeeping per project. +func (c *Client) findHardDeletionCandidatesPerProject( ctx context.Context, project *database.ProjectInfo, candidatesLimit int, -) ([]*database.ClientInfo, error) { +) ([]*database.DocInfo, error) { encodedProjectID, err := encodeID(project.ID) if err != nil { return nil, err } - var clientInfos []*database.ClientInfo + var DocInfos []*database.DocInfo cursor, err := c.collection(colDocuments).Find(ctx, bson.M{ "project_id": encodedProjectID, - "deleted_at": bson.M{"$ne": nil}, + "removed_at": bson.M{"$ne": nil}, }, options.Find().SetLimit(int64(candidatesLimit))) if err != nil { - return nil, fmt.Errorf("find deactivate candidates: %w", err) + return nil, err } - if err := cursor.All(ctx, &clientInfos); err != nil { + if err := cursor.All(ctx, &DocInfos); err != nil { return nil, fmt.Errorf("fetch hard deletion candidates: %w", err) } - return clientInfos, nil + + return DocInfos, nil } // findDeactivateCandidatesPerProject finds the clients that need housekeeping per project. @@ -754,32 +755,22 @@ func (c *Client) FindHardDeletionCandidates( candidatesLimitPerProject int, projectFetchSize int, lastProjectID types.ID, -) (types.ID, []*database.ClientInfo, error) { +) ([]*database.DocInfo, error) { projects, err := c.listProjectInfos(ctx, projectFetchSize, lastProjectID) if err != nil { - return database.DefaultProjectID, nil, err + return nil, err } - var candidates []*database.ClientInfo + var candidates []*database.DocInfo for _, project := range projects { - clientInfos, err := c.FindHardDeletionCandidatesPerProject(ctx, project, candidatesLimitPerProject) + clientInfos, err := c.findHardDeletionCandidatesPerProject(ctx, project, candidatesLimitPerProject) if err != nil { - return database.DefaultProjectID, nil, err + return nil, err } candidates = append(candidates, clientInfos...) } - return c.DetermineTopProjectID(projects, projectFetchSize), candidates, nil -} - -func (c *Client) DetermineTopProjectID( - projects []*database.ProjectInfo, - projectFetchSize int, -) types.ID { - if len(projects) < projectFetchSize { - return database.DefaultProjectID - } - return projects[len(projects)-1].ID + return candidates, nil } // FindDocInfoByKeyAndOwner finds the document of the given key. If the diff --git a/server/backend/housekeeping/housekeeping.go b/server/backend/housekeeping/housekeeping.go index 945c1654f..7319d0b6d 100644 --- a/server/backend/housekeeping/housekeeping.go +++ b/server/backend/housekeeping/housekeeping.go @@ -107,7 +107,7 @@ func (h *Housekeeping) Stop() error { return nil } -// AttachDeactivateCandidates is the housekeeping loop. +// AttachDeactivateCandidates is the housekeeping loop for DeactivateCandidates func (h *Housekeeping) AttachDeactivateCandidates() { housekeepingLastProjectID := database.DefaultProjectID @@ -129,6 +129,7 @@ func (h *Housekeeping) AttachDeactivateCandidates() { } } +// AttachDocumentHardDeletion is the housekeeping loop for DocumentHardDeletion func (h *Housekeeping) AttachDocumentHardDeletion() { housekeepingLastProjectID := database.DefaultProjectID @@ -167,7 +168,7 @@ func (h *Housekeeping) documentHardDeletion( } }() - lastProjectID, candidates, err := h.database.FindHardDeletionCandidates( + candidates, err := h.database.FindHardDeletionCandidates( ctx, h.candidatesLimitPerProject, h.projectFetchSize, @@ -177,7 +178,7 @@ func (h *Housekeeping) documentHardDeletion( if err != nil { return database.DefaultProjectID, err } - + var lastProjectID types.ID lastProjectID, err = h.database.HardDeletion(ctx, candidates) if err != nil { @@ -208,7 +209,6 @@ func (h *Housekeeping) deactivateCandidates( } }() - // FindDeactivateCandidates 메서드를 호출하여 비활성화할 대상이 되는 후보(candidates)를 데이터베이스에서 조회합니다. lastProjectID, candidates, err := h.database.FindDeactivateCandidates( ctx, h.candidatesLimitPerProject, @@ -219,9 +219,6 @@ func (h *Housekeeping) deactivateCandidates( return database.DefaultProjectID, err } - //조회된 후보들에 대해서 for 루프를 사용해 순회하면서 각각을 비활성화합니다. - //clients.Deactivate 메서드를 사용하여 실제 비활성화 작업을 수행하고, - //그 결과를 deactivatedCount 변수에 누적하여 비활성화된 항목의 수를 추적합니다. deactivatedCount := 0 for _, clientInfo := range candidates { if _, err := clients.Deactivate( From 542967029677e9a7f82f242245f8a8fc0ac8e711 Mon Sep 17 00:00:00 2001 From: yeongha Date: Sun, 10 Dec 2023 22:07:39 +0900 Subject: [PATCH 03/24] Add document hard deletion functionality to housekeeping tasks. --- cmd/yorkie/server.go | 6 ++ server/backend/database/database.go | 14 ++++ server/backend/database/memory/database.go | 20 +++++ server/backend/database/mongo/client.go | 87 +++++++++++++++++++++ server/backend/housekeeping/config.go | 3 + server/backend/housekeeping/housekeeping.go | 72 ++++++++++++++++- server/config.go | 14 ++-- server/config.sample.yml | 3 + 8 files changed, 209 insertions(+), 10 deletions(-) diff --git a/cmd/yorkie/server.go b/cmd/yorkie/server.go index 2336bab51..2cda9e9ec 100644 --- a/cmd/yorkie/server.go +++ b/cmd/yorkie/server.go @@ -205,6 +205,12 @@ func init() { server.DefaultHousekeepingCandidatesLimitPerProject, "candidates limit per project for a single housekeeping run", ) + cmd.Flags().IntVar( + &conf.Housekeeping.HardDeletionLimitPerProject, + "housekeeping-HardDeletion-limit-per-project", + server.DefaultHousekeepingHardDeletionLimitPerProject, + "hardDeletion limit per project for a single housekeeping run", + ) cmd.Flags().IntVar( &conf.Housekeeping.ProjectFetchSize, "housekeeping-project-fetch-size", diff --git a/server/backend/database/database.go b/server/backend/database/database.go index be0118e2f..eebb25e58 100644 --- a/server/backend/database/database.go +++ b/server/backend/database/database.go @@ -142,6 +142,20 @@ type Database interface { lastProjectID types.ID, ) (types.ID, []*ClientInfo, error) + // FindHardDeletionCandidates finds the housekeeping deletion candidates. + FindHardDeletionCandidates( + ctx context.Context, + candidatesLimitPerProject int, + projectFetchSize int, + lastProjectID types.ID, + ) (types.ID, []*ClientInfo, error) + + // HardDeletion Document complete deletion in progress + HardDeletion( + ctx context.Context, + candidates []*ClientInfo, + ) (types.ID, error) + // FindDocInfoByKey finds the document of the given key. FindDocInfoByKey( ctx context.Context, diff --git a/server/backend/database/memory/database.go b/server/backend/database/memory/database.go index 7a45335cb..7aed93f4a 100644 --- a/server/backend/database/memory/database.go +++ b/server/backend/database/memory/database.go @@ -636,6 +636,26 @@ func (d *DB) FindDeactivateCandidates( return topProjectID, candidates, nil } +// FindHardDeletionCandidates finds the clients that need housekeeping. +func (d *DB) FindHardDeletionCandidates( + ctx context.Context, + candidatesLimitPerProject int, + projectFetchSize int, + lastProjectID types.ID, +) (types.ID, []*database.ClientInfo, error) { + // TODO developing... + return "1", nil, nil +} + +// HardDeletion Deletes the documents completely. +func (d *DB) HardDeletion( + ctx context.Context, + candidates []*database.ClientInfo, +) (types.ID, error) { + // TODO developing... + return "1", nil +} + // FindDocInfoByKeyAndOwner finds the document of the given key. If the // createDocIfNotExist condition is true, create the document if it does not // exist. diff --git a/server/backend/database/mongo/client.go b/server/backend/database/mongo/client.go index 5429f58f7..2b01b959e 100644 --- a/server/backend/database/mongo/client.go +++ b/server/backend/database/mongo/client.go @@ -240,6 +240,32 @@ func (c *Client) CreateProjectInfo( return info, nil } +// HardDeletion Deletes the documents completely. +func (c *Client) HardDeletion( + ctx context.Context, + candidates []*database.ClientInfo, +) (types.ID, error) { + if len(candidates) <= 0 { + return database.DefaultProjectID, nil + } + + var idList []types.ID + for _, candidate := range candidates { + idList = append(idList, candidate.ID) + } + + _, err := c.collection(colDocuments).DeleteMany( + ctx, + bson.M{"_id": bson.M{"$in": idList}}, + ) + + if err != nil { + return database.DefaultProjectID, fmt.Errorf("deletion Error : %w", err) + } + + return idList[len(idList)-1], nil +} + // listProjectInfos returns all project infos rotationally. func (c *Client) listProjectInfos( ctx context.Context, @@ -633,6 +659,33 @@ func (c *Client) UpdateClientInfoAfterPushPull( return nil } +// FindHardDeletionCandidatesPerProject finds the clients that need housekeeping per project. +func (c *Client) FindHardDeletionCandidatesPerProject( + ctx context.Context, + project *database.ProjectInfo, + candidatesLimit int, +) ([]*database.ClientInfo, error) { + encodedProjectID, err := encodeID(project.ID) + if err != nil { + return nil, err + } + + var clientInfos []*database.ClientInfo + cursor, err := c.collection(colDocuments).Find(ctx, bson.M{ + "project_id": encodedProjectID, + "deleted_at": bson.M{"$ne": nil}, + }, options.Find().SetLimit(int64(candidatesLimit))) + + if err != nil { + return nil, fmt.Errorf("find deactivate candidates: %w", err) + } + + if err := cursor.All(ctx, &clientInfos); err != nil { + return nil, fmt.Errorf("fetch hard deletion candidates: %w", err) + } + return clientInfos, nil +} + // findDeactivateCandidatesPerProject finds the clients that need housekeeping per project. func (c *Client) findDeactivateCandidatesPerProject( ctx context.Context, @@ -700,6 +753,40 @@ func (c *Client) FindDeactivateCandidates( return topProjectID, candidates, nil } +// FindHardDeletionCandidates finds the clients that need housekeeping. +func (c *Client) FindHardDeletionCandidates( + ctx context.Context, + candidatesLimitPerProject int, + projectFetchSize int, + lastProjectID types.ID, +) (types.ID, []*database.ClientInfo, error) { + projects, err := c.listProjectInfos(ctx, projectFetchSize, lastProjectID) + if err != nil { + return database.DefaultProjectID, nil, err + } + + var candidates []*database.ClientInfo + for _, project := range projects { + clientInfos, err := c.FindHardDeletionCandidatesPerProject(ctx, project, candidatesLimitPerProject) + if err != nil { + return database.DefaultProjectID, nil, err + } + candidates = append(candidates, clientInfos...) + } + + return c.DetermineTopProjectID(projects, projectFetchSize), candidates, nil +} + +func (c *Client) DetermineTopProjectID( + projects []*database.ProjectInfo, + projectFetchSize int, +) types.ID { + if len(projects) < projectFetchSize { + return database.DefaultProjectID + } + return projects[len(projects)-1].ID +} + // FindDocInfoByKeyAndOwner finds the document of the given key. If the // createDocIfNotExist condition is true, create the document if it does not // exist. diff --git a/server/backend/housekeeping/config.go b/server/backend/housekeeping/config.go index 513bbd7a5..f220d4bab 100644 --- a/server/backend/housekeeping/config.go +++ b/server/backend/housekeeping/config.go @@ -29,6 +29,9 @@ type Config struct { // CandidatesLimitPerProject is the maximum number of candidates to be returned per project. CandidatesLimitPerProject int `yaml:"CandidatesLimitPerProject"` + // HardDeletionLimitPerProject is the maximum number of candidates to be returned per project. + HardDeletionLimitPerProject int `yaml:"HardDeletionLimitPerProject"` + // ProjectFetchSize is the maximum number of projects to be returned to deactivate candidates. ProjectFetchSize int `yaml:"HousekeepingProjectFetchSize"` } diff --git a/server/backend/housekeeping/housekeeping.go b/server/backend/housekeeping/housekeeping.go index 2672ab182..945c1654f 100644 --- a/server/backend/housekeeping/housekeeping.go +++ b/server/backend/housekeeping/housekeeping.go @@ -33,6 +33,7 @@ import ( const ( deactivateCandidatesKey = "housekeeping/deactivateCandidates" + hardDeletionLockKey = "housekeeping/hardDeletionLock" ) // Housekeeping is the housekeeping service. It periodically runs housekeeping @@ -95,19 +96,19 @@ func New( // Start starts the housekeeping service. func (h *Housekeeping) Start() error { - go h.run() + go h.AttachDeactivateCandidates() + go h.AttachDocumentHardDeletion() return nil } // Stop stops the housekeeping service. func (h *Housekeeping) Stop() error { h.cancelFunc() - return nil } -// run is the housekeeping loop. -func (h *Housekeeping) run() { +// AttachDeactivateCandidates is the housekeeping loop. +func (h *Housekeeping) AttachDeactivateCandidates() { housekeepingLastProjectID := database.DefaultProjectID for { @@ -117,6 +118,7 @@ func (h *Housekeeping) run() { logging.From(ctx).Error(err) continue } + housekeepingLastProjectID = lastProjectID select { @@ -127,6 +129,64 @@ func (h *Housekeeping) run() { } } +func (h *Housekeeping) AttachDocumentHardDeletion() { + housekeepingLastProjectID := database.DefaultProjectID + + for { + ctx := context.Background() + lastProjectID, err := h.documentHardDeletion(ctx, housekeepingLastProjectID) + if err != nil { + logging.From(ctx).Error(err) + continue + } + + housekeepingLastProjectID = lastProjectID + + select { + case <-time.After(h.interval): + case <-h.ctx.Done(): + return + } + } +} + +func (h *Housekeeping) documentHardDeletion( + ctx context.Context, + housekeepingLastProjectID types.ID, +) (types.ID, error) { + locker, err := h.coordinator.NewLocker(ctx, hardDeletionLockKey) + if err != nil { + return database.DefaultProjectID, err + } + if err := locker.Lock(ctx); err != nil { + return database.DefaultProjectID, err + } + defer func() { + if err := locker.Unlock(ctx); err != nil { + logging.From(ctx).Error(err) + } + }() + + lastProjectID, candidates, err := h.database.FindHardDeletionCandidates( + ctx, + h.candidatesLimitPerProject, + h.projectFetchSize, + housekeepingLastProjectID, + ) + + if err != nil { + return database.DefaultProjectID, err + } + + lastProjectID, err = h.database.HardDeletion(ctx, candidates) + + if err != nil { + return database.DefaultProjectID, err + } + + return lastProjectID, err +} + // deactivateCandidates deactivates candidates. func (h *Housekeeping) deactivateCandidates( ctx context.Context, @@ -148,6 +208,7 @@ func (h *Housekeeping) deactivateCandidates( } }() + // FindDeactivateCandidates 메서드를 호출하여 비활성화할 대상이 되는 후보(candidates)를 데이터베이스에서 조회합니다. lastProjectID, candidates, err := h.database.FindDeactivateCandidates( ctx, h.candidatesLimitPerProject, @@ -158,6 +219,9 @@ func (h *Housekeeping) deactivateCandidates( return database.DefaultProjectID, err } + //조회된 후보들에 대해서 for 루프를 사용해 순회하면서 각각을 비활성화합니다. + //clients.Deactivate 메서드를 사용하여 실제 비활성화 작업을 수행하고, + //그 결과를 deactivatedCount 변수에 누적하여 비활성화된 항목의 수를 추적합니다. deactivatedCount := 0 for _, clientInfo := range candidates { if _, err := clients.Deactivate( diff --git a/server/config.go b/server/config.go index 2fcc9b3ca..30ad929b6 100644 --- a/server/config.go +++ b/server/config.go @@ -40,9 +40,10 @@ const ( DefaultProfilingPort = 8081 - DefaultHousekeepingInterval = 30 * time.Second - DefaultHousekeepingCandidatesLimitPerProject = 500 - DefaultHousekeepingProjectFetchSize = 100 + DefaultHousekeepingInterval = 30 * time.Second + DefaultHousekeepingCandidatesLimitPerProject = 500 + DefaultHousekeepingHardDeletionLimitPerProject = 500 + DefaultHousekeepingProjectFetchSize = 100 DefaultMongoConnectionURI = "mongodb://localhost:27017" DefaultMongoConnectionTimeout = 5 * time.Second @@ -228,9 +229,10 @@ func newConfig(port int, profilingPort int) *Config { Port: profilingPort, }, Housekeeping: &housekeeping.Config{ - Interval: DefaultHousekeepingInterval.String(), - CandidatesLimitPerProject: DefaultHousekeepingCandidatesLimitPerProject, - ProjectFetchSize: DefaultHousekeepingProjectFetchSize, + Interval: DefaultHousekeepingInterval.String(), + CandidatesLimitPerProject: DefaultHousekeepingCandidatesLimitPerProject, + HardDeletionLimitPerProject: DefaultHousekeepingHardDeletionLimitPerProject, + ProjectFetchSize: DefaultHousekeepingProjectFetchSize, }, Backend: &backend.Config{ ClientDeactivateThreshold: DefaultClientDeactivateThreshold, diff --git a/server/config.sample.yml b/server/config.sample.yml index d5c72edbb..2fee64b8d 100644 --- a/server/config.sample.yml +++ b/server/config.sample.yml @@ -36,6 +36,9 @@ Housekeeping: # CandidatesLimitPerProject is the maximum number of candidates to be returned per project (default: 100). CandidatesLimitPerProject: 100 + # HardDeletionLimitPerProject is the maximum number of candidates to be returned per project (default: 100). + HardDeletionLimitPerProject: 100 + # ProjectFetchSize is the maximum number of projects to be returned to deactivate candidates. (default: 100). ProjectFetchSize: 100 From c310a6464d597c1d22be6dd0e6e89cf06595a14f Mon Sep 17 00:00:00 2001 From: yeongha Date: Sat, 6 Jan 2024 21:45:18 +0900 Subject: [PATCH 04/24] Modified function for document removal, added memdb-based function, removed unnecessary comments --- server/backend/database/database.go | 4 +- server/backend/database/memory/database.go | 74 +++++++++++++++++++-- server/backend/database/mongo/client.go | 41 +++++------- server/backend/housekeeping/housekeeping.go | 11 ++- 4 files changed, 90 insertions(+), 40 deletions(-) diff --git a/server/backend/database/database.go b/server/backend/database/database.go index eebb25e58..cb239105c 100644 --- a/server/backend/database/database.go +++ b/server/backend/database/database.go @@ -148,12 +148,12 @@ type Database interface { candidatesLimitPerProject int, projectFetchSize int, lastProjectID types.ID, - ) (types.ID, []*ClientInfo, error) + ) ([]*DocInfo, error) // HardDeletion Document complete deletion in progress HardDeletion( ctx context.Context, - candidates []*ClientInfo, + candidates []*DocInfo, ) (types.ID, error) // FindDocInfoByKey finds the document of the given key. diff --git a/server/backend/database/memory/database.go b/server/backend/database/memory/database.go index 7aed93f4a..617871419 100644 --- a/server/backend/database/memory/database.go +++ b/server/backend/database/memory/database.go @@ -563,6 +563,41 @@ func (d *DB) UpdateClientInfoAfterPushPull( return nil } +// findHardDeletionCandidatesPerProject finds the documents that need housekeeping per project. +func (d *DB) findHardDeletionCandidatesPerProject( + ctx context.Context, + project *database.ProjectInfo, + candidatesLimit int, +) ([]*database.DocInfo, error) { + + txn := d.db.Txn(false) + defer txn.Abort() + + var documents []*database.DocInfo + iterator, err := txn.Get( + tblProjects, + "project_id", + project.ID.String(), + ) + + if err != nil { + return nil, fmt.Errorf("fetch hard deletion candidates: %w", err) + } + + for raw := iterator.Next(); raw != nil; raw = iterator.Next() { + document := raw.(*database.DocInfo) + if candidatesLimit <= len(documents) { + break + } + + if !document.RemovedAt.IsZero() { + documents = append(documents, document) + } + } + + return documents, nil +} + // findDeactivateCandidatesPerProject finds the clients that need housekeeping per project. func (d *DB) findDeactivateCandidatesPerProject( _ context.Context, @@ -642,18 +677,45 @@ func (d *DB) FindHardDeletionCandidates( candidatesLimitPerProject int, projectFetchSize int, lastProjectID types.ID, -) (types.ID, []*database.ClientInfo, error) { - // TODO developing... - return "1", nil, nil +) ([]*database.DocInfo, error) { + projects, err := d.listProjectInfos(ctx, projectFetchSize, lastProjectID) + if err != nil { + return nil, err + } + + var candidates []*database.DocInfo + for _, project := range projects { + documents, err := d.findHardDeletionCandidatesPerProject(ctx, project, candidatesLimitPerProject) + if err != nil { + return nil, err + } + + candidates = append(candidates, documents...) + } + + return candidates, nil } // HardDeletion Deletes the documents completely. func (d *DB) HardDeletion( ctx context.Context, - candidates []*database.ClientInfo, + candidates []*database.DocInfo, ) (types.ID, error) { - // TODO developing... - return "1", nil + + var lastDeletedID types.ID + + txn := d.db.Txn(true) + defer txn.Abort() + + for _, candidate := range candidates { + if err := txn.Delete(tblDocuments, candidate); err != nil { + return database.DefaultProjectID, fmt.Errorf("fetch hard deletion candidates: %w", err) + } + lastDeletedID = candidate.ID + } + txn.Commit() + + return lastDeletedID, nil } // FindDocInfoByKeyAndOwner finds the document of the given key. If the diff --git a/server/backend/database/mongo/client.go b/server/backend/database/mongo/client.go index 2b01b959e..c7152f1f5 100644 --- a/server/backend/database/mongo/client.go +++ b/server/backend/database/mongo/client.go @@ -243,7 +243,7 @@ func (c *Client) CreateProjectInfo( // HardDeletion Deletes the documents completely. func (c *Client) HardDeletion( ctx context.Context, - candidates []*database.ClientInfo, + candidates []*database.DocInfo, ) (types.ID, error) { if len(candidates) <= 0 { return database.DefaultProjectID, nil @@ -659,31 +659,32 @@ func (c *Client) UpdateClientInfoAfterPushPull( return nil } -// FindHardDeletionCandidatesPerProject finds the clients that need housekeeping per project. -func (c *Client) FindHardDeletionCandidatesPerProject( +// findHardDeletionCandidatesPerProject finds the clients that need housekeeping per project. +func (c *Client) findHardDeletionCandidatesPerProject( ctx context.Context, project *database.ProjectInfo, candidatesLimit int, -) ([]*database.ClientInfo, error) { +) ([]*database.DocInfo, error) { encodedProjectID, err := encodeID(project.ID) if err != nil { return nil, err } - var clientInfos []*database.ClientInfo + var DocInfos []*database.DocInfo cursor, err := c.collection(colDocuments).Find(ctx, bson.M{ "project_id": encodedProjectID, - "deleted_at": bson.M{"$ne": nil}, + "removed_at": bson.M{"$ne": nil}, }, options.Find().SetLimit(int64(candidatesLimit))) if err != nil { - return nil, fmt.Errorf("find deactivate candidates: %w", err) + return nil, err } - if err := cursor.All(ctx, &clientInfos); err != nil { + if err := cursor.All(ctx, &DocInfos); err != nil { return nil, fmt.Errorf("fetch hard deletion candidates: %w", err) } - return clientInfos, nil + + return DocInfos, nil } // findDeactivateCandidatesPerProject finds the clients that need housekeeping per project. @@ -759,32 +760,22 @@ func (c *Client) FindHardDeletionCandidates( candidatesLimitPerProject int, projectFetchSize int, lastProjectID types.ID, -) (types.ID, []*database.ClientInfo, error) { +) ([]*database.DocInfo, error) { projects, err := c.listProjectInfos(ctx, projectFetchSize, lastProjectID) if err != nil { - return database.DefaultProjectID, nil, err + return nil, err } - var candidates []*database.ClientInfo + var candidates []*database.DocInfo for _, project := range projects { - clientInfos, err := c.FindHardDeletionCandidatesPerProject(ctx, project, candidatesLimitPerProject) + clientInfos, err := c.findHardDeletionCandidatesPerProject(ctx, project, candidatesLimitPerProject) if err != nil { - return database.DefaultProjectID, nil, err + return nil, err } candidates = append(candidates, clientInfos...) } - return c.DetermineTopProjectID(projects, projectFetchSize), candidates, nil -} - -func (c *Client) DetermineTopProjectID( - projects []*database.ProjectInfo, - projectFetchSize int, -) types.ID { - if len(projects) < projectFetchSize { - return database.DefaultProjectID - } - return projects[len(projects)-1].ID + return candidates, nil } // FindDocInfoByKeyAndOwner finds the document of the given key. If the diff --git a/server/backend/housekeeping/housekeeping.go b/server/backend/housekeeping/housekeeping.go index 945c1654f..7319d0b6d 100644 --- a/server/backend/housekeeping/housekeeping.go +++ b/server/backend/housekeeping/housekeeping.go @@ -107,7 +107,7 @@ func (h *Housekeeping) Stop() error { return nil } -// AttachDeactivateCandidates is the housekeeping loop. +// AttachDeactivateCandidates is the housekeeping loop for DeactivateCandidates func (h *Housekeeping) AttachDeactivateCandidates() { housekeepingLastProjectID := database.DefaultProjectID @@ -129,6 +129,7 @@ func (h *Housekeeping) AttachDeactivateCandidates() { } } +// AttachDocumentHardDeletion is the housekeeping loop for DocumentHardDeletion func (h *Housekeeping) AttachDocumentHardDeletion() { housekeepingLastProjectID := database.DefaultProjectID @@ -167,7 +168,7 @@ func (h *Housekeeping) documentHardDeletion( } }() - lastProjectID, candidates, err := h.database.FindHardDeletionCandidates( + candidates, err := h.database.FindHardDeletionCandidates( ctx, h.candidatesLimitPerProject, h.projectFetchSize, @@ -177,7 +178,7 @@ func (h *Housekeeping) documentHardDeletion( if err != nil { return database.DefaultProjectID, err } - + var lastProjectID types.ID lastProjectID, err = h.database.HardDeletion(ctx, candidates) if err != nil { @@ -208,7 +209,6 @@ func (h *Housekeeping) deactivateCandidates( } }() - // FindDeactivateCandidates 메서드를 호출하여 비활성화할 대상이 되는 후보(candidates)를 데이터베이스에서 조회합니다. lastProjectID, candidates, err := h.database.FindDeactivateCandidates( ctx, h.candidatesLimitPerProject, @@ -219,9 +219,6 @@ func (h *Housekeeping) deactivateCandidates( return database.DefaultProjectID, err } - //조회된 후보들에 대해서 for 루프를 사용해 순회하면서 각각을 비활성화합니다. - //clients.Deactivate 메서드를 사용하여 실제 비활성화 작업을 수행하고, - //그 결과를 deactivatedCount 변수에 누적하여 비활성화된 항목의 수를 추적합니다. deactivatedCount := 0 for _, clientInfo := range candidates { if _, err := clients.Deactivate( From 30c95b2aade80e7af63544654fffcd1cd17a5907 Mon Sep 17 00:00:00 2001 From: yeongha Date: Sun, 28 Jan 2024 16:30:53 +0900 Subject: [PATCH 05/24] Added HardDeletion testCode for MongoDB, Changed function return type and processing method related to hard deletion --- server/backend/database/database.go | 6 +- server/backend/database/memory/database.go | 31 +++--- server/backend/database/mongo/client.go | 36 ++++--- server/backend/database/mongo/client_test.go | 8 ++ .../backend/database/testcases/testcases.go | 95 +++++++++++++++++++ server/backend/housekeeping/housekeeping.go | 6 +- 6 files changed, 151 insertions(+), 31 deletions(-) diff --git a/server/backend/database/database.go b/server/backend/database/database.go index cb239105c..fc1929867 100644 --- a/server/backend/database/database.go +++ b/server/backend/database/database.go @@ -148,13 +148,13 @@ type Database interface { candidatesLimitPerProject int, projectFetchSize int, lastProjectID types.ID, - ) ([]*DocInfo, error) + ) (types.ID, []*DocInfo, error) // HardDeletion Document complete deletion in progress HardDeletion( ctx context.Context, - candidates []*DocInfo, - ) (types.ID, error) + candidate []*DocInfo, + ) error // FindDocInfoByKey finds the document of the given key. FindDocInfoByKey( diff --git a/server/backend/database/memory/database.go b/server/backend/database/memory/database.go index 617871419..667f4f772 100644 --- a/server/backend/database/memory/database.go +++ b/server/backend/database/memory/database.go @@ -677,45 +677,52 @@ func (d *DB) FindHardDeletionCandidates( candidatesLimitPerProject int, projectFetchSize int, lastProjectID types.ID, -) ([]*database.DocInfo, error) { +) (types.ID, []*database.DocInfo, error) { projects, err := d.listProjectInfos(ctx, projectFetchSize, lastProjectID) if err != nil { - return nil, err + return database.DefaultProjectID, nil, err } var candidates []*database.DocInfo for _, project := range projects { - documents, err := d.findHardDeletionCandidatesPerProject(ctx, project, candidatesLimitPerProject) + infos, err := d.findHardDeletionCandidatesPerProject(ctx, project, candidatesLimitPerProject) if err != nil { - return nil, err + return database.DefaultProjectID, nil, err } - candidates = append(candidates, documents...) + candidates = append(candidates, infos...) } - return candidates, nil + var topProjectID types.ID + if len(projects) < projectFetchSize { + topProjectID = database.DefaultProjectID + } else { + topProjectID = projects[len(projects)-1].ID + } + + return topProjectID, candidates, nil } // HardDeletion Deletes the documents completely. func (d *DB) HardDeletion( ctx context.Context, candidates []*database.DocInfo, -) (types.ID, error) { - - var lastDeletedID types.ID +) error { + if len(candidates) <= 0 { + return nil + } txn := d.db.Txn(true) defer txn.Abort() for _, candidate := range candidates { if err := txn.Delete(tblDocuments, candidate); err != nil { - return database.DefaultProjectID, fmt.Errorf("fetch hard deletion candidates: %w", err) + return fmt.Errorf("fetch hard deletion candidates: %w", err) } - lastDeletedID = candidate.ID } txn.Commit() - return lastDeletedID, nil + return nil } // FindDocInfoByKeyAndOwner finds the document of the given key. If the diff --git a/server/backend/database/mongo/client.go b/server/backend/database/mongo/client.go index c7152f1f5..b42167339 100644 --- a/server/backend/database/mongo/client.go +++ b/server/backend/database/mongo/client.go @@ -244,14 +244,18 @@ func (c *Client) CreateProjectInfo( func (c *Client) HardDeletion( ctx context.Context, candidates []*database.DocInfo, -) (types.ID, error) { +) error { if len(candidates) <= 0 { - return database.DefaultProjectID, nil + return nil } - var idList []types.ID - for _, candidate := range candidates { - idList = append(idList, candidate.ID) + var idList []primitive.ObjectID + for _, docInfo := range candidates { + encodedID, err := encodeID(docInfo.ID) + if err != nil { + return err + } + idList = append(idList, encodedID) } _, err := c.collection(colDocuments).DeleteMany( @@ -260,10 +264,10 @@ func (c *Client) HardDeletion( ) if err != nil { - return database.DefaultProjectID, fmt.Errorf("deletion Error : %w", err) + return fmt.Errorf("deletion Error : %w", err) } - return idList[len(idList)-1], nil + return nil } // listProjectInfos returns all project infos rotationally. @@ -760,22 +764,28 @@ func (c *Client) FindHardDeletionCandidates( candidatesLimitPerProject int, projectFetchSize int, lastProjectID types.ID, -) ([]*database.DocInfo, error) { +) (types.ID, []*database.DocInfo, error) { projects, err := c.listProjectInfos(ctx, projectFetchSize, lastProjectID) if err != nil { - return nil, err + return database.DefaultProjectID, nil, err } var candidates []*database.DocInfo for _, project := range projects { - clientInfos, err := c.findHardDeletionCandidatesPerProject(ctx, project, candidatesLimitPerProject) + docInfos, err := c.findHardDeletionCandidatesPerProject(ctx, project, candidatesLimitPerProject) if err != nil { - return nil, err + return database.DefaultProjectID, nil, err } - candidates = append(candidates, clientInfos...) + candidates = append(candidates, docInfos...) } - return candidates, nil + var topProjectID types.ID + if len(projects) < projectFetchSize { + topProjectID = database.DefaultProjectID + } else { + topProjectID = projects[len(projects)-1].ID + } + return topProjectID, candidates, nil } // FindDocInfoByKeyAndOwner finds the document of the given key. If the diff --git a/server/backend/database/mongo/client_test.go b/server/backend/database/mongo/client_test.go index 9eaf04034..0a3d3c351 100644 --- a/server/backend/database/mongo/client_test.go +++ b/server/backend/database/mongo/client_test.go @@ -104,4 +104,12 @@ func TestClient(t *testing.T) { t.Run("FindDeactivateCandidates test", func(t *testing.T) { testcases.RunFindDeactivateCandidates(t, cli) }) + + t.Run("FindHardDeletionCandidates test", func(t *testing.T) { + testcases.RunHardDeletionCandidates(t, cli) + }) + + t.Run("HardDeletion test", func(t *testing.T) { + testcases.RunHardDeletion(t, cli) + }) } diff --git a/server/backend/database/testcases/testcases.go b/server/backend/database/testcases/testcases.go index 3cc19121c..2d4b117c8 100644 --- a/server/backend/database/testcases/testcases.go +++ b/server/backend/database/testcases/testcases.go @@ -1074,3 +1074,98 @@ func RunIsDocumentAttachedTest(t *testing.T, db database.Database, projectID typ assert.False(t, attached) }) } + +// RunHardDeletionCandidates runs the find for HardDeletionCandidates tests for the given db. +func RunHardDeletionCandidates(t *testing.T, db database.Database) { + t.Run("housekeeping HardDeletions test", func(t *testing.T) { + ctx := context.Background() + + // Lists all projects of the dummyOwnerID and otherOwnerID. + projects, err := db.ListProjectInfos(ctx, dummyOwnerID) + assert.NoError(t, err) + otherProjects, err := db.ListProjectInfos(ctx, otherOwnerID) + assert.NoError(t, err) + + projects = append(projects, otherProjects...) + + sort.Slice(projects, func(i, j int) bool { + iBytes, err := projects[i].ID.Bytes() + assert.NoError(t, err) + jBytes, err := projects[j].ID.Bytes() + assert.NoError(t, err) + return bytes.Compare(iBytes, jBytes) < 0 + }) + + fetchSize := 3 + lastProjectID := database.DefaultProjectID + + for i := 0; i < len(projects)/fetchSize; i++ { + lastProjectID, _, err = db.FindHardDeletionCandidates( + ctx, + 0, + fetchSize, + lastProjectID, + ) + assert.NoError(t, err) + assert.Equal(t, projects[((i+1)*fetchSize)-1].ID, lastProjectID) + } + + lastProjectID, _, err = db.FindHardDeletionCandidates( + ctx, + 0, + fetchSize, + lastProjectID, + ) + assert.NoError(t, err) + assert.Equal(t, database.DefaultProjectID, lastProjectID) + + }) + +} + +// RunHardDeletion runs Delete document permanently +func RunHardDeletion(t *testing.T, db database.Database) { + t.Run("housekeeping HardDeletion test", func(t *testing.T) { + ctx := context.Background() + projectInfo, err := db.CreateProjectInfo(ctx, t.Name(), dummyOwnerID, clientDeactivateThreshold) + assert.NoError(t, err) + projectID := projectInfo.ID + + // Create a client and two documents + clientInfo, err := db.ActivateClient(ctx, projectID, t.Name()) + assert.NoError(t, err) + clientID := clientInfo.ID + docInfo, err := db.FindDocInfoByKeyAndOwner(ctx, projectID, clientID, helper.TestDocKey(t)+"kakaka", true) + assert.NoError(t, clientInfo.AttachDocument(docInfo.ID)) + assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) + + assert.NoError(t, clientInfo.RemoveDocument(docInfo.ID)) + + doc := document.New(key.Key(t.Name())) + pack := doc.CreateChangePack() + err = db.CreateChangeInfos(ctx, projectID, docInfo, 0, pack.Changes, true) + assert.NoError(t, err) + + fetchSize := 100 + lastProjectID := database.DefaultProjectID + + var candidates []*database.DocInfo + + lastProjectID, candidates, err = db.FindHardDeletionCandidates( + ctx, + 0, + fetchSize, + lastProjectID, + ) + assert.NoError(t, err) + assert.Equal(t, database.DefaultProjectID, lastProjectID) + + err = db.HardDeletion(ctx, candidates) + assert.NoError(t, err) + + _, err = db.FindDocInfoByID(context.Background(), projectID, docInfo.ID) + assert.ErrorIs(t, err, database.ErrDocumentNotFound) + + }) + +} diff --git a/server/backend/housekeeping/housekeeping.go b/server/backend/housekeeping/housekeeping.go index 7319d0b6d..c409d5294 100644 --- a/server/backend/housekeeping/housekeeping.go +++ b/server/backend/housekeeping/housekeeping.go @@ -168,7 +168,7 @@ func (h *Housekeeping) documentHardDeletion( } }() - candidates, err := h.database.FindHardDeletionCandidates( + lastProjectID, candidates, err := h.database.FindHardDeletionCandidates( ctx, h.candidatesLimitPerProject, h.projectFetchSize, @@ -178,8 +178,8 @@ func (h *Housekeeping) documentHardDeletion( if err != nil { return database.DefaultProjectID, err } - var lastProjectID types.ID - lastProjectID, err = h.database.HardDeletion(ctx, candidates) + + err = h.database.HardDeletion(ctx, candidates) if err != nil { return database.DefaultProjectID, err From 6eadd87b877ae1ce3ef7af068a302d9a4e5e4d13 Mon Sep 17 00:00:00 2001 From: yeongha Date: Mon, 29 Jan 2024 00:28:23 +0900 Subject: [PATCH 06/24] Added Hard Deletion test Code for MemoryDB and MemoryDB Based Function Update --- server/backend/database/memory/database.go | 4 +- .../database/memory/housekeeping_test.go | 88 ++++++++++++++++++- server/backend/database/memory/indexes.go | 5 ++ 3 files changed, 93 insertions(+), 4 deletions(-) diff --git a/server/backend/database/memory/database.go b/server/backend/database/memory/database.go index 667f4f772..540b4b647 100644 --- a/server/backend/database/memory/database.go +++ b/server/backend/database/memory/database.go @@ -575,7 +575,7 @@ func (d *DB) findHardDeletionCandidatesPerProject( var documents []*database.DocInfo iterator, err := txn.Get( - tblProjects, + tblDocuments, "project_id", project.ID.String(), ) @@ -586,7 +586,7 @@ func (d *DB) findHardDeletionCandidatesPerProject( for raw := iterator.Next(); raw != nil; raw = iterator.Next() { document := raw.(*database.DocInfo) - if candidatesLimit <= len(documents) { + if candidatesLimit <= len(documents) && candidatesLimit != 0 { break } diff --git a/server/backend/database/memory/housekeeping_test.go b/server/backend/database/memory/housekeeping_test.go index 5c1aeaeb0..be35f3ecf 100644 --- a/server/backend/database/memory/housekeeping_test.go +++ b/server/backend/database/memory/housekeeping_test.go @@ -21,6 +21,9 @@ package memory_test import ( "context" "fmt" + "github.com/yorkie-team/yorkie/pkg/document" + "github.com/yorkie-team/yorkie/pkg/document/key" + "github.com/yorkie-team/yorkie/test/helper" "log" "testing" gotime "time" @@ -78,7 +81,7 @@ func TestHousekeeping(t *testing.T) { t.Run("housekeeping pagination test", func(t *testing.T) { ctx := context.Background() - memdb, projects := createDBandProjects(t) + memdb, projects := CreateDBandProjects(t) fetchSize := 4 lastProjectID, _, err := memdb.FindDeactivateCandidates( @@ -108,9 +111,54 @@ func TestHousekeeping(t *testing.T) { assert.NoError(t, err) assert.Equal(t, database.DefaultProjectID, lastProjectID) }) + + t.Run("housekeeping hardDeletion test", func(t *testing.T) { + ctx := context.Background() + memdb, projects := CreateDBandProjects(t) + + memdb = CreateClientsAndDocuments(t, memdb, projects, true) + fetchSize := 4 + lastProjectID, _, err := memdb.FindHardDeletionCandidates( + ctx, + 0, + fetchSize, + database.DefaultProjectID, + ) + assert.NoError(t, err) + assert.Equal(t, projects[fetchSize-1].ID, lastProjectID) + + lastProjectID, _, err = memdb.FindHardDeletionCandidates( + ctx, + 0, + fetchSize, + lastProjectID, + ) + assert.NoError(t, err) + assert.Equal(t, projects[fetchSize*2-1].ID, lastProjectID) + + var candidates []*database.DocInfo + lastProjectID, candidates, err = memdb.FindHardDeletionCandidates( + ctx, + 0, + fetchSize, + lastProjectID, + ) + assert.NoError(t, err) + assert.Equal(t, database.DefaultProjectID, lastProjectID) + + memdb.HardDeletion(ctx, candidates) + assert.NoError(t, err) + assert.Equal(t, database.DefaultProjectID, lastProjectID) + for _, docInfo := range candidates { + _, err = memdb.FindDocInfoByID(context.Background(), projectID, docInfo.ID) + assert.ErrorIs(t, err, database.ErrDocumentNotFound) + } + }) + } -func createDBandProjects(t *testing.T) (*memory.DB, []*database.ProjectInfo) { +// CreateDBandProjects Create a MemoryDB based Projects +func CreateDBandProjects(t *testing.T) (*memory.DB, []*database.ProjectInfo) { t.Helper() ctx := context.Background() @@ -131,3 +179,39 @@ func createDBandProjects(t *testing.T) (*memory.DB, []*database.ProjectInfo) { return memdb, projects } + +// CreateClientsAndDocuments Create a MemoryDB based documents or deleted documents +func CreateClientsAndDocuments( + t *testing.T, + memdb *memory.DB, + projects []*database.ProjectInfo, + deleteDoc bool, +) *memory.DB { + ctx := context.Background() + docKey := helper.TestDocKey(t) + t.Helper() + + for _, project := range projects { + clientInfo, err := memdb.ActivateClient(ctx, project.ID, t.Name()) + assert.NoError(t, err) + + docInfo, err := memdb.FindDocInfoByKeyAndOwner(ctx, project.ID, clientInfo.ID, docKey, true) + assert.NoError(t, err) + + memdb.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo) + assert.NoError(t, clientInfo.AttachDocument(docInfo.ID)) + assert.NoError(t, memdb.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) + + if deleteDoc { + assert.NoError(t, clientInfo.RemoveDocument(docInfo.ID)) + + doc := document.New(key.Key(t.Name())) + pack := doc.CreateChangePack() + err = memdb.CreateChangeInfos(ctx, project.ID, docInfo, 0, pack.Changes, true) + assert.NoError(t, err) + } + } + + return memdb + +} diff --git a/server/backend/database/memory/indexes.go b/server/backend/database/memory/indexes.go index c30c352b4..4d7f1c996 100644 --- a/server/backend/database/memory/indexes.go +++ b/server/backend/database/memory/indexes.go @@ -117,6 +117,11 @@ var schema = &memdb.DBSchema{ Unique: true, Indexer: &memdb.StringFieldIndex{Field: "ID"}, }, + "project_id": { + Name: "project_id", + Unique: true, + Indexer: &memdb.StringFieldIndex{Field: "ProjectID"}, + }, "project_id_id": { Name: "project_id_id", Unique: true, From 5367c348eeb00fc7449500ebc9e932e9a4c132c1 Mon Sep 17 00:00:00 2001 From: yeongha Date: Mon, 29 Jan 2024 00:54:46 +0900 Subject: [PATCH 07/24] update default Hard Deletion Limit Per Project Value 100 -> 500 --- server/config.sample.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/config.sample.yml b/server/config.sample.yml index 2fee64b8d..f97d0b491 100644 --- a/server/config.sample.yml +++ b/server/config.sample.yml @@ -36,8 +36,8 @@ Housekeeping: # CandidatesLimitPerProject is the maximum number of candidates to be returned per project (default: 100). CandidatesLimitPerProject: 100 - # HardDeletionLimitPerProject is the maximum number of candidates to be returned per project (default: 100). - HardDeletionLimitPerProject: 100 + # HardDeletionLimitPerProject is the maximum number of candidates to be returned per project (default: 500). + HardDeletionLimitPerProject: 500 # ProjectFetchSize is the maximum number of projects to be returned to deactivate candidates. (default: 100). ProjectFetchSize: 100 From 7daf5def944b9ce95e87e764ea682af6648b27ec Mon Sep 17 00:00:00 2001 From: yeongha Date: Mon, 29 Jan 2024 23:30:54 +0900 Subject: [PATCH 08/24] Changed and Deleted all functions and test code to match the changed housekeeping structure. --- cmd/yorkie/server.go | 8 +- server/backend/database/database.go | 8 +- server/backend/database/memory/database.go | 16 +- .../backend/database/memory/database_test.go | 4 + .../database/memory/housekeeping_test.go | 217 ------------------ server/backend/database/mongo/client.go | 24 +- server/backend/database/mongo/client_test.go | 12 +- .../backend/database/testcases/testcases.go | 63 +---- server/backend/housekeeping/config.go | 4 +- server/backend/housekeeping/housekeeping.go | 10 +- server/config.go | 16 +- server/config.sample.yml | 4 +- 12 files changed, 58 insertions(+), 328 deletions(-) delete mode 100644 server/backend/database/memory/housekeeping_test.go diff --git a/cmd/yorkie/server.go b/cmd/yorkie/server.go index 2cda9e9ec..d728a3d70 100644 --- a/cmd/yorkie/server.go +++ b/cmd/yorkie/server.go @@ -206,10 +206,10 @@ func init() { "candidates limit per project for a single housekeeping run", ) cmd.Flags().IntVar( - &conf.Housekeeping.HardDeletionLimitPerProject, - "housekeeping-HardDeletion-limit-per-project", - server.DefaultHousekeepingHardDeletionLimitPerProject, - "hardDeletion limit per project for a single housekeeping run", + &conf.Housekeeping.DocumentHardDeletionLimitPerProject, + "housekeeping-DocumentHardDeletion-limit-per-project", + server.DefaultHousekeepingDocumentHardDeletionLimitPerProject, + "DocumentHardDeletion limit per project for a single housekeeping run", ) cmd.Flags().IntVar( &conf.Housekeeping.ProjectFetchSize, diff --git a/server/backend/database/database.go b/server/backend/database/database.go index 7704bfaba..a3314391b 100644 --- a/server/backend/database/database.go +++ b/server/backend/database/database.go @@ -157,16 +157,16 @@ type Database interface { candidatesLimit int, ) ([]*ClientInfo, error) - // FindHardDeletionCandidates finds the housekeeping deletion candidates. - FindHardDeletionCandidates( + // FindDocumentHardDeletionCandidates finds the housekeeping deletion candidates. + FindDocumentHardDeletionCandidates( ctx context.Context, candidatesLimitPerProject int, projectFetchSize int, lastProjectID types.ID, ) (types.ID, []*DocInfo, error) - // HardDeletion Document complete deletion in progress - HardDeletion( + // DocumentHardDeletion Document complete deletion in progress + DocumentHardDeletion( ctx context.Context, candidate []*DocInfo, ) error diff --git a/server/backend/database/memory/database.go b/server/backend/database/memory/database.go index 91fbfe381..688f7b651 100644 --- a/server/backend/database/memory/database.go +++ b/server/backend/database/memory/database.go @@ -619,8 +619,8 @@ func (d *DB) UpdateClientInfoAfterPushPull( return nil } -// findHardDeletionCandidatesPerProject finds the documents that need housekeeping per project. -func (d *DB) findHardDeletionCandidatesPerProject( +// FindDocumentHardDeletionCandidatesPerProject finds the documents that need housekeeping per project. +func (d *DB) FindDocumentHardDeletionCandidatesPerProject( ctx context.Context, project *database.ProjectInfo, candidatesLimit int, @@ -698,21 +698,21 @@ func (d *DB) FindDeactivateCandidatesPerProject( return infos, nil } -// FindHardDeletionCandidates finds the clients that need housekeeping. -func (d *DB) FindHardDeletionCandidates( +// FindDocumentHardDeletionCandidates finds the clients that need housekeeping. +func (d *DB) FindDocumentHardDeletionCandidates( ctx context.Context, candidatesLimitPerProject int, projectFetchSize int, lastProjectID types.ID, ) (types.ID, []*database.DocInfo, error) { - projects, err := d.listProjectInfos(ctx, projectFetchSize, lastProjectID) + projects, err := d.FindNextNCyclingProjectInfos(ctx, projectFetchSize, lastProjectID) if err != nil { return database.DefaultProjectID, nil, err } var candidates []*database.DocInfo for _, project := range projects { - infos, err := d.findHardDeletionCandidatesPerProject(ctx, project, candidatesLimitPerProject) + infos, err := d.FindDocumentHardDeletionCandidatesPerProject(ctx, project, candidatesLimitPerProject) if err != nil { return database.DefaultProjectID, nil, err } @@ -730,8 +730,8 @@ func (d *DB) FindHardDeletionCandidates( return topProjectID, candidates, nil } -// HardDeletion Deletes the documents completely. -func (d *DB) HardDeletion( +// DocumentHardDeletion Deletes the documents completely. +func (d *DB) DocumentHardDeletion( ctx context.Context, candidates []*database.DocInfo, ) error { diff --git a/server/backend/database/memory/database_test.go b/server/backend/database/memory/database_test.go index cc36ce8f7..ba4a71499 100644 --- a/server/backend/database/memory/database_test.go +++ b/server/backend/database/memory/database_test.go @@ -103,4 +103,8 @@ func TestDB(t *testing.T) { t.Run("IsDocumentAttached test", func(t *testing.T) { testcases.RunIsDocumentAttachedTest(t, db, projectID) }) + + t.Run("DocumentHardDeletion test", func(t *testing.T) { + testcases.RunDocumentHardDeletion(t, db) + }) } diff --git a/server/backend/database/memory/housekeeping_test.go b/server/backend/database/memory/housekeeping_test.go deleted file mode 100644 index be35f3ecf..000000000 --- a/server/backend/database/memory/housekeeping_test.go +++ /dev/null @@ -1,217 +0,0 @@ -//go:build amd64 - -/* - * Copyright 2022 The Yorkie Authors. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package memory_test - -import ( - "context" - "fmt" - "github.com/yorkie-team/yorkie/pkg/document" - "github.com/yorkie-team/yorkie/pkg/document/key" - "github.com/yorkie-team/yorkie/test/helper" - "log" - "testing" - gotime "time" - - "github.com/stretchr/testify/assert" - monkey "github.com/undefinedlabs/go-mpatch" - - "github.com/yorkie-team/yorkie/server/backend/database" - "github.com/yorkie-team/yorkie/server/backend/database/memory" -) - -func TestHousekeeping(t *testing.T) { - memdb, err := memory.New() - assert.NoError(t, err) - - t.Run("housekeeping test", func(t *testing.T) { - ctx := context.Background() - - clientDeactivateThreshold := "23h" - - userInfo, err := memdb.CreateUserInfo(ctx, "test", "test") - assert.NoError(t, err) - project, err := memdb.CreateProjectInfo(ctx, database.DefaultProjectName, userInfo.ID, clientDeactivateThreshold) - assert.NoError(t, err) - - yesterday := gotime.Now().Add(-24 * gotime.Hour) - patch, err := monkey.PatchMethod(gotime.Now, func() gotime.Time { return yesterday }) - if err != nil { - log.Fatal(err) - } - clientA, err := memdb.ActivateClient(ctx, project.ID, fmt.Sprintf("%s-A", t.Name())) - assert.NoError(t, err) - clientB, err := memdb.ActivateClient(ctx, project.ID, fmt.Sprintf("%s-B", t.Name())) - assert.NoError(t, err) - err = patch.Unpatch() - if err != nil { - log.Fatal(err) - } - - clientC, err := memdb.ActivateClient(ctx, project.ID, fmt.Sprintf("%s-C", t.Name())) - assert.NoError(t, err) - - _, candidates, err := memdb.FindDeactivateCandidates( - ctx, - 10, - 10, - database.DefaultProjectID, - ) - assert.NoError(t, err) - assert.Len(t, candidates, 2) - assert.Contains(t, candidates, clientA) - assert.Contains(t, candidates, clientB) - assert.NotContains(t, candidates, clientC) - }) - - t.Run("housekeeping pagination test", func(t *testing.T) { - ctx := context.Background() - memdb, projects := CreateDBandProjects(t) - - fetchSize := 4 - lastProjectID, _, err := memdb.FindDeactivateCandidates( - ctx, - 0, - fetchSize, - database.DefaultProjectID, - ) - assert.NoError(t, err) - assert.Equal(t, projects[fetchSize-1].ID, lastProjectID) - - lastProjectID, _, err = memdb.FindDeactivateCandidates( - ctx, - 0, - fetchSize, - lastProjectID, - ) - assert.NoError(t, err) - assert.Equal(t, projects[fetchSize*2-1].ID, lastProjectID) - - lastProjectID, _, err = memdb.FindDeactivateCandidates( - ctx, - 0, - fetchSize, - lastProjectID, - ) - assert.NoError(t, err) - assert.Equal(t, database.DefaultProjectID, lastProjectID) - }) - - t.Run("housekeeping hardDeletion test", func(t *testing.T) { - ctx := context.Background() - memdb, projects := CreateDBandProjects(t) - - memdb = CreateClientsAndDocuments(t, memdb, projects, true) - fetchSize := 4 - lastProjectID, _, err := memdb.FindHardDeletionCandidates( - ctx, - 0, - fetchSize, - database.DefaultProjectID, - ) - assert.NoError(t, err) - assert.Equal(t, projects[fetchSize-1].ID, lastProjectID) - - lastProjectID, _, err = memdb.FindHardDeletionCandidates( - ctx, - 0, - fetchSize, - lastProjectID, - ) - assert.NoError(t, err) - assert.Equal(t, projects[fetchSize*2-1].ID, lastProjectID) - - var candidates []*database.DocInfo - lastProjectID, candidates, err = memdb.FindHardDeletionCandidates( - ctx, - 0, - fetchSize, - lastProjectID, - ) - assert.NoError(t, err) - assert.Equal(t, database.DefaultProjectID, lastProjectID) - - memdb.HardDeletion(ctx, candidates) - assert.NoError(t, err) - assert.Equal(t, database.DefaultProjectID, lastProjectID) - for _, docInfo := range candidates { - _, err = memdb.FindDocInfoByID(context.Background(), projectID, docInfo.ID) - assert.ErrorIs(t, err, database.ErrDocumentNotFound) - } - }) - -} - -// CreateDBandProjects Create a MemoryDB based Projects -func CreateDBandProjects(t *testing.T) (*memory.DB, []*database.ProjectInfo) { - t.Helper() - - ctx := context.Background() - memdb, err := memory.New() - assert.NoError(t, err) - - clientDeactivateThreshold := "23h" - userInfo, err := memdb.CreateUserInfo(ctx, "test", "test") - assert.NoError(t, err) - - projects := make([]*database.ProjectInfo, 0) - for i := 0; i < 10; i++ { - p, err := memdb.CreateProjectInfo(ctx, fmt.Sprintf("%d project", i), userInfo.ID, clientDeactivateThreshold) - assert.NoError(t, err) - - projects = append(projects, p) - } - - return memdb, projects -} - -// CreateClientsAndDocuments Create a MemoryDB based documents or deleted documents -func CreateClientsAndDocuments( - t *testing.T, - memdb *memory.DB, - projects []*database.ProjectInfo, - deleteDoc bool, -) *memory.DB { - ctx := context.Background() - docKey := helper.TestDocKey(t) - t.Helper() - - for _, project := range projects { - clientInfo, err := memdb.ActivateClient(ctx, project.ID, t.Name()) - assert.NoError(t, err) - - docInfo, err := memdb.FindDocInfoByKeyAndOwner(ctx, project.ID, clientInfo.ID, docKey, true) - assert.NoError(t, err) - - memdb.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo) - assert.NoError(t, clientInfo.AttachDocument(docInfo.ID)) - assert.NoError(t, memdb.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) - - if deleteDoc { - assert.NoError(t, clientInfo.RemoveDocument(docInfo.ID)) - - doc := document.New(key.Key(t.Name())) - pack := doc.CreateChangePack() - err = memdb.CreateChangeInfos(ctx, project.ID, docInfo, 0, pack.Changes, true) - assert.NoError(t, err) - } - } - - return memdb - -} diff --git a/server/backend/database/mongo/client.go b/server/backend/database/mongo/client.go index 9c3ed4f18..fa3d27a9a 100644 --- a/server/backend/database/mongo/client.go +++ b/server/backend/database/mongo/client.go @@ -227,8 +227,8 @@ func (c *Client) CreateProjectInfo( return info, nil } -// HardDeletion Deletes the documents completely. -func (c *Client) HardDeletion( +// DocumentHardDeletion Deletes the documents completely. +func (c *Client) DocumentHardDeletion( ctx context.Context, candidates []*database.DocInfo, ) error { @@ -245,7 +245,7 @@ func (c *Client) HardDeletion( idList = append(idList, encodedID) } - _, err := c.collection(colDocuments).DeleteMany( + _, err := c.collection(ColDocuments).DeleteMany( ctx, bson.M{"_id": bson.M{"$in": idList}}, ) @@ -649,8 +649,8 @@ func (c *Client) UpdateClientInfoAfterPushPull( return nil } -// findHardDeletionCandidatesPerProject finds the clients that need housekeeping per project. -func (c *Client) findHardDeletionCandidatesPerProject( +// FindDocumentHardDeletionCandidatesPerProject finds the clients that need housekeeping per project. +func (c *Client) FindDocumentHardDeletionCandidatesPerProject( ctx context.Context, project *database.ProjectInfo, candidatesLimit int, @@ -661,7 +661,7 @@ func (c *Client) findHardDeletionCandidatesPerProject( } var DocInfos []*database.DocInfo - cursor, err := c.collection(colDocuments).Find(ctx, bson.M{ + cursor, err := c.collection(ColDocuments).Find(ctx, bson.M{ "project_id": encodedProjectID, "removed_at": bson.M{"$ne": nil}, }, options.Find().SetLimit(int64(candidatesLimit))) @@ -715,14 +715,14 @@ func (c *Client) FindDeactivateCandidates( projectFetchSize int, lastProjectID types.ID, ) (types.ID, []*database.ClientInfo, error) { - projects, err := c.listProjectInfos(ctx, projectFetchSize, lastProjectID) + projects, err := c.FindNextNCyclingProjectInfos(ctx, projectFetchSize, lastProjectID) if err != nil { return database.DefaultProjectID, nil, err } var candidates []*database.ClientInfo for _, project := range projects { - clientInfos, err := c.findDeactivateCandidatesPerProject(ctx, project, candidatesLimitPerProject) + clientInfos, err := c.FindDeactivateCandidatesPerProject(ctx, project, candidatesLimitPerProject) if err != nil { return database.DefaultProjectID, nil, err } @@ -739,21 +739,21 @@ func (c *Client) FindDeactivateCandidates( return topProjectID, candidates, nil } -// FindHardDeletionCandidates finds the clients that need housekeeping. -func (c *Client) FindHardDeletionCandidates( +// FindDocumentHardDeletionCandidates finds the clients that need housekeeping. +func (c *Client) FindDocumentHardDeletionCandidates( ctx context.Context, candidatesLimitPerProject int, projectFetchSize int, lastProjectID types.ID, ) (types.ID, []*database.DocInfo, error) { - projects, err := c.listProjectInfos(ctx, projectFetchSize, lastProjectID) + projects, err := c.FindNextNCyclingProjectInfos(ctx, projectFetchSize, lastProjectID) if err != nil { return database.DefaultProjectID, nil, err } var candidates []*database.DocInfo for _, project := range projects { - docInfos, err := c.findHardDeletionCandidatesPerProject(ctx, project, candidatesLimitPerProject) + docInfos, err := c.FindDocumentHardDeletionCandidatesPerProject(ctx, project, candidatesLimitPerProject) if err != nil { return database.DefaultProjectID, nil, err } diff --git a/server/backend/database/mongo/client_test.go b/server/backend/database/mongo/client_test.go index 582125f19..b3c404518 100644 --- a/server/backend/database/mongo/client_test.go +++ b/server/backend/database/mongo/client_test.go @@ -121,15 +121,7 @@ func TestClient(t *testing.T) { testcases.RunIsDocumentAttachedTest(t, cli, dummyProjectID) }) - t.Run("FindDeactivateCandidates test", func(t *testing.T) { - testcases.RunFindDeactivateCandidates(t, cli) - }) - - t.Run("FindHardDeletionCandidates test", func(t *testing.T) { - testcases.RunHardDeletionCandidates(t, cli) - }) - - t.Run("HardDeletion test", func(t *testing.T) { - testcases.RunHardDeletion(t, cli) + t.Run("DocumentHardDeletion test", func(t *testing.T) { + testcases.RunDocumentHardDeletion(t, cli) }) } diff --git a/server/backend/database/testcases/testcases.go b/server/backend/database/testcases/testcases.go index 4d823feeb..9326714eb 100644 --- a/server/backend/database/testcases/testcases.go +++ b/server/backend/database/testcases/testcases.go @@ -1215,57 +1215,9 @@ func AssertKeys(t *testing.T, expectedKeys []key.Key, infos []*database.DocInfo) assert.EqualValues(t, expectedKeys, keys) } -// RunHardDeletionCandidates runs the find for HardDeletionCandidates tests for the given db. -func RunHardDeletionCandidates(t *testing.T, db database.Database) { - t.Run("housekeeping HardDeletions test", func(t *testing.T) { - ctx := context.Background() - - // Lists all projects of the dummyOwnerID and otherOwnerID. - projects, err := db.ListProjectInfos(ctx, dummyOwnerID) - assert.NoError(t, err) - otherProjects, err := db.ListProjectInfos(ctx, otherOwnerID) - assert.NoError(t, err) - - projects = append(projects, otherProjects...) - - sort.Slice(projects, func(i, j int) bool { - iBytes, err := projects[i].ID.Bytes() - assert.NoError(t, err) - jBytes, err := projects[j].ID.Bytes() - assert.NoError(t, err) - return bytes.Compare(iBytes, jBytes) < 0 - }) - - fetchSize := 3 - lastProjectID := database.DefaultProjectID - - for i := 0; i < len(projects)/fetchSize; i++ { - lastProjectID, _, err = db.FindHardDeletionCandidates( - ctx, - 0, - fetchSize, - lastProjectID, - ) - assert.NoError(t, err) - assert.Equal(t, projects[((i+1)*fetchSize)-1].ID, lastProjectID) - } - - lastProjectID, _, err = db.FindHardDeletionCandidates( - ctx, - 0, - fetchSize, - lastProjectID, - ) - assert.NoError(t, err) - assert.Equal(t, database.DefaultProjectID, lastProjectID) - - }) - -} - -// RunHardDeletion runs Delete document permanently -func RunHardDeletion(t *testing.T, db database.Database) { - t.Run("housekeeping HardDeletion test", func(t *testing.T) { +// RunDocumentHardDeletion runs Delete document permanently +func RunDocumentHardDeletion(t *testing.T, db database.Database) { + t.Run("housekeeping DocumentHardDeletion test", func(t *testing.T) { ctx := context.Background() projectInfo, err := db.CreateProjectInfo(ctx, t.Name(), dummyOwnerID, clientDeactivateThreshold) assert.NoError(t, err) @@ -1274,8 +1226,7 @@ func RunHardDeletion(t *testing.T, db database.Database) { // Create a client and two documents clientInfo, err := db.ActivateClient(ctx, projectID, t.Name()) assert.NoError(t, err) - clientID := clientInfo.ID - docInfo, err := db.FindDocInfoByKeyAndOwner(ctx, projectID, clientID, helper.TestDocKey(t)+"kakaka", true) + docInfo, err := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), helper.TestDocKey(t), true) assert.NoError(t, clientInfo.AttachDocument(docInfo.ID)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) @@ -1291,7 +1242,7 @@ func RunHardDeletion(t *testing.T, db database.Database) { var candidates []*database.DocInfo - lastProjectID, candidates, err = db.FindHardDeletionCandidates( + lastProjectID, candidates, err = db.FindDocumentHardDeletionCandidates( ctx, 0, fetchSize, @@ -1300,10 +1251,10 @@ func RunHardDeletion(t *testing.T, db database.Database) { assert.NoError(t, err) assert.Equal(t, database.DefaultProjectID, lastProjectID) - err = db.HardDeletion(ctx, candidates) + err = db.DocumentHardDeletion(ctx, candidates) assert.NoError(t, err) - _, err = db.FindDocInfoByID(context.Background(), projectID, docInfo.ID) + _, err = db.FindDocInfoByRefKey(ctx, docInfo.RefKey()) assert.ErrorIs(t, err, database.ErrDocumentNotFound) }) diff --git a/server/backend/housekeeping/config.go b/server/backend/housekeeping/config.go index f220d4bab..e8a24cd65 100644 --- a/server/backend/housekeeping/config.go +++ b/server/backend/housekeeping/config.go @@ -29,8 +29,8 @@ type Config struct { // CandidatesLimitPerProject is the maximum number of candidates to be returned per project. CandidatesLimitPerProject int `yaml:"CandidatesLimitPerProject"` - // HardDeletionLimitPerProject is the maximum number of candidates to be returned per project. - HardDeletionLimitPerProject int `yaml:"HardDeletionLimitPerProject"` + // DocumentHardDeletionLimitPerProject is the maximum number of candidates to be returned per project. + DocumentHardDeletionLimitPerProject int `yaml:"DocumentHardDeletionLimitPerProject"` // ProjectFetchSize is the maximum number of projects to be returned to deactivate candidates. ProjectFetchSize int `yaml:"HousekeepingProjectFetchSize"` diff --git a/server/backend/housekeeping/housekeeping.go b/server/backend/housekeeping/housekeeping.go index 1e822fe36..7bfdba427 100644 --- a/server/backend/housekeeping/housekeeping.go +++ b/server/backend/housekeeping/housekeeping.go @@ -32,8 +32,8 @@ import ( ) const ( - deactivateCandidatesKey = "housekeeping/deactivateCandidates" - hardDeletionLockKey = "housekeeping/hardDeletionLock" + deactivateCandidatesKey = "housekeeping/deactivateCandidates" + DocumentHardDeletionLockKey = "housekeeping/DocumentHardDeletionLock" ) // Housekeeping is the housekeeping service. It periodically runs housekeeping @@ -155,7 +155,7 @@ func (h *Housekeeping) documentHardDeletion( ctx context.Context, housekeepingLastProjectID types.ID, ) (types.ID, error) { - locker, err := h.coordinator.NewLocker(ctx, hardDeletionLockKey) + locker, err := h.coordinator.NewLocker(ctx, DocumentHardDeletionLockKey) if err != nil { return database.DefaultProjectID, err } @@ -168,7 +168,7 @@ func (h *Housekeeping) documentHardDeletion( } }() - lastProjectID, candidates, err := h.database.FindHardDeletionCandidates( + lastProjectID, candidates, err := h.database.FindDocumentHardDeletionCandidates( ctx, h.candidatesLimitPerProject, h.projectFetchSize, @@ -179,7 +179,7 @@ func (h *Housekeeping) documentHardDeletion( return database.DefaultProjectID, err } - err = h.database.HardDeletion(ctx, candidates) + err = h.database.DocumentHardDeletion(ctx, candidates) if err != nil { return database.DefaultProjectID, err diff --git a/server/config.go b/server/config.go index 30ad929b6..e2497c856 100644 --- a/server/config.go +++ b/server/config.go @@ -40,10 +40,10 @@ const ( DefaultProfilingPort = 8081 - DefaultHousekeepingInterval = 30 * time.Second - DefaultHousekeepingCandidatesLimitPerProject = 500 - DefaultHousekeepingHardDeletionLimitPerProject = 500 - DefaultHousekeepingProjectFetchSize = 100 + DefaultHousekeepingInterval = 30 * time.Second + DefaultHousekeepingCandidatesLimitPerProject = 500 + DefaultHousekeepingDocumentHardDeletionLimitPerProject = 500 + DefaultHousekeepingProjectFetchSize = 100 DefaultMongoConnectionURI = "mongodb://localhost:27017" DefaultMongoConnectionTimeout = 5 * time.Second @@ -229,10 +229,10 @@ func newConfig(port int, profilingPort int) *Config { Port: profilingPort, }, Housekeeping: &housekeeping.Config{ - Interval: DefaultHousekeepingInterval.String(), - CandidatesLimitPerProject: DefaultHousekeepingCandidatesLimitPerProject, - HardDeletionLimitPerProject: DefaultHousekeepingHardDeletionLimitPerProject, - ProjectFetchSize: DefaultHousekeepingProjectFetchSize, + Interval: DefaultHousekeepingInterval.String(), + CandidatesLimitPerProject: DefaultHousekeepingCandidatesLimitPerProject, + DocumentHardDeletionLimitPerProject: DefaultHousekeepingDocumentHardDeletionLimitPerProject, + ProjectFetchSize: DefaultHousekeepingProjectFetchSize, }, Backend: &backend.Config{ ClientDeactivateThreshold: DefaultClientDeactivateThreshold, diff --git a/server/config.sample.yml b/server/config.sample.yml index f97d0b491..811db603a 100644 --- a/server/config.sample.yml +++ b/server/config.sample.yml @@ -36,8 +36,8 @@ Housekeeping: # CandidatesLimitPerProject is the maximum number of candidates to be returned per project (default: 100). CandidatesLimitPerProject: 100 - # HardDeletionLimitPerProject is the maximum number of candidates to be returned per project (default: 500). - HardDeletionLimitPerProject: 500 + # DocumentHardDeletionLimitPerProject is the maximum number of candidates to be returned per project (default: 500). + DocumentHardDeletionLimitPerProject: 500 # ProjectFetchSize is the maximum number of projects to be returned to deactivate candidates. (default: 100). ProjectFetchSize: 100 From 764babdc3cdcd8d438e4f4530af41d9f45023d49 Mon Sep 17 00:00:00 2001 From: yeongha Date: Tue, 30 Jan 2024 00:26:48 +0900 Subject: [PATCH 09/24] Change housekeeping Structure for intervals, Changed and Deleted all functions and test code to match the changed housekeeping structure --- cmd/yorkie/server.go | 22 +++++++++++++------ server/backend/database/memory/database.go | 4 ++-- .../backend/database/testcases/testcases.go | 1 + server/backend/housekeeping/config.go | 11 ++++++---- server/backend/housekeeping/config_test.go | 15 ++++++++----- server/backend/housekeeping/housekeeping.go | 22 ++++++++++++------- server/config.go | 6 +++-- server/config.sample.yml | 7 ++++-- server/rpc/server_test.go | 3 ++- test/helper/helper.go | 6 +++-- 10 files changed, 64 insertions(+), 33 deletions(-) diff --git a/cmd/yorkie/server.go b/cmd/yorkie/server.go index d728a3d70..fd62997f8 100644 --- a/cmd/yorkie/server.go +++ b/cmd/yorkie/server.go @@ -38,9 +38,10 @@ var ( flagConfPath string flagLogLevel string - adminTokenDuration time.Duration - housekeepingInterval time.Duration - clientDeactivateThreshold string + adminTokenDuration time.Duration + housekeepingIntervalDeactivateClient time.Duration + housekeepingIntervalDocumentDeletion time.Duration + clientDeactivateThreshold string mongoConnectionURI string mongoConnectionTimeout time.Duration @@ -69,7 +70,8 @@ func newServerCmd() *cobra.Command { conf.Backend.AuthWebhookCacheUnauthTTL = authWebhookCacheUnauthTTL.String() conf.Backend.ProjectInfoCacheTTL = projectInfoCacheTTL.String() - conf.Housekeeping.Interval = housekeepingInterval.String() + conf.Housekeeping.IntervalDeactivateClient = housekeepingIntervalDeactivateClient.String() + conf.Housekeeping.IntervalDocumentDeletion = housekeepingIntervalDocumentDeletion.String() if mongoConnectionURI != "" { conf.Mongo = &mongo.Config{ @@ -194,9 +196,15 @@ func init() { "Enable runtime profiling data via HTTP server.", ) cmd.Flags().DurationVar( - &housekeepingInterval, - "housekeeping-interval", - server.DefaultHousekeepingInterval, + &housekeepingIntervalDeactivateClient, + "housekeeping-intervalDeactivateClient", + server.DefaultHousekeepingIntervalDeactivateClient, + "housekeeping interval between housekeeping runs", + ) + cmd.Flags().DurationVar( + &housekeepingIntervalDocumentDeletion, + "housekeeping-intervalDocumentDeletion", + server.DefaultHousekeepingIntervalDocumentDeletion, "housekeeping interval between housekeeping runs", ) cmd.Flags().IntVar( diff --git a/server/backend/database/memory/database.go b/server/backend/database/memory/database.go index 688f7b651..587fd5b30 100644 --- a/server/backend/database/memory/database.go +++ b/server/backend/database/memory/database.go @@ -621,7 +621,7 @@ func (d *DB) UpdateClientInfoAfterPushPull( // FindDocumentHardDeletionCandidatesPerProject finds the documents that need housekeeping per project. func (d *DB) FindDocumentHardDeletionCandidatesPerProject( - ctx context.Context, + _ context.Context, project *database.ProjectInfo, candidatesLimit int, ) ([]*database.DocInfo, error) { @@ -732,7 +732,7 @@ func (d *DB) FindDocumentHardDeletionCandidates( // DocumentHardDeletion Deletes the documents completely. func (d *DB) DocumentHardDeletion( - ctx context.Context, + _ context.Context, candidates []*database.DocInfo, ) error { if len(candidates) <= 0 { diff --git a/server/backend/database/testcases/testcases.go b/server/backend/database/testcases/testcases.go index 9326714eb..2efca03e6 100644 --- a/server/backend/database/testcases/testcases.go +++ b/server/backend/database/testcases/testcases.go @@ -1227,6 +1227,7 @@ func RunDocumentHardDeletion(t *testing.T, db database.Database) { clientInfo, err := db.ActivateClient(ctx, projectID, t.Name()) assert.NoError(t, err) docInfo, err := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), helper.TestDocKey(t), true) + assert.NoError(t, err) assert.NoError(t, clientInfo.AttachDocument(docInfo.ID)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) diff --git a/server/backend/housekeeping/config.go b/server/backend/housekeeping/config.go index e8a24cd65..d579a19b2 100644 --- a/server/backend/housekeeping/config.go +++ b/server/backend/housekeeping/config.go @@ -23,8 +23,11 @@ import ( // Config is the configuration for the housekeeping service. type Config struct { - // Interval is the time between housekeeping runs. - Interval string `yaml:"Interval"` + // IntervalDeactivateClient is the time between housekeeping runs. + IntervalDeactivateClient string `yaml:"Interval"` + + // IntervalDeactivateClient is the time between housekeeping runs. + IntervalDocumentDeletion string `yaml:"Interval"` // CandidatesLimitPerProject is the maximum number of candidates to be returned per project. CandidatesLimitPerProject int `yaml:"CandidatesLimitPerProject"` @@ -38,10 +41,10 @@ type Config struct { // Validate validates the configuration. func (c *Config) Validate() error { - if _, err := time.ParseDuration(c.Interval); err != nil { + if _, err := time.ParseDuration(c.IntervalDeactivateClient); err != nil { return fmt.Errorf( `invalid argument %s for "--housekeeping-interval" flag: %w`, - c.Interval, + c.IntervalDeactivateClient, err, ) } diff --git a/server/backend/housekeeping/config_test.go b/server/backend/housekeeping/config_test.go index 876904135..e02319b7e 100644 --- a/server/backend/housekeeping/config_test.go +++ b/server/backend/housekeeping/config_test.go @@ -27,22 +27,27 @@ import ( func TestConfig(t *testing.T) { t.Run("validate test", func(t *testing.T) { validConf := housekeeping.Config{ - Interval: "1m", + IntervalDeactivateClient: "1m", + IntervalDocumentDeletion: "60s", CandidatesLimitPerProject: 100, ProjectFetchSize: 100, } assert.NoError(t, validConf.Validate()) conf1 := validConf - conf1.Interval = "hour" + conf1.IntervalDeactivateClient = "hour" assert.Error(t, conf1.Validate()) conf2 := validConf - conf2.CandidatesLimitPerProject = 0 - assert.Error(t, conf2.Validate()) + conf2.IntervalDocumentDeletion = "hour" + assert.Error(t, conf1.Validate()) conf3 := validConf - conf3.ProjectFetchSize = -1 + conf3.CandidatesLimitPerProject = 0 + assert.Error(t, conf2.Validate()) + + conf4 := validConf + conf4.ProjectFetchSize = -1 assert.Error(t, conf3.Validate()) }) } diff --git a/server/backend/housekeeping/housekeeping.go b/server/backend/housekeeping/housekeeping.go index 7bfdba427..2d1ba6a7d 100644 --- a/server/backend/housekeeping/housekeeping.go +++ b/server/backend/housekeeping/housekeeping.go @@ -33,7 +33,7 @@ import ( const ( deactivateCandidatesKey = "housekeeping/deactivateCandidates" - DocumentHardDeletionLockKey = "housekeeping/DocumentHardDeletionLock" + documentHardDeletionLockKey = "housekeeping/DocumentHardDeletionLock" ) // Housekeeping is the housekeeping service. It periodically runs housekeeping @@ -43,7 +43,8 @@ type Housekeeping struct { database database.Database coordinator sync.Coordinator - interval time.Duration + intervalDeactivateClient time.Duration + IntervalDocumentDeletion time.Duration candidatesLimitPerProject int projectFetchSize int @@ -74,9 +75,13 @@ func New( database database.Database, coordinator sync.Coordinator, ) (*Housekeeping, error) { - interval, err := time.ParseDuration(conf.Interval) + intervalDeactivateClient, err := time.ParseDuration(conf.IntervalDeactivateClient) if err != nil { - return nil, fmt.Errorf("parse interval %s: %w", conf.Interval, err) + return nil, fmt.Errorf("parse IntervalDeactivateClient %s: %w", conf.IntervalDeactivateClient, err) + } + IntervalDocumentDeletion, err := time.ParseDuration(conf.IntervalDocumentDeletion) + if err != nil { + return nil, fmt.Errorf("parse IntervalDocumentDeletion %s: %w", conf.IntervalDocumentDeletion, err) } ctx, cancelFunc := context.WithCancel(context.Background()) @@ -85,7 +90,8 @@ func New( database: database, coordinator: coordinator, - interval: interval, + intervalDeactivateClient: intervalDeactivateClient, + IntervalDocumentDeletion: IntervalDocumentDeletion, candidatesLimitPerProject: conf.CandidatesLimitPerProject, projectFetchSize: conf.ProjectFetchSize, @@ -122,7 +128,7 @@ func (h *Housekeeping) AttachDeactivateCandidates() { housekeepingLastProjectID = lastProjectID select { - case <-time.After(h.interval): + case <-time.After(h.intervalDeactivateClient): case <-h.ctx.Done(): return } @@ -144,7 +150,7 @@ func (h *Housekeeping) AttachDocumentHardDeletion() { housekeepingLastProjectID = lastProjectID select { - case <-time.After(h.interval): + case <-time.After(h.IntervalDocumentDeletion): case <-h.ctx.Done(): return } @@ -155,7 +161,7 @@ func (h *Housekeeping) documentHardDeletion( ctx context.Context, housekeepingLastProjectID types.ID, ) (types.ID, error) { - locker, err := h.coordinator.NewLocker(ctx, DocumentHardDeletionLockKey) + locker, err := h.coordinator.NewLocker(ctx, documentHardDeletionLockKey) if err != nil { return database.DefaultProjectID, err } diff --git a/server/config.go b/server/config.go index e2497c856..d682808c0 100644 --- a/server/config.go +++ b/server/config.go @@ -40,7 +40,8 @@ const ( DefaultProfilingPort = 8081 - DefaultHousekeepingInterval = 30 * time.Second + DefaultHousekeepingIntervalDeactivateClient = 30 * time.Second + DefaultHousekeepingIntervalDocumentDeletion = 24 * time.Hour DefaultHousekeepingCandidatesLimitPerProject = 500 DefaultHousekeepingDocumentHardDeletionLimitPerProject = 500 DefaultHousekeepingProjectFetchSize = 100 @@ -229,7 +230,8 @@ func newConfig(port int, profilingPort int) *Config { Port: profilingPort, }, Housekeeping: &housekeeping.Config{ - Interval: DefaultHousekeepingInterval.String(), + IntervalDeactivateClient: DefaultHousekeepingIntervalDeactivateClient.String(), + IntervalDocumentDeletion: DefaultHousekeepingIntervalDocumentDeletion.String(), CandidatesLimitPerProject: DefaultHousekeepingCandidatesLimitPerProject, DocumentHardDeletionLimitPerProject: DefaultHousekeepingDocumentHardDeletionLimitPerProject, ProjectFetchSize: DefaultHousekeepingProjectFetchSize, diff --git a/server/config.sample.yml b/server/config.sample.yml index 811db603a..824f36194 100644 --- a/server/config.sample.yml +++ b/server/config.sample.yml @@ -30,8 +30,11 @@ Profiling: # Housekeeping is the configuration for the housekeeping. Housekeeping: - # Interval is the time between housekeeping runs (default: 1m). - Interval: 1m + # IntervalDeactivateClient is the time between housekeeping runs (default: 1m). + IntervalDeactivateClient: 1m + + # IntervalDocumentDeletion is the time between housekeeping runs (default: 24h). + IntervalDocumentDeletion: "24h" # CandidatesLimitPerProject is the maximum number of candidates to be returned per project (default: 100). CandidatesLimitPerProject: 100 diff --git a/server/rpc/server_test.go b/server/rpc/server_test.go index 745717ad8..b3917977b 100644 --- a/server/rpc/server_test.go +++ b/server/rpc/server_test.go @@ -82,7 +82,8 @@ func TestMain(m *testing.M) { ConnectionTimeout: helper.MongoConnectionTimeout, PingTimeout: helper.MongoPingTimeout, }, &housekeeping.Config{ - Interval: helper.HousekeepingInterval.String(), + IntervalDeactivateClient: helper.HousekeepingIntervalDeactivateClient.String(), + IntervalDocumentDeletion: helper.HousekeepingIntervalDocumentDeletion.String(), CandidatesLimitPerProject: helper.HousekeepingCandidatesLimitPerProject, ProjectFetchSize: helper.HousekeepingProjectFetchSize, }, met) diff --git a/test/helper/helper.go b/test/helper/helper.go index 362270f06..477177605 100644 --- a/test/helper/helper.go +++ b/test/helper/helper.go @@ -62,7 +62,8 @@ var ( AdminUser = server.DefaultAdminUser AdminPassword = server.DefaultAdminPassword - HousekeepingInterval = 10 * gotime.Second + HousekeepingIntervalDeactivateClient = 10 * gotime.Second + HousekeepingIntervalDocumentDeletion = 10 * gotime.Minute HousekeepingCandidatesLimitPerProject = 10 HousekeepingProjectFetchSize = 10 @@ -210,7 +211,8 @@ func TestConfig() *server.Config { Port: ProfilingPort + portOffset, }, Housekeeping: &housekeeping.Config{ - Interval: HousekeepingInterval.String(), + IntervalDeactivateClient: HousekeepingIntervalDeactivateClient.String(), + IntervalDocumentDeletion: HousekeepingIntervalDocumentDeletion.String(), CandidatesLimitPerProject: HousekeepingCandidatesLimitPerProject, ProjectFetchSize: HousekeepingProjectFetchSize, }, From 0066e8b0aabf67d737743b7de62780cf8e9dc09e Mon Sep 17 00:00:00 2001 From: yeongha Date: Tue, 30 Jan 2024 00:33:57 +0900 Subject: [PATCH 10/24] Fix missing housekeeping config for TestMain --- test/sharding/server_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/sharding/server_test.go b/test/sharding/server_test.go index 6e906fb4a..22332e220 100644 --- a/test/sharding/server_test.go +++ b/test/sharding/server_test.go @@ -77,7 +77,8 @@ func TestMain(m *testing.M) { ConnectionTimeout: helper.MongoConnectionTimeout, PingTimeout: helper.MongoPingTimeout, }, &housekeeping.Config{ - Interval: helper.HousekeepingInterval.String(), + IntervalDeactivateClient: helper.HousekeepingIntervalDeactivateClient.String(), + IntervalDocumentDeletion: helper.HousekeepingIntervalDocumentDeletion.String(), CandidatesLimitPerProject: helper.HousekeepingCandidatesLimitPerProject, ProjectFetchSize: helper.HousekeepingProjectFetchSize, }, met) From 696031aeb000dd60022346d77712dce808ebbaf6 Mon Sep 17 00:00:00 2001 From: yeongha Date: Tue, 30 Jan 2024 01:21:29 +0900 Subject: [PATCH 11/24] Fix missing housekeeping config for Test Config --- server/backend/housekeeping/config.go | 23 ++++++++++++++++++---- server/backend/housekeeping/config_test.go | 23 +++++++++++++--------- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/server/backend/housekeeping/config.go b/server/backend/housekeeping/config.go index d579a19b2..ccfac76d1 100644 --- a/server/backend/housekeeping/config.go +++ b/server/backend/housekeeping/config.go @@ -24,10 +24,10 @@ import ( // Config is the configuration for the housekeeping service. type Config struct { // IntervalDeactivateClient is the time between housekeeping runs. - IntervalDeactivateClient string `yaml:"Interval"` + IntervalDeactivateClient string `yaml:"IntervalDeactivateClient"` // IntervalDeactivateClient is the time between housekeeping runs. - IntervalDocumentDeletion string `yaml:"Interval"` + IntervalDocumentDeletion string `yaml:"IntervalDocumentDeletion"` // CandidatesLimitPerProject is the maximum number of candidates to be returned per project. CandidatesLimitPerProject int `yaml:"CandidatesLimitPerProject"` @@ -43,7 +43,15 @@ type Config struct { func (c *Config) Validate() error { if _, err := time.ParseDuration(c.IntervalDeactivateClient); err != nil { return fmt.Errorf( - `invalid argument %s for "--housekeeping-interval" flag: %w`, + `invalid argument %s for "--housekeeping-intervalDeactivateClient" flag: %w`, + c.IntervalDeactivateClient, + err, + ) + } + + if _, err := time.ParseDuration(c.IntervalDocumentDeletion); err != nil { + return fmt.Errorf( + `invalid argument %s for "--housekeeping-intervalDocumentDeletion" flag: %w`, c.IntervalDeactivateClient, err, ) @@ -52,7 +60,14 @@ func (c *Config) Validate() error { if c.CandidatesLimitPerProject <= 0 { return fmt.Errorf( `invalid argument %d for "--housekeeping-candidates-limit-per-project" flag`, - c.ProjectFetchSize, + c.CandidatesLimitPerProject, + ) + } + + if c.DocumentHardDeletionLimitPerProject <= 0 { + return fmt.Errorf( + `invalid argument %d for "--housekeeping-document-hard-deletion-limit-per-project" flag`, + c.DocumentHardDeletionLimitPerProject, ) } diff --git a/server/backend/housekeeping/config_test.go b/server/backend/housekeeping/config_test.go index e02319b7e..eb8a9f580 100644 --- a/server/backend/housekeeping/config_test.go +++ b/server/backend/housekeeping/config_test.go @@ -27,10 +27,11 @@ import ( func TestConfig(t *testing.T) { t.Run("validate test", func(t *testing.T) { validConf := housekeeping.Config{ - IntervalDeactivateClient: "1m", - IntervalDocumentDeletion: "60s", - CandidatesLimitPerProject: 100, - ProjectFetchSize: 100, + IntervalDeactivateClient: "1m", + IntervalDocumentDeletion: "60m", + CandidatesLimitPerProject: 100, + DocumentHardDeletionLimitPerProject: 100, + ProjectFetchSize: 100, } assert.NoError(t, validConf.Validate()) @@ -40,14 +41,18 @@ func TestConfig(t *testing.T) { conf2 := validConf conf2.IntervalDocumentDeletion = "hour" - assert.Error(t, conf1.Validate()) + assert.Error(t, conf2.Validate()) conf3 := validConf - conf3.CandidatesLimitPerProject = 0 - assert.Error(t, conf2.Validate()) + conf3.CandidatesLimitPerProject = -1 + assert.Error(t, conf3.Validate()) conf4 := validConf - conf4.ProjectFetchSize = -1 - assert.Error(t, conf3.Validate()) + conf4.DocumentHardDeletionLimitPerProject = -1 + assert.Error(t, conf4.Validate()) + + conf5 := validConf + conf5.ProjectFetchSize = -1 + assert.Error(t, conf5.Validate()) }) } From e26ba6b64488ee48a86d2c49c3db7317a51c3fda Mon Sep 17 00:00:00 2001 From: yeongha Date: Tue, 30 Jan 2024 01:27:13 +0900 Subject: [PATCH 12/24] Fix missing housekeeping config for Test Config --- server/backend/housekeeping/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/backend/housekeeping/config.go b/server/backend/housekeeping/config.go index ccfac76d1..33f4652ee 100644 --- a/server/backend/housekeeping/config.go +++ b/server/backend/housekeeping/config.go @@ -64,7 +64,7 @@ func (c *Config) Validate() error { ) } - if c.DocumentHardDeletionLimitPerProject <= 0 { + if c.DocumentHardDeletionLimitPerProject < 0 { return fmt.Errorf( `invalid argument %d for "--housekeeping-document-hard-deletion-limit-per-project" flag`, c.DocumentHardDeletionLimitPerProject, From b158ee904248472a1db36ab46fd281b38abab040 Mon Sep 17 00:00:00 2001 From: yeongha Date: Tue, 30 Jan 2024 21:33:02 +0900 Subject: [PATCH 13/24] Revert 'Change housekeeping Structure for intervals' --- cmd/yorkie/server.go | 22 +++++++------------- server/backend/housekeeping/config.go | 23 ++++++--------------- server/backend/housekeeping/config_test.go | 14 +++++-------- server/backend/housekeeping/housekeeping.go | 18 ++++++---------- server/config.go | 6 ++---- server/config.sample.yml | 7 ++----- server/rpc/server_test.go | 3 +-- test/helper/helper.go | 6 ++---- 8 files changed, 31 insertions(+), 68 deletions(-) diff --git a/cmd/yorkie/server.go b/cmd/yorkie/server.go index fd62997f8..d728a3d70 100644 --- a/cmd/yorkie/server.go +++ b/cmd/yorkie/server.go @@ -38,10 +38,9 @@ var ( flagConfPath string flagLogLevel string - adminTokenDuration time.Duration - housekeepingIntervalDeactivateClient time.Duration - housekeepingIntervalDocumentDeletion time.Duration - clientDeactivateThreshold string + adminTokenDuration time.Duration + housekeepingInterval time.Duration + clientDeactivateThreshold string mongoConnectionURI string mongoConnectionTimeout time.Duration @@ -70,8 +69,7 @@ func newServerCmd() *cobra.Command { conf.Backend.AuthWebhookCacheUnauthTTL = authWebhookCacheUnauthTTL.String() conf.Backend.ProjectInfoCacheTTL = projectInfoCacheTTL.String() - conf.Housekeeping.IntervalDeactivateClient = housekeepingIntervalDeactivateClient.String() - conf.Housekeeping.IntervalDocumentDeletion = housekeepingIntervalDocumentDeletion.String() + conf.Housekeeping.Interval = housekeepingInterval.String() if mongoConnectionURI != "" { conf.Mongo = &mongo.Config{ @@ -196,15 +194,9 @@ func init() { "Enable runtime profiling data via HTTP server.", ) cmd.Flags().DurationVar( - &housekeepingIntervalDeactivateClient, - "housekeeping-intervalDeactivateClient", - server.DefaultHousekeepingIntervalDeactivateClient, - "housekeeping interval between housekeeping runs", - ) - cmd.Flags().DurationVar( - &housekeepingIntervalDocumentDeletion, - "housekeeping-intervalDocumentDeletion", - server.DefaultHousekeepingIntervalDocumentDeletion, + &housekeepingInterval, + "housekeeping-interval", + server.DefaultHousekeepingInterval, "housekeeping interval between housekeeping runs", ) cmd.Flags().IntVar( diff --git a/server/backend/housekeeping/config.go b/server/backend/housekeeping/config.go index 33f4652ee..cb00f5dc5 100644 --- a/server/backend/housekeeping/config.go +++ b/server/backend/housekeeping/config.go @@ -23,11 +23,8 @@ import ( // Config is the configuration for the housekeeping service. type Config struct { - // IntervalDeactivateClient is the time between housekeeping runs. - IntervalDeactivateClient string `yaml:"IntervalDeactivateClient"` - - // IntervalDeactivateClient is the time between housekeeping runs. - IntervalDocumentDeletion string `yaml:"IntervalDocumentDeletion"` + // Interval is the time between housekeeping runs. + Interval string `yaml:"Interval"` // CandidatesLimitPerProject is the maximum number of candidates to be returned per project. CandidatesLimitPerProject int `yaml:"CandidatesLimitPerProject"` @@ -41,18 +38,10 @@ type Config struct { // Validate validates the configuration. func (c *Config) Validate() error { - if _, err := time.ParseDuration(c.IntervalDeactivateClient); err != nil { + if _, err := time.ParseDuration(c.Interval); err != nil { return fmt.Errorf( - `invalid argument %s for "--housekeeping-intervalDeactivateClient" flag: %w`, - c.IntervalDeactivateClient, - err, - ) - } - - if _, err := time.ParseDuration(c.IntervalDocumentDeletion); err != nil { - return fmt.Errorf( - `invalid argument %s for "--housekeeping-intervalDocumentDeletion" flag: %w`, - c.IntervalDeactivateClient, + `invalid argument %s for "--housekeeping-interval" flag: %w`, + c.Interval, err, ) } @@ -60,7 +49,7 @@ func (c *Config) Validate() error { if c.CandidatesLimitPerProject <= 0 { return fmt.Errorf( `invalid argument %d for "--housekeeping-candidates-limit-per-project" flag`, - c.CandidatesLimitPerProject, + c.ProjectFetchSize, ) } diff --git a/server/backend/housekeeping/config_test.go b/server/backend/housekeeping/config_test.go index eb8a9f580..3cdc2c569 100644 --- a/server/backend/housekeeping/config_test.go +++ b/server/backend/housekeeping/config_test.go @@ -27,8 +27,7 @@ import ( func TestConfig(t *testing.T) { t.Run("validate test", func(t *testing.T) { validConf := housekeeping.Config{ - IntervalDeactivateClient: "1m", - IntervalDocumentDeletion: "60m", + Interval: "1m", CandidatesLimitPerProject: 100, DocumentHardDeletionLimitPerProject: 100, ProjectFetchSize: 100, @@ -36,23 +35,20 @@ func TestConfig(t *testing.T) { assert.NoError(t, validConf.Validate()) conf1 := validConf - conf1.IntervalDeactivateClient = "hour" + conf1.Interval = "hour" assert.Error(t, conf1.Validate()) conf2 := validConf - conf2.IntervalDocumentDeletion = "hour" + conf2.CandidatesLimitPerProject = 0 assert.Error(t, conf2.Validate()) conf3 := validConf - conf3.CandidatesLimitPerProject = -1 + conf3.DocumentHardDeletionLimitPerProject = -1 assert.Error(t, conf3.Validate()) conf4 := validConf - conf4.DocumentHardDeletionLimitPerProject = -1 + conf4.ProjectFetchSize = -1 assert.Error(t, conf4.Validate()) - conf5 := validConf - conf5.ProjectFetchSize = -1 - assert.Error(t, conf5.Validate()) }) } diff --git a/server/backend/housekeeping/housekeeping.go b/server/backend/housekeeping/housekeeping.go index 2d1ba6a7d..3b67bdfce 100644 --- a/server/backend/housekeeping/housekeeping.go +++ b/server/backend/housekeeping/housekeeping.go @@ -43,8 +43,7 @@ type Housekeeping struct { database database.Database coordinator sync.Coordinator - intervalDeactivateClient time.Duration - IntervalDocumentDeletion time.Duration + interval time.Duration candidatesLimitPerProject int projectFetchSize int @@ -75,13 +74,9 @@ func New( database database.Database, coordinator sync.Coordinator, ) (*Housekeeping, error) { - intervalDeactivateClient, err := time.ParseDuration(conf.IntervalDeactivateClient) + interval, err := time.ParseDuration(conf.Interval) if err != nil { - return nil, fmt.Errorf("parse IntervalDeactivateClient %s: %w", conf.IntervalDeactivateClient, err) - } - IntervalDocumentDeletion, err := time.ParseDuration(conf.IntervalDocumentDeletion) - if err != nil { - return nil, fmt.Errorf("parse IntervalDocumentDeletion %s: %w", conf.IntervalDocumentDeletion, err) + return nil, fmt.Errorf("parse interval %s: %w", conf.Interval, err) } ctx, cancelFunc := context.WithCancel(context.Background()) @@ -90,8 +85,7 @@ func New( database: database, coordinator: coordinator, - intervalDeactivateClient: intervalDeactivateClient, - IntervalDocumentDeletion: IntervalDocumentDeletion, + interval: interval, candidatesLimitPerProject: conf.CandidatesLimitPerProject, projectFetchSize: conf.ProjectFetchSize, @@ -128,7 +122,7 @@ func (h *Housekeeping) AttachDeactivateCandidates() { housekeepingLastProjectID = lastProjectID select { - case <-time.After(h.intervalDeactivateClient): + case <-time.After(h.interval): case <-h.ctx.Done(): return } @@ -150,7 +144,7 @@ func (h *Housekeeping) AttachDocumentHardDeletion() { housekeepingLastProjectID = lastProjectID select { - case <-time.After(h.IntervalDocumentDeletion): + case <-time.After(h.interval): case <-h.ctx.Done(): return } diff --git a/server/config.go b/server/config.go index d682808c0..e2497c856 100644 --- a/server/config.go +++ b/server/config.go @@ -40,8 +40,7 @@ const ( DefaultProfilingPort = 8081 - DefaultHousekeepingIntervalDeactivateClient = 30 * time.Second - DefaultHousekeepingIntervalDocumentDeletion = 24 * time.Hour + DefaultHousekeepingInterval = 30 * time.Second DefaultHousekeepingCandidatesLimitPerProject = 500 DefaultHousekeepingDocumentHardDeletionLimitPerProject = 500 DefaultHousekeepingProjectFetchSize = 100 @@ -230,8 +229,7 @@ func newConfig(port int, profilingPort int) *Config { Port: profilingPort, }, Housekeeping: &housekeeping.Config{ - IntervalDeactivateClient: DefaultHousekeepingIntervalDeactivateClient.String(), - IntervalDocumentDeletion: DefaultHousekeepingIntervalDocumentDeletion.String(), + Interval: DefaultHousekeepingInterval.String(), CandidatesLimitPerProject: DefaultHousekeepingCandidatesLimitPerProject, DocumentHardDeletionLimitPerProject: DefaultHousekeepingDocumentHardDeletionLimitPerProject, ProjectFetchSize: DefaultHousekeepingProjectFetchSize, diff --git a/server/config.sample.yml b/server/config.sample.yml index 824f36194..811db603a 100644 --- a/server/config.sample.yml +++ b/server/config.sample.yml @@ -30,11 +30,8 @@ Profiling: # Housekeeping is the configuration for the housekeeping. Housekeeping: - # IntervalDeactivateClient is the time between housekeeping runs (default: 1m). - IntervalDeactivateClient: 1m - - # IntervalDocumentDeletion is the time between housekeeping runs (default: 24h). - IntervalDocumentDeletion: "24h" + # Interval is the time between housekeeping runs (default: 1m). + Interval: 1m # CandidatesLimitPerProject is the maximum number of candidates to be returned per project (default: 100). CandidatesLimitPerProject: 100 diff --git a/server/rpc/server_test.go b/server/rpc/server_test.go index b3917977b..745717ad8 100644 --- a/server/rpc/server_test.go +++ b/server/rpc/server_test.go @@ -82,8 +82,7 @@ func TestMain(m *testing.M) { ConnectionTimeout: helper.MongoConnectionTimeout, PingTimeout: helper.MongoPingTimeout, }, &housekeeping.Config{ - IntervalDeactivateClient: helper.HousekeepingIntervalDeactivateClient.String(), - IntervalDocumentDeletion: helper.HousekeepingIntervalDocumentDeletion.String(), + Interval: helper.HousekeepingInterval.String(), CandidatesLimitPerProject: helper.HousekeepingCandidatesLimitPerProject, ProjectFetchSize: helper.HousekeepingProjectFetchSize, }, met) diff --git a/test/helper/helper.go b/test/helper/helper.go index 477177605..362270f06 100644 --- a/test/helper/helper.go +++ b/test/helper/helper.go @@ -62,8 +62,7 @@ var ( AdminUser = server.DefaultAdminUser AdminPassword = server.DefaultAdminPassword - HousekeepingIntervalDeactivateClient = 10 * gotime.Second - HousekeepingIntervalDocumentDeletion = 10 * gotime.Minute + HousekeepingInterval = 10 * gotime.Second HousekeepingCandidatesLimitPerProject = 10 HousekeepingProjectFetchSize = 10 @@ -211,8 +210,7 @@ func TestConfig() *server.Config { Port: ProfilingPort + portOffset, }, Housekeeping: &housekeeping.Config{ - IntervalDeactivateClient: HousekeepingIntervalDeactivateClient.String(), - IntervalDocumentDeletion: HousekeepingIntervalDocumentDeletion.String(), + Interval: HousekeepingInterval.String(), CandidatesLimitPerProject: HousekeepingCandidatesLimitPerProject, ProjectFetchSize: HousekeepingProjectFetchSize, }, From 1a4d2c35578fe7a3a6e04f3b4109e7839f68917a Mon Sep 17 00:00:00 2001 From: yeongha Date: Wed, 31 Jan 2024 01:04:25 +0900 Subject: [PATCH 14/24] Added DeleteAfterTime value to housekeeping config setting and modified affected functions, Default value: -24h --- cmd/yorkie/server.go | 8 ++++++++ server/backend/database/database.go | 2 ++ server/backend/database/memory/database.go | 13 +++++++++++-- server/backend/database/mongo/client.go | 14 ++++++++++++-- server/backend/database/testcases/testcases.go | 4 ++++ server/backend/housekeeping/config.go | 11 +++++++++++ server/backend/housekeeping/config_test.go | 11 ++++++++--- server/backend/housekeeping/housekeeping.go | 8 ++++++++ server/config.go | 2 ++ server/config.sample.yml | 3 +++ server/rpc/server_test.go | 1 + test/helper/helper.go | 2 ++ 12 files changed, 72 insertions(+), 7 deletions(-) diff --git a/cmd/yorkie/server.go b/cmd/yorkie/server.go index d728a3d70..4fd6923c9 100644 --- a/cmd/yorkie/server.go +++ b/cmd/yorkie/server.go @@ -40,6 +40,7 @@ var ( adminTokenDuration time.Duration housekeepingInterval time.Duration + deleteAfterTime time.Duration clientDeactivateThreshold string mongoConnectionURI string @@ -70,6 +71,7 @@ func newServerCmd() *cobra.Command { conf.Backend.ProjectInfoCacheTTL = projectInfoCacheTTL.String() conf.Housekeeping.Interval = housekeepingInterval.String() + conf.Housekeeping.DeleteAfterTime = deleteAfterTime.String() if mongoConnectionURI != "" { conf.Mongo = &mongo.Config{ @@ -211,6 +213,12 @@ func init() { server.DefaultHousekeepingDocumentHardDeletionLimitPerProject, "DocumentHardDeletion limit per project for a single housekeeping run", ) + cmd.Flags().DurationVar( + &deleteAfterTime, + "housekeeping-DocumentHardDeletion-delete-after-time", + server.DefaultHousekeepingDeleteAfterTime, + "DocumentHardDeletion delete after time for a single housekeeping run", + ) cmd.Flags().IntVar( &conf.Housekeeping.ProjectFetchSize, "housekeeping-project-fetch-size", diff --git a/server/backend/database/database.go b/server/backend/database/database.go index a3314391b..2cfeded9f 100644 --- a/server/backend/database/database.go +++ b/server/backend/database/database.go @@ -20,6 +20,7 @@ package database import ( "context" "errors" + gotime "time" "github.com/yorkie-team/yorkie/api/types" "github.com/yorkie-team/yorkie/pkg/document" @@ -162,6 +163,7 @@ type Database interface { ctx context.Context, candidatesLimitPerProject int, projectFetchSize int, + deleteAfterTime gotime.Duration, lastProjectID types.ID, ) (types.ID, []*DocInfo, error) diff --git a/server/backend/database/memory/database.go b/server/backend/database/memory/database.go index 587fd5b30..30b0fd355 100644 --- a/server/backend/database/memory/database.go +++ b/server/backend/database/memory/database.go @@ -624,6 +624,7 @@ func (d *DB) FindDocumentHardDeletionCandidatesPerProject( _ context.Context, project *database.ProjectInfo, candidatesLimit int, + deleteAfterTime gotime.Duration, ) ([]*database.DocInfo, error) { txn := d.db.Txn(false) @@ -640,13 +641,15 @@ func (d *DB) FindDocumentHardDeletionCandidatesPerProject( return nil, fmt.Errorf("fetch hard deletion candidates: %w", err) } + currentTime := gotime.Now() + conditionDeleteAfterTime := currentTime.Add(deleteAfterTime) for raw := iterator.Next(); raw != nil; raw = iterator.Next() { document := raw.(*database.DocInfo) if candidatesLimit <= len(documents) && candidatesLimit != 0 { break } - if !document.RemovedAt.IsZero() { + if !document.RemovedAt.After(conditionDeleteAfterTime) { documents = append(documents, document) } } @@ -703,6 +706,7 @@ func (d *DB) FindDocumentHardDeletionCandidates( ctx context.Context, candidatesLimitPerProject int, projectFetchSize int, + deletedAfterTime gotime.Duration, lastProjectID types.ID, ) (types.ID, []*database.DocInfo, error) { projects, err := d.FindNextNCyclingProjectInfos(ctx, projectFetchSize, lastProjectID) @@ -712,7 +716,12 @@ func (d *DB) FindDocumentHardDeletionCandidates( var candidates []*database.DocInfo for _, project := range projects { - infos, err := d.FindDocumentHardDeletionCandidatesPerProject(ctx, project, candidatesLimitPerProject) + infos, err := d.FindDocumentHardDeletionCandidatesPerProject( + ctx, + project, + candidatesLimitPerProject, + deletedAfterTime, + ) if err != nil { return database.DefaultProjectID, nil, err } diff --git a/server/backend/database/mongo/client.go b/server/backend/database/mongo/client.go index fa3d27a9a..9826b7df6 100644 --- a/server/backend/database/mongo/client.go +++ b/server/backend/database/mongo/client.go @@ -654,16 +654,20 @@ func (c *Client) FindDocumentHardDeletionCandidatesPerProject( ctx context.Context, project *database.ProjectInfo, candidatesLimit int, + deleteAfterTime gotime.Duration, ) ([]*database.DocInfo, error) { encodedProjectID, err := encodeID(project.ID) if err != nil { return nil, err } + currentTime := gotime.Now() + conditionDeleteAfterTime := currentTime.Add(deleteAfterTime) + var DocInfos []*database.DocInfo cursor, err := c.collection(ColDocuments).Find(ctx, bson.M{ "project_id": encodedProjectID, - "removed_at": bson.M{"$ne": nil}, + "removed_at": bson.M{"$lt": conditionDeleteAfterTime}, }, options.Find().SetLimit(int64(candidatesLimit))) if err != nil { @@ -744,6 +748,7 @@ func (c *Client) FindDocumentHardDeletionCandidates( ctx context.Context, candidatesLimitPerProject int, projectFetchSize int, + deletedAfterTime gotime.Duration, lastProjectID types.ID, ) (types.ID, []*database.DocInfo, error) { projects, err := c.FindNextNCyclingProjectInfos(ctx, projectFetchSize, lastProjectID) @@ -753,7 +758,12 @@ func (c *Client) FindDocumentHardDeletionCandidates( var candidates []*database.DocInfo for _, project := range projects { - docInfos, err := c.FindDocumentHardDeletionCandidatesPerProject(ctx, project, candidatesLimitPerProject) + docInfos, err := c.FindDocumentHardDeletionCandidatesPerProject( + ctx, + project, + candidatesLimitPerProject, + deletedAfterTime, + ) if err != nil { return database.DefaultProjectID, nil, err } diff --git a/server/backend/database/testcases/testcases.go b/server/backend/database/testcases/testcases.go index 2efca03e6..83b1ffa6a 100644 --- a/server/backend/database/testcases/testcases.go +++ b/server/backend/database/testcases/testcases.go @@ -1242,11 +1242,15 @@ func RunDocumentHardDeletion(t *testing.T, db database.Database) { lastProjectID := database.DefaultProjectID var candidates []*database.DocInfo + yesterday := "0s" + deleteAfterTime, err := gotime.ParseDuration(yesterday) + assert.NoError(t, err) lastProjectID, candidates, err = db.FindDocumentHardDeletionCandidates( ctx, 0, fetchSize, + deleteAfterTime, lastProjectID, ) assert.NoError(t, err) diff --git a/server/backend/housekeeping/config.go b/server/backend/housekeeping/config.go index cb00f5dc5..44121a640 100644 --- a/server/backend/housekeeping/config.go +++ b/server/backend/housekeeping/config.go @@ -26,6 +26,9 @@ type Config struct { // Interval is the time between housekeeping runs. Interval string `yaml:"Interval"` + // DeleteAfterTime finds documents whose removed_at time is older than that time. + DeleteAfterTime string `yaml:"HousekeepingDeleteAfterTime"` + // CandidatesLimitPerProject is the maximum number of candidates to be returned per project. CandidatesLimitPerProject int `yaml:"CandidatesLimitPerProject"` @@ -67,5 +70,13 @@ func (c *Config) Validate() error { ) } + if _, err := time.ParseDuration(c.DeleteAfterTime); err != nil { + return fmt.Errorf( + `invalid argument %v for "--housekeeping-project-delete-after-time" flag: %w`, + c.DeleteAfterTime, + err, + ) + } + return nil } diff --git a/server/backend/housekeeping/config_test.go b/server/backend/housekeeping/config_test.go index 3cdc2c569..5d04bb986 100644 --- a/server/backend/housekeeping/config_test.go +++ b/server/backend/housekeeping/config_test.go @@ -28,6 +28,7 @@ func TestConfig(t *testing.T) { t.Run("validate test", func(t *testing.T) { validConf := housekeeping.Config{ Interval: "1m", + DeleteAfterTime: "1m", CandidatesLimitPerProject: 100, DocumentHardDeletionLimitPerProject: 100, ProjectFetchSize: 100, @@ -39,16 +40,20 @@ func TestConfig(t *testing.T) { assert.Error(t, conf1.Validate()) conf2 := validConf - conf2.CandidatesLimitPerProject = 0 + conf2.DeleteAfterTime = "hour" assert.Error(t, conf2.Validate()) conf3 := validConf - conf3.DocumentHardDeletionLimitPerProject = -1 + conf3.CandidatesLimitPerProject = 0 assert.Error(t, conf3.Validate()) conf4 := validConf - conf4.ProjectFetchSize = -1 + conf4.DocumentHardDeletionLimitPerProject = -1 assert.Error(t, conf4.Validate()) + conf5 := validConf + conf5.ProjectFetchSize = -1 + assert.Error(t, conf5.Validate()) + }) } diff --git a/server/backend/housekeeping/housekeeping.go b/server/backend/housekeeping/housekeeping.go index 3b67bdfce..f7ab1a0f2 100644 --- a/server/backend/housekeeping/housekeeping.go +++ b/server/backend/housekeeping/housekeeping.go @@ -44,6 +44,7 @@ type Housekeeping struct { coordinator sync.Coordinator interval time.Duration + deleteAfterTime time.Duration candidatesLimitPerProject int projectFetchSize int @@ -79,6 +80,11 @@ func New( return nil, fmt.Errorf("parse interval %s: %w", conf.Interval, err) } + deleteAfterTime, err := time.ParseDuration(conf.DeleteAfterTime) + if err != nil { + return nil, fmt.Errorf("parse deleteAfterTime %s: %w", conf.DeleteAfterTime, err) + } + ctx, cancelFunc := context.WithCancel(context.Background()) return &Housekeeping{ @@ -86,6 +92,7 @@ func New( coordinator: coordinator, interval: interval, + deleteAfterTime: deleteAfterTime, candidatesLimitPerProject: conf.CandidatesLimitPerProject, projectFetchSize: conf.ProjectFetchSize, @@ -172,6 +179,7 @@ func (h *Housekeeping) documentHardDeletion( ctx, h.candidatesLimitPerProject, h.projectFetchSize, + h.deleteAfterTime, housekeepingLastProjectID, ) diff --git a/server/config.go b/server/config.go index e2497c856..a434a9acc 100644 --- a/server/config.go +++ b/server/config.go @@ -41,6 +41,7 @@ const ( DefaultProfilingPort = 8081 DefaultHousekeepingInterval = 30 * time.Second + DefaultHousekeepingDeleteAfterTime = -24 * time.Hour DefaultHousekeepingCandidatesLimitPerProject = 500 DefaultHousekeepingDocumentHardDeletionLimitPerProject = 500 DefaultHousekeepingProjectFetchSize = 100 @@ -230,6 +231,7 @@ func newConfig(port int, profilingPort int) *Config { }, Housekeeping: &housekeeping.Config{ Interval: DefaultHousekeepingInterval.String(), + DeleteAfterTime: DefaultHousekeepingDeleteAfterTime.String(), CandidatesLimitPerProject: DefaultHousekeepingCandidatesLimitPerProject, DocumentHardDeletionLimitPerProject: DefaultHousekeepingDocumentHardDeletionLimitPerProject, ProjectFetchSize: DefaultHousekeepingProjectFetchSize, diff --git a/server/config.sample.yml b/server/config.sample.yml index 811db603a..3e6968615 100644 --- a/server/config.sample.yml +++ b/server/config.sample.yml @@ -33,6 +33,9 @@ Housekeeping: # Interval is the time between housekeeping runs (default: 1m). Interval: 1m + # HousekeepingDeleteAfterTime finds documents whose removed_at time is older than that time. (default: -24h). + HousekeepingDeleteAfterTime: -24h + # CandidatesLimitPerProject is the maximum number of candidates to be returned per project (default: 100). CandidatesLimitPerProject: 100 diff --git a/server/rpc/server_test.go b/server/rpc/server_test.go index 745717ad8..4f777ad41 100644 --- a/server/rpc/server_test.go +++ b/server/rpc/server_test.go @@ -83,6 +83,7 @@ func TestMain(m *testing.M) { PingTimeout: helper.MongoPingTimeout, }, &housekeeping.Config{ Interval: helper.HousekeepingInterval.String(), + DeleteAfterTime: helper.HousekeepingDeleteAfterTime.String(), CandidatesLimitPerProject: helper.HousekeepingCandidatesLimitPerProject, ProjectFetchSize: helper.HousekeepingProjectFetchSize, }, met) diff --git a/test/helper/helper.go b/test/helper/helper.go index 362270f06..ff8319c2a 100644 --- a/test/helper/helper.go +++ b/test/helper/helper.go @@ -63,6 +63,7 @@ var ( AdminUser = server.DefaultAdminUser AdminPassword = server.DefaultAdminPassword HousekeepingInterval = 10 * gotime.Second + HousekeepingDeleteAfterTime = 0 * gotime.Second HousekeepingCandidatesLimitPerProject = 10 HousekeepingProjectFetchSize = 10 @@ -211,6 +212,7 @@ func TestConfig() *server.Config { }, Housekeeping: &housekeeping.Config{ Interval: HousekeepingInterval.String(), + DeleteAfterTime: HousekeepingDeleteAfterTime.String(), CandidatesLimitPerProject: HousekeepingCandidatesLimitPerProject, ProjectFetchSize: HousekeepingProjectFetchSize, }, From 78a83f014390d8c190ad68a4e243297178055a77 Mon Sep 17 00:00:00 2001 From: yeongha Date: Wed, 31 Jan 2024 21:20:11 +0900 Subject: [PATCH 15/24] Addition of missing housekeeping config --- server/rpc/server_test.go | 9 +++++---- test/helper/helper.go | 22 ++++++++++++---------- test/sharding/server_test.go | 9 +++++---- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/server/rpc/server_test.go b/server/rpc/server_test.go index 4f777ad41..ef841d2d6 100644 --- a/server/rpc/server_test.go +++ b/server/rpc/server_test.go @@ -82,10 +82,11 @@ func TestMain(m *testing.M) { ConnectionTimeout: helper.MongoConnectionTimeout, PingTimeout: helper.MongoPingTimeout, }, &housekeeping.Config{ - Interval: helper.HousekeepingInterval.String(), - DeleteAfterTime: helper.HousekeepingDeleteAfterTime.String(), - CandidatesLimitPerProject: helper.HousekeepingCandidatesLimitPerProject, - ProjectFetchSize: helper.HousekeepingProjectFetchSize, + Interval: helper.HousekeepingInterval.String(), + DeleteAfterTime: helper.HousekeepingDeleteAfterTime.String(), + CandidatesLimitPerProject: helper.HousekeepingCandidatesLimitPerProject, + DocumentHardDeletionLimitPerProject: helper.HousekeepingDocumentHardDeletionLimitPerProject, + ProjectFetchSize: helper.HousekeepingProjectFetchSize, }, met) if err != nil { log.Fatal(err) diff --git a/test/helper/helper.go b/test/helper/helper.go index ff8319c2a..98f0e80cb 100644 --- a/test/helper/helper.go +++ b/test/helper/helper.go @@ -60,12 +60,13 @@ var ( ProfilingPort = 11102 - AdminUser = server.DefaultAdminUser - AdminPassword = server.DefaultAdminPassword - HousekeepingInterval = 10 * gotime.Second - HousekeepingDeleteAfterTime = 0 * gotime.Second - HousekeepingCandidatesLimitPerProject = 10 - HousekeepingProjectFetchSize = 10 + AdminUser = server.DefaultAdminUser + AdminPassword = server.DefaultAdminPassword + HousekeepingInterval = 10 * gotime.Second + HousekeepingDeleteAfterTime = 0 * gotime.Second + HousekeepingCandidatesLimitPerProject = 10 + HousekeepingDocumentHardDeletionLimitPerProject = 10 + HousekeepingProjectFetchSize = 10 AdminTokenDuration = "10s" ClientDeactivateThreshold = "10s" @@ -211,10 +212,11 @@ func TestConfig() *server.Config { Port: ProfilingPort + portOffset, }, Housekeeping: &housekeeping.Config{ - Interval: HousekeepingInterval.String(), - DeleteAfterTime: HousekeepingDeleteAfterTime.String(), - CandidatesLimitPerProject: HousekeepingCandidatesLimitPerProject, - ProjectFetchSize: HousekeepingProjectFetchSize, + Interval: HousekeepingInterval.String(), + DeleteAfterTime: HousekeepingDeleteAfterTime.String(), + CandidatesLimitPerProject: HousekeepingCandidatesLimitPerProject, + DocumentHardDeletionLimitPerProject: HousekeepingDocumentHardDeletionLimitPerProject, + ProjectFetchSize: HousekeepingProjectFetchSize, }, Backend: &backend.Config{ AdminUser: server.DefaultAdminUser, diff --git a/test/sharding/server_test.go b/test/sharding/server_test.go index 22332e220..250bb895c 100644 --- a/test/sharding/server_test.go +++ b/test/sharding/server_test.go @@ -77,10 +77,11 @@ func TestMain(m *testing.M) { ConnectionTimeout: helper.MongoConnectionTimeout, PingTimeout: helper.MongoPingTimeout, }, &housekeeping.Config{ - IntervalDeactivateClient: helper.HousekeepingIntervalDeactivateClient.String(), - IntervalDocumentDeletion: helper.HousekeepingIntervalDocumentDeletion.String(), - CandidatesLimitPerProject: helper.HousekeepingCandidatesLimitPerProject, - ProjectFetchSize: helper.HousekeepingProjectFetchSize, + Interval: helper.HousekeepingInterval.String(), + DeleteAfterTime: helper.HousekeepingDeleteAfterTime.String(), + CandidatesLimitPerProject: helper.HousekeepingCandidatesLimitPerProject, + DocumentHardDeletionLimitPerProject: helper.HousekeepingDocumentHardDeletionLimitPerProject, + ProjectFetchSize: helper.HousekeepingProjectFetchSize, }, met) if err != nil { log.Fatal(err) From ad81cfe099611d3f8562cedce40ef81e69e9aa43 Mon Sep 17 00:00:00 2001 From: yeongha Date: Mon, 12 Feb 2024 23:41:28 +0900 Subject: [PATCH 16/24] All comments have been reflected, some function changes and comment typos have been corrected for updates. --- cmd/yorkie/server.go | 50 ++++---- server/backend/database/database.go | 21 ++-- server/backend/database/memory/database.go | 58 ++------- .../backend/database/memory/database_test.go | 2 +- server/backend/database/mongo/client.go | 79 +++---------- server/backend/database/mongo/client_test.go | 2 +- .../backend/database/testcases/testcases.go | 18 +-- server/backend/housekeeping/config.go | 55 +++++---- server/backend/housekeeping/config_test.go | 25 ++-- server/backend/housekeeping/housekeeping.go | 110 ++++++++++++++---- server/config.go | 22 ++-- server/config.sample.yml | 19 +-- server/rpc/server_test.go | 11 +- test/helper/helper.go | 26 +++-- test/sharding/server_test.go | 11 +- 15 files changed, 263 insertions(+), 246 deletions(-) diff --git a/cmd/yorkie/server.go b/cmd/yorkie/server.go index 4fd6923c9..7162727f9 100644 --- a/cmd/yorkie/server.go +++ b/cmd/yorkie/server.go @@ -38,10 +38,11 @@ var ( flagConfPath string flagLogLevel string - adminTokenDuration time.Duration - housekeepingInterval time.Duration - deleteAfterTime time.Duration - clientDeactivateThreshold string + adminTokenDuration time.Duration + housekeepingIntervalDeactivateCandidates time.Duration + housekeepingIntervalDeleteDocuments time.Duration + documentHardDeletionGracefulPeriod time.Duration + clientDeactivateThreshold string mongoConnectionURI string mongoConnectionTimeout time.Duration @@ -70,8 +71,9 @@ func newServerCmd() *cobra.Command { conf.Backend.AuthWebhookCacheUnauthTTL = authWebhookCacheUnauthTTL.String() conf.Backend.ProjectInfoCacheTTL = projectInfoCacheTTL.String() - conf.Housekeeping.Interval = housekeepingInterval.String() - conf.Housekeeping.DeleteAfterTime = deleteAfterTime.String() + conf.Housekeeping.IntervalDeactivateCandidates = housekeepingIntervalDeactivateCandidates.String() + conf.Housekeeping.IntervalDeleteDocuments = housekeepingIntervalDeleteDocuments.String() + conf.Housekeeping.DocumentHardDeletionGracefulPeriod = documentHardDeletionGracefulPeriod.String() if mongoConnectionURI != "" { conf.Mongo = &mongo.Config{ @@ -196,28 +198,34 @@ func init() { "Enable runtime profiling data via HTTP server.", ) cmd.Flags().DurationVar( - &housekeepingInterval, - "housekeeping-interval", - server.DefaultHousekeepingInterval, - "housekeeping interval between housekeeping runs", + &housekeepingIntervalDeactivateCandidates, + "housekeeping-interval-Deactivate-Candidates", + server.DefaultHousekeepingIntervalDeactivateCandidates, + "housekeeping Interval deactivate candidates between housekeeping runs", + ) + cmd.Flags().DurationVar( + &housekeepingIntervalDeleteDocuments, + "housekeeping-interval-Delete-Documents", + server.DefaultHousekeepingIntervalDeleteDocuments, + "housekeeping Interval delete documents between housekeeping runs", + ) + cmd.Flags().DurationVar( + &documentHardDeletionGracefulPeriod, + "housekeeping-DocumentHardDeletion-delete-graceful-period", + server.DefaultHousekeepingDocumentHardDeletionGracefulPeriod, + "Document deletion over time after a single housekeeping run", ) cmd.Flags().IntVar( - &conf.Housekeeping.CandidatesLimitPerProject, + &conf.Housekeeping.ClientDeactivationCandidateLimitPerProject, "housekeeping-candidates-limit-per-project", - server.DefaultHousekeepingCandidatesLimitPerProject, + server.DefaultHousekeepingClientDeactivationCandidateLimitPerProject, "candidates limit per project for a single housekeeping run", ) cmd.Flags().IntVar( - &conf.Housekeeping.DocumentHardDeletionLimitPerProject, + &conf.Housekeeping.DocumentHardDeletionCandidateLimitPerProject, "housekeeping-DocumentHardDeletion-limit-per-project", - server.DefaultHousekeepingDocumentHardDeletionLimitPerProject, - "DocumentHardDeletion limit per project for a single housekeeping run", - ) - cmd.Flags().DurationVar( - &deleteAfterTime, - "housekeeping-DocumentHardDeletion-delete-after-time", - server.DefaultHousekeepingDeleteAfterTime, - "DocumentHardDeletion delete after time for a single housekeeping run", + server.DefaultHousekeepingDocumentHardDeletionCandidateLimitPerProject, + "Document Deletion limit per project for a single housekeeping run", ) cmd.Flags().IntVar( &conf.Housekeeping.ProjectFetchSize, diff --git a/server/backend/database/database.go b/server/backend/database/database.go index 2cfeded9f..7b816b2f8 100644 --- a/server/backend/database/database.go +++ b/server/backend/database/database.go @@ -158,20 +158,19 @@ type Database interface { candidatesLimit int, ) ([]*ClientInfo, error) - // FindDocumentHardDeletionCandidates finds the housekeeping deletion candidates. - FindDocumentHardDeletionCandidates( + // FindDocumentHardDeletionCandidatesPerProject finds the documents that need to be deleted housekeeping per project. + FindDocumentHardDeletionCandidatesPerProject( ctx context.Context, - candidatesLimitPerProject int, - projectFetchSize int, - deleteAfterTime gotime.Duration, - lastProjectID types.ID, - ) (types.ID, []*DocInfo, error) + project *ProjectInfo, + candidatesLimit int, + documentHardDeletionGracefulPeriod gotime.Duration, + ) ([]*DocInfo, error) - // DocumentHardDeletion Document complete deletion in progress - DocumentHardDeletion( + // DeleteDocument Document complete deletion in progress + DeleteDocument( ctx context.Context, - candidate []*DocInfo, - ) error + candidates []*DocInfo, + ) (int64, error) // FindDocInfoByKey finds the document of the given key. FindDocInfoByKey( diff --git a/server/backend/database/memory/database.go b/server/backend/database/memory/database.go index 30b0fd355..df9b179d6 100644 --- a/server/backend/database/memory/database.go +++ b/server/backend/database/memory/database.go @@ -624,7 +624,7 @@ func (d *DB) FindDocumentHardDeletionCandidatesPerProject( _ context.Context, project *database.ProjectInfo, candidatesLimit int, - deleteAfterTime gotime.Duration, + documentHardDeletionGracefulPeriod gotime.Duration, ) ([]*database.DocInfo, error) { txn := d.db.Txn(false) @@ -642,14 +642,14 @@ func (d *DB) FindDocumentHardDeletionCandidatesPerProject( } currentTime := gotime.Now() - conditionDeleteAfterTime := currentTime.Add(deleteAfterTime) + conditionDocumentHardDeletionGracefulPeriod := currentTime.Add(-documentHardDeletionGracefulPeriod) for raw := iterator.Next(); raw != nil; raw = iterator.Next() { document := raw.(*database.DocInfo) if candidatesLimit <= len(documents) && candidatesLimit != 0 { break } - if !document.RemovedAt.After(conditionDeleteAfterTime) { + if document.RemovedAt.Before(conditionDocumentHardDeletionGracefulPeriod) { documents = append(documents, document) } } @@ -701,64 +701,28 @@ func (d *DB) FindDeactivateCandidatesPerProject( return infos, nil } -// FindDocumentHardDeletionCandidates finds the clients that need housekeeping. -func (d *DB) FindDocumentHardDeletionCandidates( - ctx context.Context, - candidatesLimitPerProject int, - projectFetchSize int, - deletedAfterTime gotime.Duration, - lastProjectID types.ID, -) (types.ID, []*database.DocInfo, error) { - projects, err := d.FindNextNCyclingProjectInfos(ctx, projectFetchSize, lastProjectID) - if err != nil { - return database.DefaultProjectID, nil, err - } - - var candidates []*database.DocInfo - for _, project := range projects { - infos, err := d.FindDocumentHardDeletionCandidatesPerProject( - ctx, - project, - candidatesLimitPerProject, - deletedAfterTime, - ) - if err != nil { - return database.DefaultProjectID, nil, err - } - - candidates = append(candidates, infos...) - } - - var topProjectID types.ID - if len(projects) < projectFetchSize { - topProjectID = database.DefaultProjectID - } else { - topProjectID = projects[len(projects)-1].ID - } - - return topProjectID, candidates, nil -} - -// DocumentHardDeletion Deletes the documents completely. -func (d *DB) DocumentHardDeletion( +// DeleteDocument Deletes the documents completely. +func (d *DB) DeleteDocument( _ context.Context, candidates []*database.DocInfo, -) error { +) (int64, error) { if len(candidates) <= 0 { - return nil + return 0, nil } txn := d.db.Txn(true) defer txn.Abort() + var deletedCount int64 for _, candidate := range candidates { if err := txn.Delete(tblDocuments, candidate); err != nil { - return fmt.Errorf("fetch hard deletion candidates: %w", err) + return 0, fmt.Errorf("fetch hard deletion candidates: %w", err) } + deletedCount++ } txn.Commit() - return nil + return deletedCount, nil } // FindDocInfoByKeyAndOwner finds the document of the given key. If the diff --git a/server/backend/database/memory/database_test.go b/server/backend/database/memory/database_test.go index ba4a71499..7f8edf3ee 100644 --- a/server/backend/database/memory/database_test.go +++ b/server/backend/database/memory/database_test.go @@ -105,6 +105,6 @@ func TestDB(t *testing.T) { }) t.Run("DocumentHardDeletion test", func(t *testing.T) { - testcases.RunDocumentHardDeletion(t, db) + testcases.RunDocumentHardDeletionTest(t, db) }) } diff --git a/server/backend/database/mongo/client.go b/server/backend/database/mongo/client.go index 9826b7df6..ca9dcd4c8 100644 --- a/server/backend/database/mongo/client.go +++ b/server/backend/database/mongo/client.go @@ -227,34 +227,33 @@ func (c *Client) CreateProjectInfo( return info, nil } -// DocumentHardDeletion Deletes the documents completely. -func (c *Client) DocumentHardDeletion( +// DeleteDocument Deletes the documents completely. +func (c *Client) DeleteDocument( ctx context.Context, candidates []*database.DocInfo, -) error { +) (int64, error) { if len(candidates) <= 0 { - return nil + return 0, nil } - var idList []primitive.ObjectID + var idList []types.ID for _, docInfo := range candidates { - encodedID, err := encodeID(docInfo.ID) - if err != nil { - return err - } - idList = append(idList, encodedID) + idList = append( + idList, + docInfo.ID, + ) } - _, err := c.collection(ColDocuments).DeleteMany( + deletedResult, err := c.collection(ColDocuments).DeleteMany( ctx, bson.M{"_id": bson.M{"$in": idList}}, ) if err != nil { - return fmt.Errorf("deletion Error : %w", err) + return deletedResult.DeletedCount, fmt.Errorf("deletion Error : %w", err) } - return nil + return deletedResult.DeletedCount, nil } // FindNextNCyclingProjectInfos finds the next N cycling projects from the given projectID. @@ -649,25 +648,21 @@ func (c *Client) UpdateClientInfoAfterPushPull( return nil } -// FindDocumentHardDeletionCandidatesPerProject finds the clients that need housekeeping per project. +// FindDocumentHardDeletionCandidatesPerProject finds the documents that need housekeeping per project. func (c *Client) FindDocumentHardDeletionCandidatesPerProject( ctx context.Context, project *database.ProjectInfo, candidatesLimit int, - deleteAfterTime gotime.Duration, + documentHardDeletionGracefulPeriod gotime.Duration, ) ([]*database.DocInfo, error) { - encodedProjectID, err := encodeID(project.ID) - if err != nil { - return nil, err - } currentTime := gotime.Now() - conditionDeleteAfterTime := currentTime.Add(deleteAfterTime) + hardDeletionGracefulPeriod := currentTime.Add(-documentHardDeletionGracefulPeriod) var DocInfos []*database.DocInfo cursor, err := c.collection(ColDocuments).Find(ctx, bson.M{ - "project_id": encodedProjectID, - "removed_at": bson.M{"$lt": conditionDeleteAfterTime}, + "project_id": project.ID, + "removed_at": bson.M{"$lt": hardDeletionGracefulPeriod}, }, options.Find().SetLimit(int64(candidatesLimit))) if err != nil { @@ -715,7 +710,7 @@ func (c *Client) FindDeactivateCandidatesPerProject( // FindDeactivateCandidates finds the clients that need housekeeping. func (c *Client) FindDeactivateCandidates( ctx context.Context, - candidatesLimitPerProject int, + documentHardDeletionCandidateLimitPerProject int, projectFetchSize int, lastProjectID types.ID, ) (types.ID, []*database.ClientInfo, error) { @@ -726,7 +721,7 @@ func (c *Client) FindDeactivateCandidates( var candidates []*database.ClientInfo for _, project := range projects { - clientInfos, err := c.FindDeactivateCandidatesPerProject(ctx, project, candidatesLimitPerProject) + clientInfos, err := c.FindDeactivateCandidatesPerProject(ctx, project, documentHardDeletionCandidateLimitPerProject) if err != nil { return database.DefaultProjectID, nil, err } @@ -743,42 +738,6 @@ func (c *Client) FindDeactivateCandidates( return topProjectID, candidates, nil } -// FindDocumentHardDeletionCandidates finds the clients that need housekeeping. -func (c *Client) FindDocumentHardDeletionCandidates( - ctx context.Context, - candidatesLimitPerProject int, - projectFetchSize int, - deletedAfterTime gotime.Duration, - lastProjectID types.ID, -) (types.ID, []*database.DocInfo, error) { - projects, err := c.FindNextNCyclingProjectInfos(ctx, projectFetchSize, lastProjectID) - if err != nil { - return database.DefaultProjectID, nil, err - } - - var candidates []*database.DocInfo - for _, project := range projects { - docInfos, err := c.FindDocumentHardDeletionCandidatesPerProject( - ctx, - project, - candidatesLimitPerProject, - deletedAfterTime, - ) - if err != nil { - return database.DefaultProjectID, nil, err - } - candidates = append(candidates, docInfos...) - } - - var topProjectID types.ID - if len(projects) < projectFetchSize { - topProjectID = database.DefaultProjectID - } else { - topProjectID = projects[len(projects)-1].ID - } - return topProjectID, candidates, nil -} - // FindDocInfoByKeyAndOwner finds the document of the given key. If the // createDocIfNotExist condition is true, create the document if it does not // exist. diff --git a/server/backend/database/mongo/client_test.go b/server/backend/database/mongo/client_test.go index b3c404518..3a6e75372 100644 --- a/server/backend/database/mongo/client_test.go +++ b/server/backend/database/mongo/client_test.go @@ -122,6 +122,6 @@ func TestClient(t *testing.T) { }) t.Run("DocumentHardDeletion test", func(t *testing.T) { - testcases.RunDocumentHardDeletion(t, cli) + testcases.RunDocumentHardDeletionTest(t, cli) }) } diff --git a/server/backend/database/testcases/testcases.go b/server/backend/database/testcases/testcases.go index 83b1ffa6a..61c6e5ea2 100644 --- a/server/backend/database/testcases/testcases.go +++ b/server/backend/database/testcases/testcases.go @@ -1215,8 +1215,8 @@ func AssertKeys(t *testing.T, expectedKeys []key.Key, infos []*database.DocInfo) assert.EqualValues(t, expectedKeys, keys) } -// RunDocumentHardDeletion runs Delete document permanently -func RunDocumentHardDeletion(t *testing.T, db database.Database) { +// RunDocumentHardDeletionTest runs Delete document permanently +func RunDocumentHardDeletionTest(t *testing.T, db database.Database) { t.Run("housekeeping DocumentHardDeletion test", func(t *testing.T) { ctx := context.Background() projectInfo, err := db.CreateProjectInfo(ctx, t.Name(), dummyOwnerID, clientDeactivateThreshold) @@ -1242,22 +1242,22 @@ func RunDocumentHardDeletion(t *testing.T, db database.Database) { lastProjectID := database.DefaultProjectID var candidates []*database.DocInfo - yesterday := "0s" - deleteAfterTime, err := gotime.ParseDuration(yesterday) + GracePeriod := "0s" + documentHardDeletionGracefulPeriod, err := gotime.ParseDuration(GracePeriod) assert.NoError(t, err) - lastProjectID, candidates, err = db.FindDocumentHardDeletionCandidates( + candidates, err = db.FindDocumentHardDeletionCandidatesPerProject( ctx, - 0, + projectInfo, fetchSize, - deleteAfterTime, - lastProjectID, + documentHardDeletionGracefulPeriod, ) assert.NoError(t, err) assert.Equal(t, database.DefaultProjectID, lastProjectID) - err = db.DocumentHardDeletion(ctx, candidates) + deletedDocumentsCount, err := db.DeleteDocument(ctx, candidates) assert.NoError(t, err) + assert.Equal(t, int(deletedDocumentsCount), len(candidates)) _, err = db.FindDocInfoByRefKey(ctx, docInfo.RefKey()) assert.ErrorIs(t, err, database.ErrDocumentNotFound) diff --git a/server/backend/housekeeping/config.go b/server/backend/housekeeping/config.go index 44121a640..10f6c3ad3 100644 --- a/server/backend/housekeeping/config.go +++ b/server/backend/housekeeping/config.go @@ -23,17 +23,20 @@ import ( // Config is the configuration for the housekeeping service. type Config struct { - // Interval is the time between housekeeping runs. - Interval string `yaml:"Interval"` + // IntervalDeactivateCandidates is the time between housekeeping runs for deactivate candidates. + IntervalDeactivateCandidates string `yaml:"IntervalDeactivateCandidates"` - // DeleteAfterTime finds documents whose removed_at time is older than that time. - DeleteAfterTime string `yaml:"HousekeepingDeleteAfterTime"` + // IntervalDeleteDocuments is the time between housekeeping runs for document deletion. + IntervalDeleteDocuments string `yaml:"IntervalDeleteDocuments"` - // CandidatesLimitPerProject is the maximum number of candidates to be returned per project. - CandidatesLimitPerProject int `yaml:"CandidatesLimitPerProject"` + // DocumentHardDeletionGracefulPeriod finds documents whose removed_at time is older than that time. + DocumentHardDeletionGracefulPeriod string `yaml:"HousekeepingDocumentHardDeletionGracefulPeriod"` - // DocumentHardDeletionLimitPerProject is the maximum number of candidates to be returned per project. - DocumentHardDeletionLimitPerProject int `yaml:"DocumentHardDeletionLimitPerProject"` + // ClientDeactivationCandidateLimitPerProject is the maximum number of candidates to be returned per project. + ClientDeactivationCandidateLimitPerProject int `yaml:"ClientDeactivationCandidateLimitPerProject"` + + // DocumentHardDeletionCandidateLimitPerProject is the maximum number of candidates to be returned per project. + DocumentHardDeletionCandidateLimitPerProject int `yaml:"DocumentHardDeletionCandidateLimitPerProject"` // ProjectFetchSize is the maximum number of projects to be returned to deactivate candidates. ProjectFetchSize int `yaml:"HousekeepingProjectFetchSize"` @@ -41,25 +44,41 @@ type Config struct { // Validate validates the configuration. func (c *Config) Validate() error { - if _, err := time.ParseDuration(c.Interval); err != nil { + if _, err := time.ParseDuration(c.IntervalDeactivateCandidates); err != nil { + return fmt.Errorf( + `invalid argument %s for "--housekeeping-interval-deactivate-candidates" flag: %w`, + c.IntervalDeactivateCandidates, + err, + ) + } + + if _, err := time.ParseDuration(c.IntervalDeleteDocuments); err != nil { + return fmt.Errorf( + `invalid argument %s for "--housekeeping-interval-delete-documents" flag: %w`, + c.IntervalDeleteDocuments, + err, + ) + } + + if _, err := time.ParseDuration(c.DocumentHardDeletionGracefulPeriod); err != nil { return fmt.Errorf( - `invalid argument %s for "--housekeeping-interval" flag: %w`, - c.Interval, + `invalid argument %v for "--housekeeping-project-delete-graceful-period" flag: %w`, + c.DocumentHardDeletionGracefulPeriod, err, ) } - if c.CandidatesLimitPerProject <= 0 { + if c.ClientDeactivationCandidateLimitPerProject <= 0 { return fmt.Errorf( `invalid argument %d for "--housekeeping-candidates-limit-per-project" flag`, c.ProjectFetchSize, ) } - if c.DocumentHardDeletionLimitPerProject < 0 { + if c.DocumentHardDeletionCandidateLimitPerProject <= 0 { return fmt.Errorf( `invalid argument %d for "--housekeeping-document-hard-deletion-limit-per-project" flag`, - c.DocumentHardDeletionLimitPerProject, + c.DocumentHardDeletionCandidateLimitPerProject, ) } @@ -70,13 +89,5 @@ func (c *Config) Validate() error { ) } - if _, err := time.ParseDuration(c.DeleteAfterTime); err != nil { - return fmt.Errorf( - `invalid argument %v for "--housekeeping-project-delete-after-time" flag: %w`, - c.DeleteAfterTime, - err, - ) - } - return nil } diff --git a/server/backend/housekeeping/config_test.go b/server/backend/housekeeping/config_test.go index 5d04bb986..15f8ce469 100644 --- a/server/backend/housekeeping/config_test.go +++ b/server/backend/housekeeping/config_test.go @@ -27,33 +27,38 @@ import ( func TestConfig(t *testing.T) { t.Run("validate test", func(t *testing.T) { validConf := housekeeping.Config{ - Interval: "1m", - DeleteAfterTime: "1m", - CandidatesLimitPerProject: 100, - DocumentHardDeletionLimitPerProject: 100, - ProjectFetchSize: 100, + IntervalDeactivateCandidates: "1m", + IntervalDeleteDocuments: "1m", + DocumentHardDeletionGracefulPeriod: "1m", + ClientDeactivationCandidateLimitPerProject: 100, + DocumentHardDeletionCandidateLimitPerProject: 100, + ProjectFetchSize: 100, } assert.NoError(t, validConf.Validate()) conf1 := validConf - conf1.Interval = "hour" + conf1.IntervalDeactivateCandidates = "hour" assert.Error(t, conf1.Validate()) conf2 := validConf - conf2.DeleteAfterTime = "hour" + conf2.IntervalDeleteDocuments = "minute" assert.Error(t, conf2.Validate()) conf3 := validConf - conf3.CandidatesLimitPerProject = 0 + conf3.DocumentHardDeletionGracefulPeriod = "second" assert.Error(t, conf3.Validate()) conf4 := validConf - conf4.DocumentHardDeletionLimitPerProject = -1 + conf4.ClientDeactivationCandidateLimitPerProject = 0 assert.Error(t, conf4.Validate()) conf5 := validConf - conf5.ProjectFetchSize = -1 + conf5.DocumentHardDeletionCandidateLimitPerProject = 0 assert.Error(t, conf5.Validate()) + conf6 := validConf + conf6.ProjectFetchSize = -1 + assert.Error(t, conf6.Validate()) + }) } diff --git a/server/backend/housekeeping/housekeeping.go b/server/backend/housekeeping/housekeeping.go index f7ab1a0f2..08d536ca2 100644 --- a/server/backend/housekeeping/housekeeping.go +++ b/server/backend/housekeeping/housekeeping.go @@ -43,10 +43,12 @@ type Housekeeping struct { database database.Database coordinator sync.Coordinator - interval time.Duration - deleteAfterTime time.Duration - candidatesLimitPerProject int - projectFetchSize int + intervalDeactivateCandidates time.Duration + intervalDeleteDocuments time.Duration + documentHardDeletionGracefulPeriod time.Duration + clientDeactivationCandidateLimitPerProject int + DocumentHardDeletionCandidateLimitPerProject int + projectFetchSize int ctx context.Context cancelFunc context.CancelFunc @@ -75,14 +77,21 @@ func New( database database.Database, coordinator sync.Coordinator, ) (*Housekeeping, error) { - interval, err := time.ParseDuration(conf.Interval) + intervalDeactivateCandidates, err := time.ParseDuration(conf.IntervalDeactivateCandidates) if err != nil { - return nil, fmt.Errorf("parse interval %s: %w", conf.Interval, err) + return nil, fmt.Errorf("parse intervalDeactivateCandidates %s: %w", + conf.IntervalDeactivateCandidates, err) } - deleteAfterTime, err := time.ParseDuration(conf.DeleteAfterTime) + intervalDeleteDocuments, err := time.ParseDuration(conf.IntervalDeleteDocuments) if err != nil { - return nil, fmt.Errorf("parse deleteAfterTime %s: %w", conf.DeleteAfterTime, err) + return nil, fmt.Errorf("parse intervalDeleteDocuments %s: %w", conf.IntervalDeleteDocuments, err) + } + + documentHardDeletionGracefulPeriod, err := time.ParseDuration(conf.DocumentHardDeletionGracefulPeriod) + if err != nil { + return nil, fmt.Errorf("parse documentHardDeletionGracefulPeriod %s: %w", + conf.DocumentHardDeletionGracefulPeriod, err) } ctx, cancelFunc := context.WithCancel(context.Background()) @@ -91,10 +100,12 @@ func New( database: database, coordinator: coordinator, - interval: interval, - deleteAfterTime: deleteAfterTime, - candidatesLimitPerProject: conf.CandidatesLimitPerProject, - projectFetchSize: conf.ProjectFetchSize, + intervalDeactivateCandidates: intervalDeactivateCandidates, + intervalDeleteDocuments: intervalDeleteDocuments, + documentHardDeletionGracefulPeriod: documentHardDeletionGracefulPeriod, + clientDeactivationCandidateLimitPerProject: conf.ClientDeactivationCandidateLimitPerProject, + DocumentHardDeletionCandidateLimitPerProject: conf.DocumentHardDeletionCandidateLimitPerProject, + projectFetchSize: conf.ProjectFetchSize, ctx: ctx, cancelFunc: cancelFunc, @@ -129,7 +140,7 @@ func (h *Housekeeping) AttachDeactivateCandidates() { housekeepingLastProjectID = lastProjectID select { - case <-time.After(h.interval): + case <-time.After(h.intervalDeactivateCandidates): case <-h.ctx.Done(): return } @@ -142,7 +153,7 @@ func (h *Housekeeping) AttachDocumentHardDeletion() { for { ctx := context.Background() - lastProjectID, err := h.documentHardDeletion(ctx, housekeepingLastProjectID) + lastProjectID, err := h.DeleteDocument(ctx, housekeepingLastProjectID) if err != nil { logging.From(ctx).Error(err) continue @@ -151,35 +162,39 @@ func (h *Housekeeping) AttachDocumentHardDeletion() { housekeepingLastProjectID = lastProjectID select { - case <-time.After(h.interval): + case <-time.After(h.intervalDeleteDocuments): case <-h.ctx.Done(): return } } } -func (h *Housekeeping) documentHardDeletion( +// DeleteDocument deletes a document +func (h *Housekeeping) DeleteDocument( ctx context.Context, housekeepingLastProjectID types.ID, ) (types.ID, error) { + start := time.Now() locker, err := h.coordinator.NewLocker(ctx, documentHardDeletionLockKey) if err != nil { return database.DefaultProjectID, err } + if err := locker.Lock(ctx); err != nil { return database.DefaultProjectID, err } + defer func() { if err := locker.Unlock(ctx); err != nil { logging.From(ctx).Error(err) } }() - lastProjectID, candidates, err := h.database.FindDocumentHardDeletionCandidates( + lastProjectID, candidates, err := h.FindDocumentHardDeletionCandidates( ctx, - h.candidatesLimitPerProject, + h.DocumentHardDeletionCandidateLimitPerProject, h.projectFetchSize, - h.deleteAfterTime, + h.documentHardDeletionGracefulPeriod, housekeepingLastProjectID, ) @@ -187,13 +202,22 @@ func (h *Housekeeping) documentHardDeletion( return database.DefaultProjectID, err } - err = h.database.DocumentHardDeletion(ctx, candidates) + deletedDocumentsCount, err := h.database.DeleteDocument(ctx, candidates) if err != nil { return database.DefaultProjectID, err } - return lastProjectID, err + if len(candidates) > 0 { + logging.From(ctx).Infof( + "HSKP: candidates %d, hard deleted %d, %s", + len(candidates), + deletedDocumentsCount, + time.Since(start), + ) + } + + return lastProjectID, nil } // deactivateCandidates deactivates candidates. @@ -219,7 +243,7 @@ func (h *Housekeeping) deactivateCandidates( lastProjectID, candidates, err := h.FindDeactivateCandidates( ctx, - h.candidatesLimitPerProject, + h.clientDeactivationCandidateLimitPerProject, h.projectFetchSize, housekeepingLastProjectID, ) @@ -255,7 +279,7 @@ func (h *Housekeeping) deactivateCandidates( // FindDeactivateCandidates finds the housekeeping candidates. func (h *Housekeeping) FindDeactivateCandidates( ctx context.Context, - candidatesLimitPerProject int, + clientDeactivationCandidateLimitPerProject int, projectFetchSize int, lastProjectID types.ID, ) (types.ID, []*database.ClientInfo, error) { @@ -266,7 +290,45 @@ func (h *Housekeeping) FindDeactivateCandidates( var candidates []*database.ClientInfo for _, project := range projects { - infos, err := h.database.FindDeactivateCandidatesPerProject(ctx, project, candidatesLimitPerProject) + infos, err := h.database.FindDeactivateCandidatesPerProject(ctx, project, clientDeactivationCandidateLimitPerProject) + if err != nil { + return database.DefaultProjectID, nil, err + } + + candidates = append(candidates, infos...) + } + + var topProjectID types.ID + if len(projects) < projectFetchSize { + topProjectID = database.DefaultProjectID + } else { + topProjectID = projects[len(projects)-1].ID + } + + return topProjectID, candidates, nil +} + +// FindDocumentHardDeletionCandidates finds the clients that need housekeeping. +func (h *Housekeeping) FindDocumentHardDeletionCandidates( + ctx context.Context, + documentHardDeletionCandidateLimitPerProject int, + projectFetchSize int, + deletedAfterTime time.Duration, + lastProjectID types.ID, +) (types.ID, []*database.DocInfo, error) { + projects, err := h.database.FindNextNCyclingProjectInfos(ctx, projectFetchSize, lastProjectID) + if err != nil { + return database.DefaultProjectID, nil, err + } + + var candidates []*database.DocInfo + for _, project := range projects { + infos, err := h.database.FindDocumentHardDeletionCandidatesPerProject( + ctx, + project, + documentHardDeletionCandidateLimitPerProject, + deletedAfterTime, + ) if err != nil { return database.DefaultProjectID, nil, err } diff --git a/server/config.go b/server/config.go index a434a9acc..df710abdb 100644 --- a/server/config.go +++ b/server/config.go @@ -40,11 +40,12 @@ const ( DefaultProfilingPort = 8081 - DefaultHousekeepingInterval = 30 * time.Second - DefaultHousekeepingDeleteAfterTime = -24 * time.Hour - DefaultHousekeepingCandidatesLimitPerProject = 500 - DefaultHousekeepingDocumentHardDeletionLimitPerProject = 500 - DefaultHousekeepingProjectFetchSize = 100 + DefaultHousekeepingIntervalDeactivateCandidates = 30 * time.Second + DefaultHousekeepingIntervalDeleteDocuments = 30 * time.Second + DefaultHousekeepingDocumentHardDeletionGracefulPeriod = 24 * time.Hour + DefaultHousekeepingClientDeactivationCandidateLimitPerProject = 500 + DefaultHousekeepingDocumentHardDeletionCandidateLimitPerProject = 500 + DefaultHousekeepingProjectFetchSize = 100 DefaultMongoConnectionURI = "mongodb://localhost:27017" DefaultMongoConnectionTimeout = 5 * time.Second @@ -230,11 +231,12 @@ func newConfig(port int, profilingPort int) *Config { Port: profilingPort, }, Housekeeping: &housekeeping.Config{ - Interval: DefaultHousekeepingInterval.String(), - DeleteAfterTime: DefaultHousekeepingDeleteAfterTime.String(), - CandidatesLimitPerProject: DefaultHousekeepingCandidatesLimitPerProject, - DocumentHardDeletionLimitPerProject: DefaultHousekeepingDocumentHardDeletionLimitPerProject, - ProjectFetchSize: DefaultHousekeepingProjectFetchSize, + IntervalDeactivateCandidates: DefaultHousekeepingIntervalDeactivateCandidates.String(), + IntervalDeleteDocuments: DefaultHousekeepingIntervalDeleteDocuments.String(), + DocumentHardDeletionGracefulPeriod: DefaultHousekeepingDocumentHardDeletionGracefulPeriod.String(), + ClientDeactivationCandidateLimitPerProject: DefaultHousekeepingClientDeactivationCandidateLimitPerProject, + DocumentHardDeletionCandidateLimitPerProject: DefaultHousekeepingDocumentHardDeletionCandidateLimitPerProject, + ProjectFetchSize: DefaultHousekeepingProjectFetchSize, }, Backend: &backend.Config{ ClientDeactivateThreshold: DefaultClientDeactivateThreshold, diff --git a/server/config.sample.yml b/server/config.sample.yml index 3e6968615..d75118068 100644 --- a/server/config.sample.yml +++ b/server/config.sample.yml @@ -30,17 +30,20 @@ Profiling: # Housekeeping is the configuration for the housekeeping. Housekeeping: - # Interval is the time between housekeeping runs (default: 1m). - Interval: 1m + # IntervalDeactivateCandidates is the time between housekeeping runs (default: 1m). + IntervalDeactivateCandidates: 1m - # HousekeepingDeleteAfterTime finds documents whose removed_at time is older than that time. (default: -24h). - HousekeepingDeleteAfterTime: -24h + # IntervalDeleteDocuments is the time between housekeeping runs (default: 1m). + IntervalDeleteDocuments: 1m - # CandidatesLimitPerProject is the maximum number of candidates to be returned per project (default: 100). - CandidatesLimitPerProject: 100 + # HousekeepingDocumentHardDeletionGracefulPeriod finds documents whose removed_at time is older than that time. (default: 24h). + HousekeepingDocumentHardDeletionGracefulPeriod: 24h - # DocumentHardDeletionLimitPerProject is the maximum number of candidates to be returned per project (default: 500). - DocumentHardDeletionLimitPerProject: 500 + # ClientDeactivationCandidateLimitPerProject is the maximum number of candidates to be returned per project (default: 100). + ClientDeactivationCandidateLimitPerProject: 100 + + # DocumentHardDeletionCandidateLimitPerProject is the maximum number of candidates to be returned per project (default: 500). + DocumentHardDeletionCandidateLimitPerProject: 500 # ProjectFetchSize is the maximum number of projects to be returned to deactivate candidates. (default: 100). ProjectFetchSize: 100 diff --git a/server/rpc/server_test.go b/server/rpc/server_test.go index ef841d2d6..9b8b4dd64 100644 --- a/server/rpc/server_test.go +++ b/server/rpc/server_test.go @@ -82,11 +82,12 @@ func TestMain(m *testing.M) { ConnectionTimeout: helper.MongoConnectionTimeout, PingTimeout: helper.MongoPingTimeout, }, &housekeeping.Config{ - Interval: helper.HousekeepingInterval.String(), - DeleteAfterTime: helper.HousekeepingDeleteAfterTime.String(), - CandidatesLimitPerProject: helper.HousekeepingCandidatesLimitPerProject, - DocumentHardDeletionLimitPerProject: helper.HousekeepingDocumentHardDeletionLimitPerProject, - ProjectFetchSize: helper.HousekeepingProjectFetchSize, + IntervalDeactivateCandidates: helper.HousekeepingIntervalDeactivateCandidates.String(), + IntervalDeleteDocuments: helper.HousekeepingIntervalDeleteDocuments.String(), + DocumentHardDeletionGracefulPeriod: helper.HousekeepingDocumentHardDeletionGracefulPeriod.String(), + ClientDeactivationCandidateLimitPerProject: helper.HousekeepingClientDeactivationCandidateLimitPerProject, + DocumentHardDeletionCandidateLimitPerProject: helper.HousekeepingDocumentHardDeletionCandidateLimitPerProject, + ProjectFetchSize: helper.HousekeepingProjectFetchSize, }, met) if err != nil { log.Fatal(err) diff --git a/test/helper/helper.go b/test/helper/helper.go index 98f0e80cb..6b447f584 100644 --- a/test/helper/helper.go +++ b/test/helper/helper.go @@ -60,13 +60,14 @@ var ( ProfilingPort = 11102 - AdminUser = server.DefaultAdminUser - AdminPassword = server.DefaultAdminPassword - HousekeepingInterval = 10 * gotime.Second - HousekeepingDeleteAfterTime = 0 * gotime.Second - HousekeepingCandidatesLimitPerProject = 10 - HousekeepingDocumentHardDeletionLimitPerProject = 10 - HousekeepingProjectFetchSize = 10 + AdminUser = server.DefaultAdminUser + AdminPassword = server.DefaultAdminPassword + HousekeepingIntervalDeactivateCandidates = 10 * gotime.Second + HousekeepingIntervalDeleteDocuments = 10 * gotime.Second + HousekeepingDocumentHardDeletionGracefulPeriod = 0 * gotime.Second + HousekeepingClientDeactivationCandidateLimitPerProject = 10 + HousekeepingDocumentHardDeletionCandidateLimitPerProject = 10 + HousekeepingProjectFetchSize = 10 AdminTokenDuration = "10s" ClientDeactivateThreshold = "10s" @@ -212,11 +213,12 @@ func TestConfig() *server.Config { Port: ProfilingPort + portOffset, }, Housekeeping: &housekeeping.Config{ - Interval: HousekeepingInterval.String(), - DeleteAfterTime: HousekeepingDeleteAfterTime.String(), - CandidatesLimitPerProject: HousekeepingCandidatesLimitPerProject, - DocumentHardDeletionLimitPerProject: HousekeepingDocumentHardDeletionLimitPerProject, - ProjectFetchSize: HousekeepingProjectFetchSize, + IntervalDeactivateCandidates: HousekeepingIntervalDeactivateCandidates.String(), + IntervalDeleteDocuments: HousekeepingIntervalDeleteDocuments.String(), + DocumentHardDeletionGracefulPeriod: HousekeepingDocumentHardDeletionGracefulPeriod.String(), + ClientDeactivationCandidateLimitPerProject: HousekeepingClientDeactivationCandidateLimitPerProject, + DocumentHardDeletionCandidateLimitPerProject: HousekeepingDocumentHardDeletionCandidateLimitPerProject, + ProjectFetchSize: HousekeepingProjectFetchSize, }, Backend: &backend.Config{ AdminUser: server.DefaultAdminUser, diff --git a/test/sharding/server_test.go b/test/sharding/server_test.go index 250bb895c..1351a106d 100644 --- a/test/sharding/server_test.go +++ b/test/sharding/server_test.go @@ -77,11 +77,12 @@ func TestMain(m *testing.M) { ConnectionTimeout: helper.MongoConnectionTimeout, PingTimeout: helper.MongoPingTimeout, }, &housekeeping.Config{ - Interval: helper.HousekeepingInterval.String(), - DeleteAfterTime: helper.HousekeepingDeleteAfterTime.String(), - CandidatesLimitPerProject: helper.HousekeepingCandidatesLimitPerProject, - DocumentHardDeletionLimitPerProject: helper.HousekeepingDocumentHardDeletionLimitPerProject, - ProjectFetchSize: helper.HousekeepingProjectFetchSize, + IntervalDeactivateCandidates: helper.HousekeepingIntervalDeactivateCandidates.String(), + IntervalDeleteDocuments: helper.HousekeepingIntervalDeleteDocuments.String(), + DocumentHardDeletionGracefulPeriod: helper.HousekeepingDocumentHardDeletionGracefulPeriod.String(), + ClientDeactivationCandidateLimitPerProject: helper.HousekeepingClientDeactivationCandidateLimitPerProject, + DocumentHardDeletionCandidateLimitPerProject: helper.HousekeepingDocumentHardDeletionCandidateLimitPerProject, + ProjectFetchSize: helper.HousekeepingProjectFetchSize, }, met) if err != nil { log.Fatal(err) From d45f2ab82b001d7d55a7e624a08589096d7d21aa Mon Sep 17 00:00:00 2001 From: yeongha Date: Tue, 13 Feb 2024 00:22:37 +0900 Subject: [PATCH 17/24] Change the FindDocumentHardDeletionCandidatesPerProject condition from less than to less than or equal to --- server/backend/database/memory/database.go | 2 +- server/backend/database/mongo/client.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/backend/database/memory/database.go b/server/backend/database/memory/database.go index df9b179d6..3b5210d21 100644 --- a/server/backend/database/memory/database.go +++ b/server/backend/database/memory/database.go @@ -649,7 +649,7 @@ func (d *DB) FindDocumentHardDeletionCandidatesPerProject( break } - if document.RemovedAt.Before(conditionDocumentHardDeletionGracefulPeriod) { + if !document.RemovedAt.After(conditionDocumentHardDeletionGracefulPeriod) { documents = append(documents, document) } } diff --git a/server/backend/database/mongo/client.go b/server/backend/database/mongo/client.go index ca9dcd4c8..b68fae2e7 100644 --- a/server/backend/database/mongo/client.go +++ b/server/backend/database/mongo/client.go @@ -662,7 +662,7 @@ func (c *Client) FindDocumentHardDeletionCandidatesPerProject( var DocInfos []*database.DocInfo cursor, err := c.collection(ColDocuments).Find(ctx, bson.M{ "project_id": project.ID, - "removed_at": bson.M{"$lt": hardDeletionGracefulPeriod}, + "removed_at": bson.M{"$lte": hardDeletionGracefulPeriod}, }, options.Find().SetLimit(int64(candidatesLimit))) if err != nil { From 3bb69e0e56edd2b32284abd81a0f2f0918965422 Mon Sep 17 00:00:00 2001 From: yeongha Date: Sat, 27 Jul 2024 22:01:54 +0900 Subject: [PATCH 18/24] merge solve --- .github/workflows/ci.yml | 8 + CHANGELOG.md | 453 ++-- MAINTAINING.md | 19 +- Makefile | 13 +- api/converter/converter_test.go | 31 + api/converter/errors.go | 27 + api/converter/from_pb.go | 36 +- api/converter/to_bytes.go | 23 +- api/converter/to_pb.go | 19 +- api/docs/yorkie.base.yaml | 18 + api/docs/yorkie/v1/admin.openapi.yaml | 2038 +++++++++++++++++ api/docs/yorkie/v1/resources.openapi.yaml | 1724 ++++++++++++++ api/docs/yorkie/v1/yorkie.openapi.yaml | 1571 +++++++++++++ api/yorkie/v1/admin.pb.go | 508 ++-- api/yorkie/v1/admin.proto | 11 + api/yorkie/v1/resources.pb.go | 919 ++++---- api/yorkie/v1/resources.proto | 2 + api/yorkie/v1/v1connect/admin.connect.go | 27 + buf.gen.yaml | 4 + .../yorkie-argocd/templates/ingress.yaml | 19 +- build/charts/yorkie-argocd/values.yaml | 9 +- build/charts/yorkie-cluster/Chart.yaml | 4 +- build/charts/yorkie-cluster/README.md | 2 + .../charts/yorkie-cluster/istio-operator.yaml | 7 +- .../templates/istio/gateway.yaml | 3 +- .../templates/istio/ingress-envoy-filter.yaml | 8 +- .../templates/istio/ingress.yaml | 23 +- .../templates/yorkie/deployment.yaml | 2 +- .../templates/yorkie/namespace.yaml | 9 - build/charts/yorkie-cluster/values.yaml | 11 +- build/charts/yorkie-mongodb/values.yaml | 26 + .../yorkie-monitoring/templates/ingress.yaml | 19 +- build/charts/yorkie-monitoring/values.yaml | 9 +- client/client.go | 103 +- client/options.go | 6 + cmd/yorkie/server.go | 6 + cmd/yorkie/version.go | 20 - design/README.md | 1 + .../media/mongodb-sharding-cluster-arch.png | Bin 0 -> 596943 bytes .../mongodb-sharding-composite-shard-key.png | Bin 0 -> 252429 bytes .../mongodb-sharding-current-relation.png | Bin 0 -> 384402 bytes ...-sharding-duplicate-objectid-migration.png | Bin 0 -> 142892 bytes .../media/mongodb-sharding-prev-relation.png | Bin 0 -> 329269 bytes .../mongodb-sharding-ref-key-changes.png | Bin 0 -> 139346 bytes design/mongodb-sharding.md | 208 ++ design/template.md | 2 + design/tree.md | 4 +- go.mod | 10 +- go.sum | 29 +- pkg/document/change/context.go | 6 +- pkg/document/change/pack.go | 5 + pkg/document/crdt/element.go | 7 - pkg/document/crdt/gc.go | 37 + pkg/document/crdt/rga_tree_split.go | 99 +- pkg/document/crdt/rht.go | 131 +- pkg/document/crdt/rht_test.go | 194 +- pkg/document/crdt/root.go | 95 +- pkg/document/crdt/root_test.go | 92 +- pkg/document/crdt/text.go | 100 +- pkg/document/crdt/text_test.go | 10 +- pkg/document/crdt/tree.go | 520 +++-- pkg/document/crdt/tree_test.go | 241 +- pkg/document/document.go | 76 +- pkg/document/document_test.go | 57 + pkg/document/gc_test.go | 222 ++ pkg/document/internal_document.go | 4 +- pkg/document/json/text.go | 22 +- pkg/document/json/tree.go | 26 +- pkg/document/operations/edit.go | 33 +- pkg/document/operations/style.go | 36 +- pkg/document/operations/tree_edit.go | 41 +- pkg/document/operations/tree_style.go | 56 +- pkg/index/tree.go | 72 +- pkg/llrb/llrb.go | 5 + server/backend/backend.go | 84 +- server/backend/config.go | 3 + server/backend/database/client_info.go | 39 +- server/backend/database/client_info_test.go | 29 +- server/backend/database/database.go | 7 + server/backend/database/memory/database.go | 129 +- .../backend/database/memory/database_test.go | 4 + server/backend/database/mongo/client.go | 75 +- server/backend/database/mongo/client_test.go | 4 + .../backend/database/testcases/testcases.go | 213 +- server/backend/housekeeping/config.go | 12 + server/backend/housekeeping/housekeeping.go | 113 +- server/clients/clients.go | 49 +- server/clients/housekeeping.go | 122 + server/config.go | 1 + server/documents/documents.go | 52 +- server/logging/logging.go | 24 +- server/packs/packs.go | 38 +- server/packs/pushpull.go | 2 +- server/packs/snapshots.go | 2 +- server/rpc/admin_server.go | 32 + server/rpc/connecthelper/logging.go | 77 - server/rpc/connecthelper/status.go | 145 +- .../interceptors/{admin_auth.go => admin.go} | 77 +- server/rpc/interceptors/default.go | 5 +- server/rpc/interceptors/requestid.go | 42 + .../interceptors/{context.go => yorkie.go} | 45 +- server/rpc/server.go | 6 +- server/rpc/server_test.go | 6 +- server/rpc/testcases/testcases.go | 35 +- server/rpc/yorkie_server.go | 70 +- server/server.go | 68 + test/bench/grpc_bench_test.go | 4 +- test/bench/push_pull_bench_test.go | 32 +- test/helper/helper.go | 83 +- test/integration/admin_test.go | 11 +- test/integration/auth_webhook_test.go | 2 +- test/integration/client_test.go | 34 + test/integration/document_test.go | 74 +- test/integration/gc_test.go | 212 ++ test/integration/housekeeping_test.go | 64 +- test/integration/presence_test.go | 27 +- test/integration/restapi_test.go | 134 ++ test/integration/server_test.go | 2 +- test/integration/text_test.go | 2 + test/integration/tree_concurrency_test.go | 215 +- test/integration/tree_test.go | 217 +- test/sharding/mongo_client_test.go | 4 + test/sharding/server_test.go | 1 + 123 files changed, 10794 insertions(+), 2112 deletions(-) create mode 100644 api/converter/errors.go create mode 100644 api/docs/yorkie.base.yaml create mode 100644 api/docs/yorkie/v1/admin.openapi.yaml create mode 100644 api/docs/yorkie/v1/resources.openapi.yaml create mode 100644 api/docs/yorkie/v1/yorkie.openapi.yaml delete mode 100644 build/charts/yorkie-cluster/templates/yorkie/namespace.yaml create mode 100644 design/media/mongodb-sharding-cluster-arch.png create mode 100644 design/media/mongodb-sharding-composite-shard-key.png create mode 100644 design/media/mongodb-sharding-current-relation.png create mode 100644 design/media/mongodb-sharding-duplicate-objectid-migration.png create mode 100644 design/media/mongodb-sharding-prev-relation.png create mode 100644 design/media/mongodb-sharding-ref-key-changes.png create mode 100644 design/mongodb-sharding.md create mode 100644 pkg/document/crdt/gc.go create mode 100644 pkg/document/gc_test.go create mode 100644 server/clients/housekeeping.go delete mode 100644 server/rpc/connecthelper/logging.go rename server/rpc/interceptors/{admin_auth.go => admin.go} (69%) create mode 100644 server/rpc/interceptors/requestid.go rename server/rpc/interceptors/{context.go => yorkie.go} (76%) create mode 100644 test/integration/restapi_test.go diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a5d937265..e3254891d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,6 +5,12 @@ on: branches: [ main ] pull_request: branches: [ main ] + paths-ignore: + - 'api/docs/**' + - 'build/charts/**' + - '**/*.md' + - '**/*.txt' + - '**/.gitignore' env: GO_VERSION: '1.21' @@ -50,6 +56,8 @@ jobs: uses: codecov/codecov-action@v3 with: file: ./coverage.txt + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} bench: name: bench diff --git a/CHANGELOG.md b/CHANGELOG.md index 85af775c5..824d830b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,275 +7,464 @@ and Yorkie adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html) ## [Unreleased] +## [0.4.27] - 2024-07-11 + +### Changed + +- Provide error codes for enhancing error handling from clients by @hackerwins in https://github.com/yorkie-team/yorkie/pull/927 + +### Fixed + +- Prevent exposure of removed documents when searching by @hackerwins in https://github.com/yorkie-team/yorkie/pull/918 +- Ensure proper deletion of documents in MemDB by @hackerwins in https://github.com/yorkie-team/yorkie/pull/920 +- Handle local changes correctly when receiving snapshot by @raararaara in https://github.com/yorkie-team/yorkie/pull/923 + +## [0.4.26] - 2024-07-04 + +### Fixed + +- Remove node from index during GC by @raararaara in https://github.com/yorkie-team/yorkie/pull/913 + +## [0.4.25] - 2024-07-03 + +### Added + +- Add GetDocuments API returning document summaries by @hackerwins in https://github.com/yorkie-team/yorkie/pull/909 + +### Changed + +- Update CI workflow to trigger Pull Request CI only on code-level changes by @kokodak in https://github.com/yorkie-team/yorkie/pull/906 +- Return ErrAlreadyDetached when reattaching by @hackerwins in https://github.com/yorkie-team/yorkie/pull/908 +- Add Project field to YorkieService logs by @hackerwins in https://github.com/yorkie-team/yorkie/pull/911 + +### Fixed + +- Remove commit revision in version command by @hackerwins in https://github.com/yorkie-team/yorkie/pull/905 +- Fix missing document detachments when client is deactivated by @raararaara in https://github.com/yorkie-team/yorkie/pull/907 + +## [0.4.24] - 2024-06-14 + +### Fixed + +- Fix duplicate changes when syncing and detaching by @hackerwins in https://github.com/yorkie-team/yorkie/pull/896 + +## [0.4.23] - 2024-06-07 + +### Fixed + +- Fix miscalculation of tree size in concurrent editing by @raararaara in https://github.com/yorkie-team/yorkie/pull/891 + +## [0.4.22] - 2024-06-04 + +## Added + +- Add RHTNode removal to converter for consistency by @hackerwins in https://github.com/yorkie-team/yorkie/pull/888 + +## [0.4.21] - 2024-06-03 + +### Added + +- Handle concurrent Tree.RemoveStyle by @hackerwins in https://github.com/yorkie-team/yorkie/pull/883 + +### Changed + +- Return ErrClientNotActivated for deactivated clients on WatchDocument by @hackerwins in https://github.com/yorkie-team/yorkie/pull/877 + +### Fixed + +- Fix incorrect tree snapshot encoding/decoding by @raararaara in https://github.com/yorkie-team/yorkie/pull/881 + +## [0.4.20] - 2024-05-24 + +### Added + +- Implement RHT.GC by @hackerwins in https://github.com/yorkie-team/yorkie/pull/864 +- Add Resource Configuration in `yorkie-mongodb` Helm chart by @krapie in https://github.com/yorkie-team/yorkie/pull/872 +- Add snapshot-disable-gc flag by @hackerwins in https://github.com/yorkie-team/yorkie/pull/874 + +### Changed + +- Move ToXML from RHT to TreeNode by @raararaara in https://github.com/yorkie-team/yorkie/pull/863 +- Apply GCPair to TreeNode, TextNode by @hackerwins in https://github.com/yorkie-team/yorkie/pull/866 + +## [0.4.19] - 2024-05-10 + +### Fixed + +- Handle concurrent editing and styling in Tree by @hackerwins in https://github.com/yorkie-team/yorkie/pull/854 +- Fix inconsistent garbage collection for multiple nodes in text and tree type by @chacha912 in https://github.com/yorkie-team/yorkie/pull/855 + +## [0.4.18] - 2024-04-23 + +### Added + +- Support `yorkie-monitoring` and `yorkie-argocd` Charts on NCP by @krapie in https://github.com/yorkie-team/yorkie/pull/846 + +## [0.4.17] - 2024-04-19 + +### Added + +- Support NCP ALB by @hackerwins in https://github.com/yorkie-team/yorkie/pull/835 + +### Changed + +- Move Client.Watch inside Client.Attach by @krapie in https://github.com/yorkie-team/yorkie/pull/803 +- Use DBConnectionURI directly by @hackerwins in https://github.com/yorkie-team/yorkie/pull/833 +- Move `istio-ingressgateway` to Yorkie Namespace by @krapie in https://github.com/yorkie-team/yorkie/pull/836 + +### Fixed + +- Provide CODECOV_TOKEN to codecov-action by @hackerwins in https://github.com/yorkie-team/yorkie/pull/843 + +## [0.4.16] - 2024-03-29 + +### Fixed + +- Fix incorrect calculation in `indexTree.treePosToPath` operation by @raararaara in https://github.com/yorkie-team/yorkie/pull/824 +- Fix logic errors in TreeNode.DeepCopy by @raararaara in https://github.com/yorkie-team/yorkie/pull/821 +- Fix missing escapeString in Tree Marshal by @chacha912 https://github.com/yorkie-team/yorkie/pull/830 + +## [0.4.15] - 2024-03-11 + +### Added + +- Add Swagger Serving Command by @devleejb in https://github.com/yorkie-team/yorkie/pull/812 +- Add MongoDB sharding document by @sejongk in https://github.com/yorkie-team/yorkie/pull/781 +- Add merge and split concurrency tests by @justiceHui in https://github.com/yorkie-team/yorkie/pull/780 + +### Fixed + +- Prevent RunTestConcurrency from creating garbage clients by @justiceHui in https://github.com/yorkie-team/yorkie/pull/793 +- Add Test Server Wait Helper Function by @krapie in https://github.com/yorkie-team/yorkie/pull/787 +- Update Design Document for Missing Document Link and Instructon by @krapie in https://github.com/yorkie-team/yorkie/pull/782 + +## [0.4.14] - 2024-01-29 + +### Added + +- Introduce MongoDB sharding rules to Project-wide and Document-wide collections by @sejongk in https://github.com/yorkie-team/yorkie/pull/776 +- Add Helm chart for MongoDB sharded cluster by @sejongk in https://github.com/yorkie-team/yorkie/pull/769 +- Improve object creation with an initial value of specific types by @highcloud100 in https://github.com/yorkie-team/yorkie/pull/766 + +### Changed + +- Refactor concurrency tests for basic Tree.Edit by @justiceHui in https://github.com/yorkie-team/yorkie/pull/772 +- Remove unnecessary `String()` calls with `stringer` interface by @sejongk in https://github.com/yorkie-team/yorkie/pull/777 + ## [0.4.13] - 2024-01-19 ### Added -* Add API for Retrieving All Documents by @raararaara in https://github.com/yorkie-team/yorkie/pull/755 -* Introduce object creation interface with initial values by @highcloud100 in https://github.com/yorkie-team/yorkie/pull/756 -* Implement Tree.RemoveStyle by @justiceHui in https://github.com/yorkie-team/yorkie/pull/748 + +- Add API for Retrieving All Documents by @raararaara in https://github.com/yorkie-team/yorkie/pull/755 +- Introduce object creation interface with initial values by @highcloud100 in https://github.com/yorkie-team/yorkie/pull/756 +- Implement Tree.RemoveStyle by @justiceHui in https://github.com/yorkie-team/yorkie/pull/748 ### Fixed -* Fix RHT.Remove and Add test code by @justiceHui in https://github.com/yorkie-team/yorkie/pull/752 -* FIx Finding Housekeeping Candidates and Modify Housekeeping Structure by @devleejb in https://github.com/yorkie-team/yorkie/pull/749 -* Add concurrent editing test cases in Tree by @sejongk in https://github.com/yorkie-team/yorkie/pull/751 + +- Fix RHT.Remove and Add test code by @justiceHui in https://github.com/yorkie-team/yorkie/pull/752 +- FIx Finding Housekeeping Candidates and Modify Housekeeping Structure by @devleejb in https://github.com/yorkie-team/yorkie/pull/749 +- Add concurrent editing test cases in Tree by @sejongk in https://github.com/yorkie-team/yorkie/pull/751 ## [0.4.12] - 2024-01-05 ### Changed -* Introduce TreeToken and tokensBetween to Tree by @sejongk in https://github.com/yorkie-team/yorkie/pull/747 -* Add RPC and profiling ports to Yorkie deployment by @hackerwins in https://github.com/yorkie-team/yorkie/pull/727 + +- Introduce TreeToken and tokensBetween to Tree by @sejongk in https://github.com/yorkie-team/yorkie/pull/747 +- Add RPC and profiling ports to Yorkie deployment by @hackerwins in https://github.com/yorkie-team/yorkie/pull/727 ### Fixed -* Change CLI TLS configuration to HTTP2 by @krapie in https://github.com/yorkie-team/yorkie/pull/742 -* Replace grpcstatus.Errorf with connect.Error by @chacha912, @highcloud100 in https://github.com/yorkie-team/yorkie/pull/741 -* Fix `getGarbageLen` to retrun correct size by @devleejb in https://github.com/yorkie-team/yorkie/pull/743 -* Fix typo in `MAINTAINING.md` by @devleejb in https://github.com/yorkie-team/yorkie/pull/739 + +- Change CLI TLS configuration to HTTP2 by @krapie in https://github.com/yorkie-team/yorkie/pull/742 +- Replace grpcstatus.Errorf with connect.Error by @chacha912, @highcloud100 in https://github.com/yorkie-team/yorkie/pull/741 +- Fix `getGarbageLen` to retrun correct size by @devleejb in https://github.com/yorkie-team/yorkie/pull/743 +- Fix typo in `MAINTAINING.md` by @devleejb in https://github.com/yorkie-team/yorkie/pull/739 ## [0.4.11] - 2023-12-18 ### Added -* Support concurrent insertion and splitting in Tree by @sejongk in https://github.com/yorkie-team/yorkie/pull/725 + +- Support concurrent insertion and splitting in Tree by @sejongk in https://github.com/yorkie-team/yorkie/pull/725 ### Changed -* Migrate RPC to ConnectRPC by @krapie, @hackerwins https://github.com/yorkie-team/yorkie/pull/703 + +- Migrate RPC to ConnectRPC by @krapie, @hackerwins https://github.com/yorkie-team/yorkie/pull/703 ### Fixed -* Address duplicate nodeIDs in Tree.Split @sejongk https://github.com/yorkie-team/yorkie/pull/724 + +- Address duplicate nodeIDs in Tree.Split @sejongk https://github.com/yorkie-team/yorkie/pull/724 ## [0.4.10] - 2023-12-04 ### Added -* Add Rate Limit using Istio Envoy by @joonhyukchoi in https://github.com/yorkie-team/yorkie/pull/674 -* Implement splitLevel of Tree.Edit by @hackerwins in https://github.com/yorkie-team/yorkie/pull/705 + +- Add Rate Limit using Istio Envoy by @joonhyukchoi in https://github.com/yorkie-team/yorkie/pull/674 +- Implement splitLevel of Tree.Edit by @hackerwins in https://github.com/yorkie-team/yorkie/pull/705 ### Changed -* Bump github.com/spf13/viper from 1.15.0 to 1.17.0 by @dependabot in https://github.com/yorkie-team/yorkie/pull/693 -* Bump github.com/jedib0t/go-pretty/v6 from 6.4.0 to 6.4.9 by @dependabot in https://github.com/yorkie-team/yorkie/pull/695 -* Bump actions/setup-go from 3 to 4 by @dependabot in https://github.com/yorkie-team/yorkie/pull/698 -* Bump helm/chart-releaser-action from 1.5.0 to 1.6.0 by @dependabot in https://github.com/yorkie-team/yorkie/pull/699 -* Bump docker/login-action from 2 to 3 by @dependabot in https://github.com/yorkie-team/yorkie/pull/700 -* Bump google.golang.org/grpc from 1.58.2 to 1.58.3 by @dependabot in https://github.com/yorkie-team/yorkie/pull/701 -* Bump golang.org/x/crypto from 0.14.0 to 0.16.0 by @dependabot in https://github.com/yorkie-team/yorkie/pull/702 -* Bump github.com/rs/xid from 1.4.0 to 1.5.0 by @dependabot in https://github.com/yorkie-team/yorkie/pull/697 + +- Bump github.com/spf13/viper from 1.15.0 to 1.17.0 by @dependabot in https://github.com/yorkie-team/yorkie/pull/693 +- Bump github.com/jedib0t/go-pretty/v6 from 6.4.0 to 6.4.9 by @dependabot in https://github.com/yorkie-team/yorkie/pull/695 +- Bump actions/setup-go from 3 to 4 by @dependabot in https://github.com/yorkie-team/yorkie/pull/698 +- Bump helm/chart-releaser-action from 1.5.0 to 1.6.0 by @dependabot in https://github.com/yorkie-team/yorkie/pull/699 +- Bump docker/login-action from 2 to 3 by @dependabot in https://github.com/yorkie-team/yorkie/pull/700 +- Bump google.golang.org/grpc from 1.58.2 to 1.58.3 by @dependabot in https://github.com/yorkie-team/yorkie/pull/701 +- Bump golang.org/x/crypto from 0.14.0 to 0.16.0 by @dependabot in https://github.com/yorkie-team/yorkie/pull/702 +- Bump github.com/rs/xid from 1.4.0 to 1.5.0 by @dependabot in https://github.com/yorkie-team/yorkie/pull/697 ## [0.4.9] - 2023-11-25 ### Added -* Implement merge elements in Tree.Edit by @hackerwins in https://github.com/yorkie-team/yorkie/pull/659 -* Add PushPull benchmark test by @sejongk in https://github.com/yorkie-team/yorkie/pull/658 -* Setup Dependabot by @jongwooo in https://github.com/yorkie-team/yorkie/pull/675 + +- Implement merge elements in Tree.Edit by @hackerwins in https://github.com/yorkie-team/yorkie/pull/659 +- Add PushPull benchmark test by @sejongk in https://github.com/yorkie-team/yorkie/pull/658 +- Setup Dependabot by @jongwooo in https://github.com/yorkie-team/yorkie/pull/675 ### Changed -* Bump up golangci-lint and fix lint errors by @hackerwins in https://github.com/yorkie-team/yorkie/pull/660 -* Modify converter to allow setting values for object and array by @chacha912 and @hackerwins in https://github.com/yorkie-team/yorkie/pull/687 + +- Bump up golangci-lint and fix lint errors by @hackerwins in https://github.com/yorkie-team/yorkie/pull/660 +- Modify converter to allow setting values for object and array by @chacha912 and @hackerwins in https://github.com/yorkie-team/yorkie/pull/687 ## [0.4.8] - 2023-11-01 ### Changed -* Bump golang.org/x/net from 0.10.0 to 0.17.0 by @dependabot in https://github.com/yorkie-team/yorkie/pull/649 -* Bump google.golang.org/grpc from 1.54.0 to 1.56.3 by @dependabot in https://github.com/yorkie-team/yorkie/pull/654 -* Fix ArgoCD version to v2.7.10 by @krapie in https://github.com/yorkie-team/yorkie/pull/653 -* Rename StructureAsString to toTestString by @hackerwins in https://github.com/yorkie-team/yorkie/pull/656 + +- Bump golang.org/x/net from 0.10.0 to 0.17.0 by @dependabot in https://github.com/yorkie-team/yorkie/pull/649 +- Bump google.golang.org/grpc from 1.54.0 to 1.56.3 by @dependabot in https://github.com/yorkie-team/yorkie/pull/654 +- Fix ArgoCD version to v2.7.10 by @krapie in https://github.com/yorkie-team/yorkie/pull/653 +- Rename StructureAsString to toTestString by @hackerwins in https://github.com/yorkie-team/yorkie/pull/656 ### Fixed -* Revise Prometheus PVC Spec Syntax Error by @krapie in https://github.com/yorkie-team/yorkie/pull/650 -* Remove skip storing MinSyncedTicket when the ticket is initial by @hackerwins in https://github.com/yorkie-team/yorkie/pull/655 + +- Revise Prometheus PVC Spec Syntax Error by @krapie in https://github.com/yorkie-team/yorkie/pull/650 +- Remove skip storing MinSyncedTicket when the ticket is initial by @hackerwins in https://github.com/yorkie-team/yorkie/pull/655 ## [0.4.7] - 2023-10-06 ### Added -* Introduce Broadcast API by @sejongk in https://github.com/yorkie-team/yorkie/pull/631 -* Add context to CLI for simplifying CLI commands by @Wu22e and @hackerwins in https://github.com/yorkie-team/yorkie/pull/647 -* Add Tree.Edit benchmark by @JOOHOJANG in https://github.com/yorkie-team/yorkie/pull/637 + +- Introduce Broadcast API by @sejongk in https://github.com/yorkie-team/yorkie/pull/631 +- Add context to CLI for simplifying CLI commands by @Wu22e and @hackerwins in https://github.com/yorkie-team/yorkie/pull/647 +- Add Tree.Edit benchmark by @JOOHOJANG in https://github.com/yorkie-team/yorkie/pull/637 ### Changed -* Bump checkout from v3 to v4 by @Yaminyam in https://github.com/yorkie-team/yorkie/pull/641 -* Remove panic from crdt.Primitive @fourjae and @hackerwins in https://github.com/yorkie-team/yorkie/pull/636 + +- Bump checkout from v3 to v4 by @Yaminyam in https://github.com/yorkie-team/yorkie/pull/641 +- Remove panic from crdt.Primitive @fourjae and @hackerwins in https://github.com/yorkie-team/yorkie/pull/636 ### Removed -* Remove unused trie by @hackerwins in https://github.com/yorkie-team/yorkie/pull/646 + +- Remove unused trie by @hackerwins in https://github.com/yorkie-team/yorkie/pull/646 ### Fixed -* Support concurrent formatting of Text by @MoonGyu1 in https://github.com/yorkie-team/yorkie/pull/639 -* Fix typo in retention design document by @LakHyeonKim in https://github.com/yorkie-team/yorkie/pull/633 -* Update Design Document for Missing Document Links and Ordering by @krapie in https://github.com/yorkie-team/yorkie/pull/630 -* Recover Select to prevent unsupported operation by @hackerwins in https://github.com/yorkie-team/yorkie/pull/629 + +- Support concurrent formatting of Text by @MoonGyu1 in https://github.com/yorkie-team/yorkie/pull/639 +- Fix typo in retention design document by @LakHyeonKim in https://github.com/yorkie-team/yorkie/pull/633 +- Update Design Document for Missing Document Links and Ordering by @krapie in https://github.com/yorkie-team/yorkie/pull/630 +- Recover Select to prevent unsupported operation by @hackerwins in https://github.com/yorkie-team/yorkie/pull/629 ## [0.4.6] - 2023-08-25 ### Added -* Set cobra default output to stdout by @blurfx in https://github.com/yorkie-team/yorkie/pull/599 -* Fetch latest snapshot metadata to determine snapshot creation need by @hyemmie in https://github.com/yorkie-team/yorkie/pull/597 -* Update contributing docs by @MoonGyu1 in https://github.com/yorkie-team/yorkie/pull/601 -* Add Pagination to Listing Projects for Housekeeping by @tedkimdev in https://github.com/yorkie-team/yorkie/pull/587 -* Update workflow with latest versions of the actions which runs on Node16 by @jongwooo in https://github.com/yorkie-team/yorkie/pull/620 -* Add integration tree test for sync with js-sdk by @MoonGyu1 in https://github.com/yorkie-team/yorkie/pull/611 -* Add testcases for sync with js-sdk by @MoonGyu1 in https://github.com/yorkie-team/yorkie/pull/621 -* Add tree document by @MoonGyu1 in https://github.com/yorkie-team/yorkie/pull/608 -* Cache ProjectInfo by @blurfx in https://github.com/yorkie-team/yorkie/pull/586 -* Handle concurrent editing of Tree.Edit by @hackerwins, @MoonGyu1, @sejongk in https://github.com/yorkie-team/yorkie/pull/607 -* Support multi-level and partial element selection by @sejongk, @hackerwins in https://github.com/yorkie-team/yorkie/pull/624 + +- Set cobra default output to stdout by @blurfx in https://github.com/yorkie-team/yorkie/pull/599 +- Fetch latest snapshot metadata to determine snapshot creation need by @hyemmie in https://github.com/yorkie-team/yorkie/pull/597 +- Update contributing docs by @MoonGyu1 in https://github.com/yorkie-team/yorkie/pull/601 +- Add Pagination to Listing Projects for Housekeeping by @tedkimdev in https://github.com/yorkie-team/yorkie/pull/587 +- Update workflow with latest versions of the actions which runs on Node16 by @jongwooo in https://github.com/yorkie-team/yorkie/pull/620 +- Add integration tree test for sync with js-sdk by @MoonGyu1 in https://github.com/yorkie-team/yorkie/pull/611 +- Add testcases for sync with js-sdk by @MoonGyu1 in https://github.com/yorkie-team/yorkie/pull/621 +- Add tree document by @MoonGyu1 in https://github.com/yorkie-team/yorkie/pull/608 +- Cache ProjectInfo by @blurfx in https://github.com/yorkie-team/yorkie/pull/586 +- Handle concurrent editing of Tree.Edit by @hackerwins, @MoonGyu1, @sejongk in https://github.com/yorkie-team/yorkie/pull/607 +- Support multi-level and partial element selection by @sejongk, @hackerwins in https://github.com/yorkie-team/yorkie/pull/624 ### Changed -* Remove Select operation from Text by @joonhyukchoi in https://github.com/yorkie-team/yorkie/pull/589 -* Change 'Documents' from plural to singular in DocEvent by @chacha912 in https://github.com/yorkie-team/yorkie/pull/613 -* Cleanup proto by @chacha912 in https://github.com/yorkie-team/yorkie/pull/614 -* Replace matrix strategy with environment variable by @jongwooo in https://github.com/yorkie-team/yorkie/pull/619 -* Change TreeNode to have IDs instead of insPrev, insNext by @JOOHOJANG in https://github.com/yorkie-team/yorkie/pull/622 + +- Remove Select operation from Text by @joonhyukchoi in https://github.com/yorkie-team/yorkie/pull/589 +- Change 'Documents' from plural to singular in DocEvent by @chacha912 in https://github.com/yorkie-team/yorkie/pull/613 +- Cleanup proto by @chacha912 in https://github.com/yorkie-team/yorkie/pull/614 +- Replace matrix strategy with environment variable by @jongwooo in https://github.com/yorkie-team/yorkie/pull/619 +- Change TreeNode to have IDs instead of insPrev, insNext by @JOOHOJANG in https://github.com/yorkie-team/yorkie/pull/622 ### Fixed -* Fix typos and invalid link in the yorkie design document by @g2hhh2ee in https://github.com/yorkie-team/yorkie/pull/591 -* Clean up code by @hackerwins in https://github.com/yorkie-team/yorkie/pull/595 -* Clean up methods related to presence by @chacha912 in https://github.com/yorkie-team/yorkie/pull/594 -* Remove panic from crdt.RGATreeList by @sejongk in https://github.com/yorkie-team/yorkie/pull/596 -* Fix treePos calculating logic for text node by @JOOHOJANG in https://github.com/yorkie-team/yorkie/pull/615 + +- Fix typos and invalid link in the yorkie design document by @g2hhh2ee in https://github.com/yorkie-team/yorkie/pull/591 +- Clean up code by @hackerwins in https://github.com/yorkie-team/yorkie/pull/595 +- Clean up methods related to presence by @chacha912 in https://github.com/yorkie-team/yorkie/pull/594 +- Remove panic from crdt.RGATreeList by @sejongk in https://github.com/yorkie-team/yorkie/pull/596 +- Fix treePos calculating logic for text node by @JOOHOJANG in https://github.com/yorkie-team/yorkie/pull/615 ## [0.4.5] - 2023-07-20 ### Added -* Move Presence from Client to Document by @chacha912, @hackerwins in https://github.com/yorkie-team/yorkie/pull/582 -* Add include-snapshot flag to ListDocuments API by @YoonKiJin, @hackerwins in https://github.com/yorkie-team/yorkie/pull/575 + +- Move Presence from Client to Document by @chacha912, @hackerwins in https://github.com/yorkie-team/yorkie/pull/582 +- Add include-snapshot flag to ListDocuments API by @YoonKiJin, @hackerwins in https://github.com/yorkie-team/yorkie/pull/575 ### Changed -* Revise log messages by @hackerwins in https://github.com/yorkie-team/yorkie/pull/574 -* Bump google.golang.org/grpc from 1.50.0 to 1.53.0 by @dependabot in https://github.com/yorkie-team/yorkie/pull/576 -* Allow users to pass multi nodes when calling Tree.edit by @JOOHOJANG in https://github.com/yorkie-team/yorkie/pull/579 + +- Revise log messages by @hackerwins in https://github.com/yorkie-team/yorkie/pull/574 +- Bump google.golang.org/grpc from 1.50.0 to 1.53.0 by @dependabot in https://github.com/yorkie-team/yorkie/pull/576 +- Allow users to pass multi nodes when calling Tree.edit by @JOOHOJANG in https://github.com/yorkie-team/yorkie/pull/579 ### Fixed -* Remove unnecessary codes from gc by @JOOHOJANG in https://github.com/yorkie-team/yorkie/pull/581 + +- Remove unnecessary codes from gc by @JOOHOJANG in https://github.com/yorkie-team/yorkie/pull/581 ## [0.4.4] - 2023-07-04 ### Added -* Add logout command to CLI by @blurfx in https://github.com/yorkie-team/yorkie/pull/571 -* Add RemoveIfNotAttached flag to Detach by @emplam27 in https://github.com/yorkie-team/yorkie/pull/560 + +- Add logout command to CLI by @blurfx in https://github.com/yorkie-team/yorkie/pull/571 +- Add RemoveIfNotAttached flag to Detach by @emplam27 in https://github.com/yorkie-team/yorkie/pull/560 ### Fixed -* Make attributes display properly in dashboard by @YoonKiJin in https://github.com/yorkie-team/yorkie/pull/564 -* Remove panic from crdt.Tree and index.Tree by @JOOHOJANG in https://github.com/yorkie-team/yorkie/pull/570 + +- Make attributes display properly in dashboard by @YoonKiJin in https://github.com/yorkie-team/yorkie/pull/564 +- Remove panic from crdt.Tree and index.Tree by @JOOHOJANG in https://github.com/yorkie-team/yorkie/pull/570 ## [0.4.3] - 2023-06-29 ### Added -* Add force flag to RemoveDocument command by @emplam27 in https://github.com/yorkie-team/yorkie/pull/558 -* Apply garbage collection for tree by @JOOHOJANG in https://github.com/yorkie-team/yorkie/pull/566 + +- Add force flag to RemoveDocument command by @emplam27 in https://github.com/yorkie-team/yorkie/pull/558 +- Apply garbage collection for tree by @JOOHOJANG in https://github.com/yorkie-team/yorkie/pull/566 ### Fixed -* Resolve CI failure with longer MaxConnectionAge by @krapie in https://github.com/yorkie-team/yorkie/pull/556 -* Update ClientInfo with ID and extract `testcases` package by @emplam27 in https://github.com/yorkie-team/yorkie/pull/557 -* Filter out removed documents from ListDocuments API by @hackerwins in https://github.com/yorkie-team/yorkie/pull/563 -* Add a workaround to prevent retrieving removed documents from MemDB by @hackerwins in https://github.com/yorkie-team/yorkie/pull/565 + +- Resolve CI failure with longer MaxConnectionAge by @krapie in https://github.com/yorkie-team/yorkie/pull/556 +- Update ClientInfo with ID and extract `testcases` package by @emplam27 in https://github.com/yorkie-team/yorkie/pull/557 +- Filter out removed documents from ListDocuments API by @hackerwins in https://github.com/yorkie-team/yorkie/pull/563 +- Add a workaround to prevent retrieving removed documents from MemDB by @hackerwins in https://github.com/yorkie-team/yorkie/pull/565 ## [0.4.2] - 2023-06-19 ### Added -* Add TLS Option & Insecure Flag in Admin CLI by @krapie in https://github.com/yorkie-team/yorkie/pull/548 -* Implement Tree.Style for setting attributes to nodes by @krapie, @hackerwins in https://github.com/yorkie-team/yorkie/pull/549 + +- Add TLS Option & Insecure Flag in Admin CLI by @krapie in https://github.com/yorkie-team/yorkie/pull/548 +- Implement Tree.Style for setting attributes to nodes by @krapie, @hackerwins in https://github.com/yorkie-team/yorkie/pull/549 ### Changed -* Abstract the workflow to base-docker-publish.yml by @jongwooo in https://github.com/yorkie-team/yorkie/pull/552 -* Change k8s version of yorkie-cluster chart to 1.23 by @emplam27 in https://github.com/yorkie-team/yorkie/pull/550 + +- Abstract the workflow to base-docker-publish.yml by @jongwooo in https://github.com/yorkie-team/yorkie/pull/552 +- Change k8s version of yorkie-cluster chart to 1.23 by @emplam27 in https://github.com/yorkie-team/yorkie/pull/550 ## [0.4.1] - 2023-06-09 ### Fixed -* Support UTF16 Code Units in yorkie.Tree by @krapie in https://github.com/yorkie-team/yorkie/pull/545 + +- Support UTF16 Code Units in yorkie.Tree by @krapie in https://github.com/yorkie-team/yorkie/pull/545 ## [0.4.0] - 2023-06-05 ### Added -* Implement yorkie.Tree for text editors using tree model by @hackerwins in https://github.com/yorkie-team/yorkie/pull/535 -* Add remove document command to CLI by @emplam27 in https://github.com/yorkie-team/yorkie/pull/540 + +- Implement yorkie.Tree for text editors using tree model by @hackerwins in https://github.com/yorkie-team/yorkie/pull/535 +- Add remove document command to CLI by @emplam27 in https://github.com/yorkie-team/yorkie/pull/540 ### Fixed -* Remove panic method in crdt array by @emplam27 in https://github.com/yorkie-team/yorkie/pull/524 -* Revise Helm Charts for Production Installations by @krapie in https://github.com/yorkie-team/yorkie/pull/537 -* Resolve concurrent map issue by @chacha912 in https://github.com/yorkie-team/yorkie/pull/538 + +- Remove panic method in crdt array by @emplam27 in https://github.com/yorkie-team/yorkie/pull/524 +- Revise Helm Charts for Production Installations by @krapie in https://github.com/yorkie-team/yorkie/pull/537 +- Resolve concurrent map issue by @chacha912 in https://github.com/yorkie-team/yorkie/pull/538 ## [0.3.5] - 2023-05-22 ### Added -* Add Sharded Cluster Mode Design Document by @krapie in https://github.com/yorkie-team/yorkie/pull/523 + +- Add Sharded Cluster Mode Design Document by @krapie in https://github.com/yorkie-team/yorkie/pull/523 ### Changed -* Remove panic and wrapping informational error from server by @emplam27 in https://github.com/yorkie-team/yorkie/pull/519 -* Remove panic method in crdt text by @emplam27 in https://github.com/yorkie-team/yorkie/pull/522 -* Integrate SDK RPC Server and Admin RPC Server to Single RPC Server by @krapie in https://github.com/yorkie-team/yorkie/pull/532 + +- Remove panic and wrapping informational error from server by @emplam27 in https://github.com/yorkie-team/yorkie/pull/519 +- Remove panic method in crdt text by @emplam27 in https://github.com/yorkie-team/yorkie/pull/522 +- Integrate SDK RPC Server and Admin RPC Server to Single RPC Server by @krapie in https://github.com/yorkie-team/yorkie/pull/532 ### Fixed -* Update Helm Chart Releaser Action by @krapie in https://github.com/yorkie-team/yorkie/pull/516 -* Revise Helm charts & README.md by @krapie in https://github.com/yorkie-team/yorkie/pull/525 -* Resolve Helm Chart Installation Fail on Custom Release Name by @krapie in https://github.com/yorkie-team/yorkie/pull/531 + +- Update Helm Chart Releaser Action by @krapie in https://github.com/yorkie-team/yorkie/pull/516 +- Revise Helm charts & README.md by @krapie in https://github.com/yorkie-team/yorkie/pull/525 +- Resolve Helm Chart Installation Fail on Custom Release Name by @krapie in https://github.com/yorkie-team/yorkie/pull/531 ## [0.3.4] - 2023-04-18 ### Added -* Add Yorkie Helm Charts by @krapie in https://github.com/yorkie-team/yorkie/pull/507 -* Add gRPC MaxConnectionAge & MaxConnectionAgeGrace Options by @krapie in https://github.com/yorkie-team/yorkie/pull/512 -* Extend PushPull to support sync mode by adding push-only flag by @humdrum in https://github.com/yorkie-team/yorkie/pull/500 + +- Add Yorkie Helm Charts by @krapie in https://github.com/yorkie-team/yorkie/pull/507 +- Add gRPC MaxConnectionAge & MaxConnectionAgeGrace Options by @krapie in https://github.com/yorkie-team/yorkie/pull/512 +- Extend PushPull to support sync mode by adding push-only flag by @humdrum in https://github.com/yorkie-team/yorkie/pull/500 ### Removed -* Remove etcd-based cluster mode and replace it with sharding by @hackerwins in https://github.com/yorkie-team/yorkie/pull/504 + +- Remove etcd-based cluster mode and replace it with sharding by @hackerwins in https://github.com/yorkie-team/yorkie/pull/504 ### Fixed -* Lock watchDocuments depending on the client and doc by @chacha912 in https://github.com/yorkie-team/yorkie/pull/506 -* Fixed a guide about path of docker-compose.xml file by @maruldy in https://github.com/yorkie-team/yorkie/pull/511 + +- Lock watchDocuments depending on the client and doc by @chacha912 in https://github.com/yorkie-team/yorkie/pull/506 +- Fixed a guide about path of docker-compose.xml file by @maruldy in https://github.com/yorkie-team/yorkie/pull/511 ## [0.3.3] - 2023-03-24 ### Added -* Add ClientDeactivateThreshold field in admin CLI project list by @krapie in https://github.com/yorkie-team/yorkie/pull/477 -* Add RemoveDocument API by @hackerwins in https://github.com/yorkie-team/yorkie/pull/484 -* Add user agent metrics by @emplam27 in https://github.com/yorkie-team/yorkie/pull/492 -* Add shard key in context by @hackerwins in https://github.com/yorkie-team/yorkie/pull/499 -* Add pagination flags to document ls command by @emplam27 in https://github.com/yorkie-team/yorkie/pull/489 + +- Add ClientDeactivateThreshold field in admin CLI project list by @krapie in https://github.com/yorkie-team/yorkie/pull/477 +- Add RemoveDocument API by @hackerwins in https://github.com/yorkie-team/yorkie/pull/484 +- Add user agent metrics by @emplam27 in https://github.com/yorkie-team/yorkie/pull/492 +- Add shard key in context by @hackerwins in https://github.com/yorkie-team/yorkie/pull/499 +- Add pagination flags to document ls command by @emplam27 in https://github.com/yorkie-team/yorkie/pull/489 ### Changed -* Allow uppercase letters(A-Z) for document keys by @shiningsoo in https://github.com/yorkie-team/yorkie/pull/483 -* Bump golang.org/x/net from 0.0.0-20221004154528-8021a29435af to 0.7.0 by @dependabot in https://github.com/yorkie-team/yorkie/pull/486 -* Change the structure of WatchDocument API by @chacha912 in https://github.com/yorkie-team/yorkie/pull/491 + +- Allow uppercase letters(A-Z) for document keys by @shiningsoo in https://github.com/yorkie-team/yorkie/pull/483 +- Bump golang.org/x/net from 0.0.0-20221004154528-8021a29435af to 0.7.0 by @dependabot in https://github.com/yorkie-team/yorkie/pull/486 +- Change the structure of WatchDocument API by @chacha912 in https://github.com/yorkie-team/yorkie/pull/491 ### Fixed ## [0.3.1] - 2023-02-27 ### Added -* Add ClientDeactivateThreshold in Project by @krapie in https://github.com/yorkie-team/yorkie/pull/454 -* Add validation module and document key validation by @easylogic in https://github.com/yorkie-team/yorkie/pull/467 + +- Add ClientDeactivateThreshold in Project by @krapie in https://github.com/yorkie-team/yorkie/pull/454 +- Add validation module and document key validation by @easylogic in https://github.com/yorkie-team/yorkie/pull/467 ### Changed -* Filter out unsubscribed documents key in DocEvent by @chacha912 in https://github.com/yorkie-team/yorkie/pull/463 -* Remove priority queue from RHTPQMap and entire project by @blurfx in https://github.com/yorkie-team/yorkie/pull/462 + +- Filter out unsubscribed documents key in DocEvent by @chacha912 in https://github.com/yorkie-team/yorkie/pull/463 +- Remove priority queue from RHTPQMap and entire project by @blurfx in https://github.com/yorkie-team/yorkie/pull/462 ### Fixed -* Remove duplicated backslash in string escaping by @cozitive in https://github.com/yorkie-team/yorkie/pull/458 -* Fix invalid index of SplayTree with single node by @hackerwins in https://github.com/yorkie-team/yorkie/pull/470 + +- Remove duplicated backslash in string escaping by @cozitive in https://github.com/yorkie-team/yorkie/pull/458 +- Fix invalid index of SplayTree with single node by @hackerwins in https://github.com/yorkie-team/yorkie/pull/470 ## [0.3.0] - 2023-01-31 ### Changed -* Merge Text and RichText by @hackerwins in https://github.com/yorkie-team/yorkie/pull/438 -* Fix the value type of Counter and remove double type from Counter by @cozitive in https://github.com/yorkie-team/yorkie/pull/441 + +- Merge Text and RichText by @hackerwins in https://github.com/yorkie-team/yorkie/pull/438 +- Fix the value type of Counter and remove double type from Counter by @cozitive in https://github.com/yorkie-team/yorkie/pull/441 ### Fixed -* Fix wrong string escape in Text's attrs by @cozitive in https://github.com/yorkie-team/yorkie/pull/443 -* Increase CRDT Counter in local change by @cozitive in https://github.com/yorkie-team/yorkie/pull/449 + +- Fix wrong string escape in Text's attrs by @cozitive in https://github.com/yorkie-team/yorkie/pull/443 +- Increase CRDT Counter in local change by @cozitive in https://github.com/yorkie-team/yorkie/pull/449 ## [0.2.20] - 2022-12-30 ### Changed -* Bump up Go to 1.19.2 by @hackerwins in https://github.com/yorkie-team/yorkie/pull/425 -* Bump up libraries to the latest version by @hackerwins in https://github.com/yorkie-team/yorkie/pull/426 -* Remove use of bou.ke/monkey library by @chromato99 in https://github.com/yorkie-team/yorkie/pull/427 -* Replace deprecated ioutil library by @chromato99 in https://github.com/yorkie-team/yorkie/pull/428 -* Remove duplicate logging when the function returns error by @hackerwins in https://github.com/yorkie-team/yorkie/pull/429 +- Bump up Go to 1.19.2 by @hackerwins in https://github.com/yorkie-team/yorkie/pull/425 +- Bump up libraries to the latest version by @hackerwins in https://github.com/yorkie-team/yorkie/pull/426 +- Remove use of bou.ke/monkey library by @chromato99 in https://github.com/yorkie-team/yorkie/pull/427 +- Replace deprecated ioutil library by @chromato99 in https://github.com/yorkie-team/yorkie/pull/428 +- Remove duplicate logging when the function returns error by @hackerwins in https://github.com/yorkie-team/yorkie/pull/429 ### Fixed -* Fix typo by @ppeeou in https://github.com/yorkie-team/yorkie/pull/421 -* Fix invalid JSON from marshaling dates and use UNIX ms for Date by @hackerwins in https://github.com/yorkie-team/yorkie/pull/432 -* Add additional unwrap code in ToStatusError gRPC error handler by @Krapi0314 in https://github.com/yorkie-team/yorkie/pull/434 +- Fix typo by @ppeeou in https://github.com/yorkie-team/yorkie/pull/421 +- Fix invalid JSON from marshaling dates and use UNIX ms for Date by @hackerwins in https://github.com/yorkie-team/yorkie/pull/432 +- Add additional unwrap code in ToStatusError gRPC error handler by @Krapi0314 in https://github.com/yorkie-team/yorkie/pull/434 ## [0.2.19] - 2022-10-04 diff --git a/MAINTAINING.md b/MAINTAINING.md index e96b05d68..02db7eeda 100644 --- a/MAINTAINING.md +++ b/MAINTAINING.md @@ -9,7 +9,12 @@ - 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#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) +- Update `version`s in API documentation. + - [yorkie.base.yaml](https://github.com/yorkie-team/yorkie/blob/main/api/docs/yorkie.base.yaml#L5) + - [admin.openapi.yaml](https://github.com/yorkie-team/yorkie/blob/main/api/docs/yorkie/v1/admin.openapi.yaml#L6) + - [yorkie.openapi.yaml](https://github.com/yorkie-team/yorkie/blob/main/api/docs/yorkie/v1/yorkie.openapi.yaml#L6) + - [resources.openapi.yaml](https://github.com/yorkie-team/yorkie/blob/main/api/docs/yorkie/v1/resources.openapi.yaml#L6) +- 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). @@ -21,7 +26,7 @@ Copy the release notes automatically generated by GitHub and categorize them as 4. Click on the `Generate release notes` button. 5. Copy the content generated into the body and categorize each item. -image +image ### 3. Create [Pull Request](https://github.com/yorkie-team/yorkie/commits/main/CHANGELOG.md) for changelog and merge it into main. @@ -29,25 +34,29 @@ Copy the release notes automatically generated by GitHub and categorize them as Executing the following command will generate five zip files for each operating system in the `binaries` folder. -```bash +```bash $ make build-binaries ``` ### 5. Publish [a new release](https://github.com/yorkie-team/yorkie/releases/new). After creating the release in step 2, follow these steps: + 1. Attach the binary files built in step 4. 2. Click on the `Publish release` button. + image -### 6. Deploy +### 6. Deploy #### 1) Docker + When you publish the release in step 5, [GitHub action](https://github.com/yorkie-team/yorkie/blob/main/.github/workflows/docker-publish.yml) will deploy Yorkie to [Docker Hub](https://hub.docker.com/repository/docker/yorkieteam/yorkie). #### 2) Homebrew + Running the command below will automatically create a pull request for deploying to Homebrew. -Once the PR is merged to [homebrew-core](https://github.com/Homebrew/homebrew-core), Yorkie will also be deployed to Homebrew. +Once the PR is merged to [homebrew-core](https://github.com/Homebrew/homebrew-core), Yorkie will also be deployed to Homebrew. ```bash $ brew bump-formula-pr yorkie --tag v{YORKIE_VERSION} diff --git a/Makefile b/Makefile index 0d3542f27..a74241b41 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -YORKIE_VERSION := 0.4.13 +YORKIE_VERSION := 0.4.27 GO_PROJECT = github.com/yorkie-team/yorkie @@ -24,6 +24,7 @@ tools: ## install tools for developing yorkie go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.31.0 go install connectrpc.com/connect/cmd/protoc-gen-connect-go@v1.12.0 go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.55.1 + go install github.com/sudorandom/protoc-gen-connect-openapi@v0.5.5 proto: ## generate proto files buf generate @@ -64,6 +65,16 @@ docker: ## builds docker images with the current version and latest tag docker-latest: ## builds docker images with latest tag docker buildx build --push --platform linux/amd64,linux/arm64,linux/386 -t yorkieteam/yorkie:latest . +swagger: ## runs swagger-ui with the yorkie api docs + docker run -p 3000:8080 \ + -e URLS="[ \ + { url: 'docs/yorkie/v1/admin.openapi.yaml', name: 'Admin' }, \ + { url: 'docs/yorkie/v1/resources.openapi.yaml', name: 'Resources' }, \ + { url: 'docs/yorkie/v1/yorkie.openapi.yaml', name: 'Yorkie' } \ + ]" \ + -v `pwd`/api/docs:/usr/share/nginx/html/docs/ \ + swaggerapi/swagger-ui + help: @echo 'Commands:' @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " %-20s %s\n", $$1, $$2}' diff --git a/api/converter/converter_test.go b/api/converter/converter_test.go index 682a70cd6..1d58d5340 100644 --- a/api/converter/converter_test.go +++ b/api/converter/converter_test.go @@ -268,4 +268,35 @@ func TestConverter(t *testing.T) { clone := converter.FromPresenceChange(pbChange) assert.Equal(t, change, clone) }) + + t.Run("properly encode and decode tree test", func(t *testing.T) { + doc := document.New(helper.TestDocKey(t)) + assert.NoError(t, doc.Update(func(root *json.Object, p *presence.Presence) error { + root.SetNewTree("t", &json.TreeNode{ + Type: "r", + Children: []json.TreeNode{ + {Type: "p", Children: []json.TreeNode{{Type: "text", Value: "12"}}}, + {Type: "p", Children: []json.TreeNode{{Type: "text", Value: "34"}}}, + }, + }) + assert.Equal(t, "

12

34

", root.GetTree("t").ToXML()) + root.GetTree("t").EditByPath([]int{0, 1}, []int{1, 1}, nil, 0) + + root.GetTree("t").Style(0, 1, map[string]string{"b": "t", "i": "t"}) + assert.Equal(t, `

14

`, root.GetTree("t").ToXML()) + + root.GetTree("t").RemoveStyle(0, 1, []string{"i"}) + return nil + })) + assert.Equal(t, `

14

`, doc.Root().GetTree("t").ToXML()) + + bytes, err := converter.ObjectToBytes(doc.RootObject()) + assert.NoError(t, err) + obj, err := converter.BytesToObject(bytes) + assert.NoError(t, err) + + assert.Equal(t, obj.Get("t").(*crdt.Tree).NodeLen(), doc.Root().GetTree("t").NodeLen()) + assert.Equal(t, obj.Get("t").(*crdt.Tree).Root().Len(), doc.Root().GetTree("t").Len()) + assert.Equal(t, obj.Get("t").(*crdt.Tree).ToXML(), doc.Root().GetTree("t").ToXML()) + }) } diff --git a/api/converter/errors.go b/api/converter/errors.go new file mode 100644 index 000000000..69ec75f4e --- /dev/null +++ b/api/converter/errors.go @@ -0,0 +1,27 @@ +package converter + +import ( + "errors" + + "connectrpc.com/connect" + "google.golang.org/genproto/googleapis/rpc/errdetails" +) + +// ErrorCodeOf returns the error code of the given error. +func ErrorCodeOf(err error) string { + var connectErr *connect.Error + if !errors.As(err, &connectErr) { + return "" + } + for _, detail := range connectErr.Details() { + msg, valueErr := detail.Value() + if valueErr != nil { + continue + } + + if errorInfo, ok := msg.(*errdetails.ErrorInfo); ok { + return errorInfo.GetMetadata()["code"] + } + } + return "" +} diff --git a/api/converter/from_pb.go b/api/converter/from_pb.go index b4e6aba11..7bb740049 100644 --- a/api/converter/from_pb.go +++ b/api/converter/from_pb.go @@ -511,11 +511,19 @@ func fromTreeStyle(pbTreeStyle *api.Operation_TreeStyle) (*operations.TreeStyle, return nil, err } + createdAtMapByActor, err := fromCreatedAtMapByActor( + pbTreeStyle.CreatedAtMapByActor, + ) + if err != nil { + return nil, err + } + if len(pbTreeStyle.AttributesToRemove) > 0 { return operations.NewTreeStyleRemove( parentCreatedAt, from, to, + createdAtMapByActor, pbTreeStyle.AttributesToRemove, executedAt, ), nil @@ -525,6 +533,7 @@ func fromTreeStyle(pbTreeStyle *api.Operation_TreeStyle) (*operations.TreeStyle, parentCreatedAt, from, to, + createdAtMapByActor, pbTreeStyle.Attributes, executedAt, ), nil @@ -588,6 +597,8 @@ func FromTreeNodes(pbNodes []*api.TreeNode) (*crdt.TreeNode, error) { } } + root.Index.UpdateDescendantsSize() + // build crdt.Tree from root to construct the links between nodes. return crdt.NewTree(root, nil).Root(), nil } @@ -614,19 +625,27 @@ func FromTreeNodesWhenEdit(pbNodes []*api.TreeNodes) ([]*crdt.TreeNode, error) { return treeNodes, nil } +func fromRHT(pbRHT map[string]*api.NodeAttr) (*crdt.RHT, error) { + rht := crdt.NewRHT() + for k, pbAttr := range pbRHT { + updatedAt, err := fromTimeTicket(pbAttr.UpdatedAt) + if err != nil { + return nil, err + } + rht.SetInternal(k, pbAttr.Value, updatedAt, pbAttr.IsRemoved) + } + return rht, nil +} + func fromTreeNode(pbNode *api.TreeNode) (*crdt.TreeNode, error) { id, err := fromTreeNodeID(pbNode.Id) if err != nil { return nil, err } - attrs := crdt.NewRHT() - for k, pbAttr := range pbNode.Attributes { - updatedAt, err := fromTimeTicket(pbAttr.UpdatedAt) - if err != nil { - return nil, err - } - attrs.Set(k, pbAttr.Value, updatedAt) + attrs, err := fromRHT(pbNode.Attributes) + if err != nil { + return nil, err } node := crdt.NewTreeNode( @@ -650,10 +669,11 @@ func fromTreeNode(pbNode *api.TreeNode) (*crdt.TreeNode, error) { } } - node.RemovedAt, err = fromTimeTicket(pbNode.RemovedAt) + removedAt, err := fromTimeTicket(pbNode.RemovedAt) if err != nil { return nil, err } + node.SetRemovedAt(removedAt) return node, nil } diff --git a/api/converter/to_bytes.go b/api/converter/to_bytes.go index c8782afa0..053b3b03e 100644 --- a/api/converter/to_bytes.go +++ b/api/converter/to_bytes.go @@ -297,25 +297,30 @@ func ToTreeNodesWhenEdit(treeNodes []*crdt.TreeNode) []*api.TreeNodes { return pbTreeNodes } -func toTreeNode(treeNode *crdt.TreeNode, depth int) *api.TreeNode { - var attrs map[string]*api.NodeAttr - if treeNode.Attrs != nil { - attrs = make(map[string]*api.NodeAttr) - for _, node := range treeNode.Attrs.Nodes() { - attrs[node.Key()] = &api.NodeAttr{ +func toRHT(rht *crdt.RHT) map[string]*api.NodeAttr { + var pbAttrs map[string]*api.NodeAttr + if rht != nil { + pbAttrs = make(map[string]*api.NodeAttr) + for _, node := range rht.Nodes() { + pbAttrs[node.Key()] = &api.NodeAttr{ Value: node.Value(), UpdatedAt: ToTimeTicket(node.UpdatedAt()), + IsRemoved: node.IsRemoved(), } } } + return pbAttrs +} + +func toTreeNode(treeNode *crdt.TreeNode, depth int) *api.TreeNode { pbNode := &api.TreeNode{ - Id: toTreeNodeID(treeNode.ID), + Id: toTreeNodeID(treeNode.ID()), Type: treeNode.Type(), Value: treeNode.Value, - RemovedAt: ToTimeTicket(treeNode.RemovedAt), + RemovedAt: ToTimeTicket(treeNode.RemovedAt()), Depth: int32(depth), - Attributes: attrs, + Attributes: toRHT(treeNode.Attrs), } if treeNode.InsPrevID != nil { diff --git a/api/converter/to_pb.go b/api/converter/to_pb.go index 49f0e7a8e..24d90b093 100644 --- a/api/converter/to_pb.go +++ b/api/converter/to_pb.go @@ -311,7 +311,7 @@ func toEdit(e *operations.Edit) (*api.Operation_Edit_, error) { ParentCreatedAt: ToTimeTicket(e.ParentCreatedAt()), From: toTextNodePos(e.From()), To: toTextNodePos(e.To()), - CreatedAtMapByActor: toCreatedAtMapByActor(e.CreatedAtMapByActor()), + CreatedAtMapByActor: toCreatedAtMapByActor(e.MaxCreatedAtMapByActor()), Content: e.Content(), Attributes: e.Attributes(), ExecutedAt: ToTimeTicket(e.ExecutedAt()), @@ -325,7 +325,7 @@ func toStyle(style *operations.Style) (*api.Operation_Style_, error) { ParentCreatedAt: ToTimeTicket(style.ParentCreatedAt()), From: toTextNodePos(style.From()), To: toTextNodePos(style.To()), - CreatedAtMapByActor: toCreatedAtMapByActor(style.CreatedAtMapByActor()), + CreatedAtMapByActor: toCreatedAtMapByActor(style.MaxCreatedAtMapByActor()), Attributes: style.Attributes(), ExecutedAt: ToTimeTicket(style.ExecutedAt()), }, @@ -355,7 +355,7 @@ func toTreeEdit(e *operations.TreeEdit) (*api.Operation_TreeEdit_, error) { To: toTreePos(e.ToPos()), Contents: ToTreeNodesWhenEdit(e.Contents()), SplitLevel: int32(e.SplitLevel()), - CreatedAtMapByActor: toCreatedAtMapByActor(e.CreatedAtMapByActor()), + CreatedAtMapByActor: toCreatedAtMapByActor(e.MaxCreatedAtMapByActor()), ExecutedAt: ToTimeTicket(e.ExecutedAt()), }, }, nil @@ -364,12 +364,13 @@ func toTreeEdit(e *operations.TreeEdit) (*api.Operation_TreeEdit_, error) { func toTreeStyle(style *operations.TreeStyle) (*api.Operation_TreeStyle_, error) { return &api.Operation_TreeStyle_{ TreeStyle: &api.Operation_TreeStyle{ - ParentCreatedAt: ToTimeTicket(style.ParentCreatedAt()), - From: toTreePos(style.FromPos()), - To: toTreePos(style.ToPos()), - Attributes: style.Attributes(), - ExecutedAt: ToTimeTicket(style.ExecutedAt()), - AttributesToRemove: style.AttributesToRemove(), + ParentCreatedAt: ToTimeTicket(style.ParentCreatedAt()), + From: toTreePos(style.FromPos()), + To: toTreePos(style.ToPos()), + Attributes: style.Attributes(), + ExecutedAt: ToTimeTicket(style.ExecutedAt()), + AttributesToRemove: style.AttributesToRemove(), + CreatedAtMapByActor: toCreatedAtMapByActor(style.MaxCreatedAtMapByActor()), }, }, nil } diff --git a/api/docs/yorkie.base.yaml b/api/docs/yorkie.base.yaml new file mode 100644 index 000000000..2b7c76835 --- /dev/null +++ b/api/docs/yorkie.base.yaml @@ -0,0 +1,18 @@ +openapi: 3.1.0 +info: + title: Yorkie + description: "Yorkie is an open source document store for building collaborative editing applications." + version: v0.4.27 +servers: + - url: https://api.yorkie.dev + description: Production server + - url: http://localhost:8080 + description: Local server +components: + securitySchemes: + ApiKeyAuth: + type: apiKey + in: header + name: Authorization +security: + - ApiKeyAuth: [] # use the same name as under securitySchemes diff --git a/api/docs/yorkie/v1/admin.openapi.yaml b/api/docs/yorkie/v1/admin.openapi.yaml new file mode 100644 index 000000000..717ccccad --- /dev/null +++ b/api/docs/yorkie/v1/admin.openapi.yaml @@ -0,0 +1,2038 @@ +openapi: 3.1.0 +info: + description: Yorkie is an open source document store for building collaborative + editing applications. + title: Yorkie + version: v0.4.27 +servers: +- description: Production server + url: https://api.yorkie.dev +- description: Local server + url: http://localhost:8080 +paths: + /yorkie.v1.AdminService/CreateProject: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.AdminService.CreateProject.yorkie.v1.CreateProjectRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.AdminService.CreateProject.yorkie.v1.CreateProjectResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.AdminService + /yorkie.v1.AdminService/GetDocument: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.AdminService.GetDocument.yorkie.v1.GetDocumentRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.AdminService.GetDocument.yorkie.v1.GetDocumentResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.AdminService + /yorkie.v1.AdminService/GetDocuments: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.AdminService.GetDocuments.yorkie.v1.GetDocumentsRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.AdminService.GetDocuments.yorkie.v1.GetDocumentsResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.AdminService + /yorkie.v1.AdminService/GetProject: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.AdminService.GetProject.yorkie.v1.GetProjectRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.AdminService.GetProject.yorkie.v1.GetProjectResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.AdminService + /yorkie.v1.AdminService/GetSnapshotMeta: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.AdminService.GetSnapshotMeta.yorkie.v1.GetSnapshotMetaRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.AdminService.GetSnapshotMeta.yorkie.v1.GetSnapshotMetaResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.AdminService + /yorkie.v1.AdminService/ListChanges: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.AdminService.ListChanges.yorkie.v1.ListChangesRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.AdminService.ListChanges.yorkie.v1.ListChangesResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.AdminService + /yorkie.v1.AdminService/ListDocuments: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.AdminService.ListDocuments.yorkie.v1.ListDocumentsRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.AdminService.ListDocuments.yorkie.v1.ListDocumentsResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.AdminService + /yorkie.v1.AdminService/ListProjects: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.AdminService.ListProjects.yorkie.v1.ListProjectsRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.AdminService.ListProjects.yorkie.v1.ListProjectsResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.AdminService + /yorkie.v1.AdminService/LogIn: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.AdminService.LogIn.yorkie.v1.LogInRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.AdminService.LogIn.yorkie.v1.LogInResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.AdminService + /yorkie.v1.AdminService/RemoveDocumentByAdmin: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.AdminService.RemoveDocumentByAdmin.yorkie.v1.RemoveDocumentByAdminRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.AdminService.RemoveDocumentByAdmin.yorkie.v1.RemoveDocumentByAdminResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.AdminService + /yorkie.v1.AdminService/SearchDocuments: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.AdminService.SearchDocuments.yorkie.v1.SearchDocumentsRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.AdminService.SearchDocuments.yorkie.v1.SearchDocumentsResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.AdminService + /yorkie.v1.AdminService/SignUp: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.AdminService.SignUp.yorkie.v1.SignUpRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.AdminService.SignUp.yorkie.v1.SignUpResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.AdminService + /yorkie.v1.AdminService/UpdateProject: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.AdminService.UpdateProject.yorkie.v1.UpdateProjectRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.AdminService.UpdateProject.yorkie.v1.UpdateProjectResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.AdminService +components: + requestBodies: + yorkie.v1.AdminService.CreateProject.yorkie.v1.CreateProjectRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.CreateProjectRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.CreateProjectRequest' + required: true + yorkie.v1.AdminService.GetDocument.yorkie.v1.GetDocumentRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.GetDocumentRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.GetDocumentRequest' + required: true + yorkie.v1.AdminService.GetDocuments.yorkie.v1.GetDocumentsRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.GetDocumentsRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.GetDocumentsRequest' + required: true + yorkie.v1.AdminService.GetProject.yorkie.v1.GetProjectRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.GetProjectRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.GetProjectRequest' + required: true + yorkie.v1.AdminService.GetSnapshotMeta.yorkie.v1.GetSnapshotMetaRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.GetSnapshotMetaRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.GetSnapshotMetaRequest' + required: true + yorkie.v1.AdminService.ListChanges.yorkie.v1.ListChangesRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.ListChangesRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.ListChangesRequest' + required: true + yorkie.v1.AdminService.ListDocuments.yorkie.v1.ListDocumentsRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.ListDocumentsRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.ListDocumentsRequest' + required: true + yorkie.v1.AdminService.ListProjects.yorkie.v1.ListProjectsRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.ListProjectsRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.ListProjectsRequest' + required: true + yorkie.v1.AdminService.LogIn.yorkie.v1.LogInRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.LogInRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.LogInRequest' + required: true + yorkie.v1.AdminService.RemoveDocumentByAdmin.yorkie.v1.RemoveDocumentByAdminRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.RemoveDocumentByAdminRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.RemoveDocumentByAdminRequest' + required: true + yorkie.v1.AdminService.SearchDocuments.yorkie.v1.SearchDocumentsRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.SearchDocumentsRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.SearchDocumentsRequest' + required: true + yorkie.v1.AdminService.SignUp.yorkie.v1.SignUpRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.SignUpRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.SignUpRequest' + required: true + yorkie.v1.AdminService.UpdateProject.yorkie.v1.UpdateProjectRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.UpdateProjectRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.UpdateProjectRequest' + required: true + responses: + connect.error: + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + application/proto: + schema: + $ref: '#/components/schemas/connect.error' + description: "" + yorkie.v1.AdminService.CreateProject.yorkie.v1.CreateProjectResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.CreateProjectResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.CreateProjectResponse' + description: "" + yorkie.v1.AdminService.GetDocument.yorkie.v1.GetDocumentResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.GetDocumentResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.GetDocumentResponse' + description: "" + yorkie.v1.AdminService.GetDocuments.yorkie.v1.GetDocumentsResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.GetDocumentsResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.GetDocumentsResponse' + description: "" + yorkie.v1.AdminService.GetProject.yorkie.v1.GetProjectResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.GetProjectResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.GetProjectResponse' + description: "" + yorkie.v1.AdminService.GetSnapshotMeta.yorkie.v1.GetSnapshotMetaResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.GetSnapshotMetaResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.GetSnapshotMetaResponse' + description: "" + yorkie.v1.AdminService.ListChanges.yorkie.v1.ListChangesResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.ListChangesResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.ListChangesResponse' + description: "" + yorkie.v1.AdminService.ListDocuments.yorkie.v1.ListDocumentsResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.ListDocumentsResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.ListDocumentsResponse' + description: "" + yorkie.v1.AdminService.ListProjects.yorkie.v1.ListProjectsResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.ListProjectsResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.ListProjectsResponse' + description: "" + yorkie.v1.AdminService.LogIn.yorkie.v1.LogInResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.LogInResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.LogInResponse' + description: "" + yorkie.v1.AdminService.RemoveDocumentByAdmin.yorkie.v1.RemoveDocumentByAdminResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.RemoveDocumentByAdminResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.RemoveDocumentByAdminResponse' + description: "" + yorkie.v1.AdminService.SearchDocuments.yorkie.v1.SearchDocumentsResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.SearchDocumentsResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.SearchDocumentsResponse' + description: "" + yorkie.v1.AdminService.SignUp.yorkie.v1.SignUpResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.SignUpResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.SignUpResponse' + description: "" + yorkie.v1.AdminService.UpdateProject.yorkie.v1.UpdateProjectResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.UpdateProjectResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.UpdateProjectResponse' + description: "" + schemas: + connect.error: + additionalProperties: false + description: 'Error type returned by Connect: https://connectrpc.com/docs/go/errors/#http-representation' + properties: + code: + enum: + - CodeCanceled + - CodeUnknown + - CodeInvalidArgument + - CodeDeadlineExceeded + - CodeNotFound + - CodeAlreadyExists + - CodePermissionDenied + - CodeResourceExhausted + - CodeFailedPrecondition + - CodeAborted + - CodeOutOfRange + - CodeInternal + - CodeUnavailable + - CodeDataLoss + - CodeUnauthenticated + examples: + - CodeNotFound + type: string + message: + type: string + title: Connect Error + type: object + google.protobuf.StringValue: + additionalProperties: false + description: |- + Wrapper message for `string`. + + The JSON representation for `StringValue` is JSON string. + properties: + value: + additionalProperties: false + description: The string value. + title: value + type: string + title: StringValue + type: object + google.protobuf.Timestamp: + additionalProperties: false + description: |- + A Timestamp represents a point in time independent of any time zone or local + calendar, encoded as a count of seconds and fractions of seconds at + nanosecond resolution. The count is relative to an epoch at UTC midnight on + January 1, 1970, in the proleptic Gregorian calendar which extends the + Gregorian calendar backwards to year one. + + All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap + second table is needed for interpretation, using a [24-hour linear + smear](https://developers.google.com/time/smear). + + The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By + restricting to that range, we ensure that we can convert to and from [RFC + 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings. + + # Examples + + Example 1: Compute Timestamp from POSIX `time()`. + + Timestamp timestamp; + timestamp.set_seconds(time(NULL)); + timestamp.set_nanos(0); + + Example 2: Compute Timestamp from POSIX `gettimeofday()`. + + struct timeval tv; + gettimeofday(&tv, NULL); + + Timestamp timestamp; + timestamp.set_seconds(tv.tv_sec); + timestamp.set_nanos(tv.tv_usec * 1000); + + Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. + + FILETIME ft; + GetSystemTimeAsFileTime(&ft); + UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; + + // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z + // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. + Timestamp timestamp; + timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); + timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); + + Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. + + long millis = System.currentTimeMillis(); + + Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) + .setNanos((int) ((millis % 1000) * 1000000)).build(); + + Example 5: Compute Timestamp from Java `Instant.now()`. + + Instant now = Instant.now(); + + Timestamp timestamp = + Timestamp.newBuilder().setSeconds(now.getEpochSecond()) + .setNanos(now.getNano()).build(); + + Example 6: Compute Timestamp from current time in Python. + + timestamp = Timestamp() + timestamp.GetCurrentTime() + + # JSON Mapping + + In JSON format, the Timestamp type is encoded as a string in the + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the + format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" + where {year} is always expressed using four digits while {month}, {day}, + {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional + seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), + are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone + is required. A proto3 JSON serializer should always use UTC (as indicated by + "Z") when printing the Timestamp type and a proto3 JSON parser should be + able to accept both UTC and other timezones (as indicated by an offset). + + For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past + 01:30 UTC on January 15, 2017. + + In JavaScript, one can convert a Date object to this format using the + standard + [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) + method. In Python, a standard `datetime.datetime` object can be converted + to this format using + [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with + the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use + the Joda Time's [`ISODateTimeFormat.dateTime()`]( + http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime() + ) to obtain a formatter capable of generating timestamps in this format. + format: date-time + type: string + yorkie.v1.Change: + additionalProperties: false + description: "" + properties: + id: + $ref: '#/components/schemas/yorkie.v1.ChangeID' + additionalProperties: false + description: "" + title: id + type: object + message: + additionalProperties: false + description: "" + title: message + type: string + operations: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.Operation' + type: object + title: operations + type: array + presenceChange: + $ref: '#/components/schemas/yorkie.v1.PresenceChange' + additionalProperties: false + description: "" + title: presence_change + type: object + title: Change + type: object + yorkie.v1.ChangeID: + additionalProperties: false + description: "" + properties: + actorId: + additionalProperties: false + description: "" + format: byte + title: actor_id + type: string + clientSeq: + additionalProperties: false + description: "" + title: client_seq + type: integer + lamport: + additionalProperties: false + description: "" + oneOf: + - type: string + - type: number + title: lamport + serverSeq: + additionalProperties: false + description: "" + oneOf: + - type: string + - type: number + title: server_seq + title: ChangeID + type: object + yorkie.v1.CreateProjectRequest: + additionalProperties: false + description: "" + properties: + name: + additionalProperties: false + description: "" + title: name + type: string + title: CreateProjectRequest + type: object + yorkie.v1.CreateProjectResponse: + additionalProperties: false + description: "" + properties: + project: + $ref: '#/components/schemas/yorkie.v1.Project' + additionalProperties: false + description: "" + title: project + type: object + title: CreateProjectResponse + type: object + yorkie.v1.DocumentSummary: + additionalProperties: false + description: "" + properties: + accessedAt: + $ref: '#/components/schemas/google.protobuf.Timestamp' + additionalProperties: false + description: "" + title: accessed_at + type: object + createdAt: + $ref: '#/components/schemas/google.protobuf.Timestamp' + additionalProperties: false + description: "" + title: created_at + type: object + id: + additionalProperties: false + description: "" + title: id + type: string + key: + additionalProperties: false + description: "" + title: key + type: string + snapshot: + additionalProperties: false + description: "" + title: snapshot + type: string + updatedAt: + $ref: '#/components/schemas/google.protobuf.Timestamp' + additionalProperties: false + description: "" + title: updated_at + type: object + title: DocumentSummary + type: object + yorkie.v1.GetDocumentRequest: + additionalProperties: false + description: "" + properties: + documentKey: + additionalProperties: false + description: "" + title: document_key + type: string + projectName: + additionalProperties: false + description: "" + title: project_name + type: string + title: GetDocumentRequest + type: object + yorkie.v1.GetDocumentResponse: + additionalProperties: false + description: "" + properties: + document: + $ref: '#/components/schemas/yorkie.v1.DocumentSummary' + additionalProperties: false + description: "" + title: document + type: object + title: GetDocumentResponse + type: object + yorkie.v1.GetDocumentsRequest: + additionalProperties: false + description: "" + properties: + documentKeys: + additionalProperties: false + description: "" + items: + type: string + title: document_keys + type: array + includeSnapshot: + additionalProperties: false + description: "" + title: include_snapshot + type: boolean + projectName: + additionalProperties: false + description: "" + title: project_name + type: string + title: GetDocumentsRequest + type: object + yorkie.v1.GetDocumentsResponse: + additionalProperties: false + description: "" + properties: + documents: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.DocumentSummary' + type: object + title: documents + type: array + title: GetDocumentsResponse + type: object + yorkie.v1.GetProjectRequest: + additionalProperties: false + description: "" + properties: + name: + additionalProperties: false + description: "" + title: name + type: string + title: GetProjectRequest + type: object + yorkie.v1.GetProjectResponse: + additionalProperties: false + description: "" + properties: + project: + $ref: '#/components/schemas/yorkie.v1.Project' + additionalProperties: false + description: "" + title: project + type: object + title: GetProjectResponse + type: object + yorkie.v1.GetSnapshotMetaRequest: + additionalProperties: false + description: "" + properties: + documentKey: + additionalProperties: false + description: "" + title: document_key + type: string + projectName: + additionalProperties: false + description: "" + title: project_name + type: string + serverSeq: + additionalProperties: false + description: "" + oneOf: + - type: string + - type: number + title: server_seq + title: GetSnapshotMetaRequest + type: object + yorkie.v1.GetSnapshotMetaResponse: + additionalProperties: false + description: "" + properties: + lamport: + additionalProperties: false + description: "" + oneOf: + - type: string + - type: number + title: lamport + snapshot: + additionalProperties: false + description: "" + format: byte + title: snapshot + type: string + title: GetSnapshotMetaResponse + type: object + yorkie.v1.JSONElementSimple: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + movedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: moved_at + type: object + removedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: removed_at + type: object + type: + $ref: '#/components/schemas/yorkie.v1.ValueType' + additionalProperties: false + description: "" + title: type + value: + additionalProperties: false + description: "" + format: byte + title: value + type: string + title: JSONElementSimple + type: object + yorkie.v1.ListChangesRequest: + additionalProperties: false + description: "" + properties: + documentKey: + additionalProperties: false + description: "" + title: document_key + type: string + isForward: + additionalProperties: false + description: "" + title: is_forward + type: boolean + pageSize: + additionalProperties: false + description: "" + title: page_size + type: integer + previousSeq: + additionalProperties: false + description: "" + oneOf: + - type: string + - type: number + title: previous_seq + projectName: + additionalProperties: false + description: "" + title: project_name + type: string + title: ListChangesRequest + type: object + yorkie.v1.ListChangesResponse: + additionalProperties: false + description: "" + properties: + changes: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.Change' + type: object + title: changes + type: array + title: ListChangesResponse + type: object + yorkie.v1.ListDocumentsRequest: + additionalProperties: false + description: "" + properties: + includeSnapshot: + additionalProperties: false + description: "" + title: include_snapshot + type: boolean + isForward: + additionalProperties: false + description: "" + title: is_forward + type: boolean + pageSize: + additionalProperties: false + description: "" + title: page_size + type: integer + previousId: + additionalProperties: false + description: "" + title: previous_id + type: string + projectName: + additionalProperties: false + description: "" + title: project_name + type: string + title: ListDocumentsRequest + type: object + yorkie.v1.ListDocumentsResponse: + additionalProperties: false + description: "" + properties: + documents: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.DocumentSummary' + type: object + title: documents + type: array + title: ListDocumentsResponse + type: object + yorkie.v1.ListProjectsRequest: + additionalProperties: false + description: "" + title: ListProjectsRequest + type: object + yorkie.v1.ListProjectsResponse: + additionalProperties: false + description: "" + properties: + projects: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.Project' + type: object + title: projects + type: array + title: ListProjectsResponse + type: object + yorkie.v1.LogInRequest: + additionalProperties: false + description: "" + properties: + password: + additionalProperties: false + description: "" + title: password + type: string + username: + additionalProperties: false + description: "" + title: username + type: string + title: LogInRequest + type: object + yorkie.v1.LogInResponse: + additionalProperties: false + description: "" + properties: + token: + additionalProperties: false + description: "" + title: token + type: string + title: LogInResponse + type: object + yorkie.v1.NodeAttr: + additionalProperties: false + description: "" + properties: + isRemoved: + additionalProperties: false + description: "" + title: is_removed + type: boolean + updatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: updated_at + type: object + value: + additionalProperties: false + description: "" + title: value + type: string + title: NodeAttr + type: object + yorkie.v1.Operation: + additionalProperties: false + description: "" + properties: + add: + $ref: '#/components/schemas/yorkie.v1.Operation.Add' + additionalProperties: false + description: "" + title: add + type: object + edit: + $ref: '#/components/schemas/yorkie.v1.Operation.Edit' + additionalProperties: false + description: "" + title: edit + type: object + increase: + $ref: '#/components/schemas/yorkie.v1.Operation.Increase' + additionalProperties: false + description: "" + title: increase + type: object + move: + $ref: '#/components/schemas/yorkie.v1.Operation.Move' + additionalProperties: false + description: "" + title: move + type: object + remove: + $ref: '#/components/schemas/yorkie.v1.Operation.Remove' + additionalProperties: false + description: "" + title: remove + type: object + select: + $ref: '#/components/schemas/yorkie.v1.Operation.Select' + additionalProperties: false + description: "" + title: select + type: object + set: + $ref: '#/components/schemas/yorkie.v1.Operation.Set' + additionalProperties: false + description: "" + title: set + type: object + style: + $ref: '#/components/schemas/yorkie.v1.Operation.Style' + additionalProperties: false + description: "" + title: style + type: object + treeEdit: + $ref: '#/components/schemas/yorkie.v1.Operation.TreeEdit' + additionalProperties: false + description: "" + title: tree_edit + type: object + treeStyle: + $ref: '#/components/schemas/yorkie.v1.Operation.TreeStyle' + additionalProperties: false + description: "" + title: tree_style + type: object + title: Operation + type: object + yorkie.v1.Operation.Add: + additionalProperties: false + description: "" + properties: + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + prevCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: prev_created_at + type: object + value: + $ref: '#/components/schemas/yorkie.v1.JSONElementSimple' + additionalProperties: false + description: "" + title: value + type: object + title: Add + type: object + yorkie.v1.Operation.Edit: + additionalProperties: false + description: "" + properties: + attributes: + additionalProperties: false + description: "" + title: attributes + type: object + content: + additionalProperties: false + description: "" + title: content + type: string + createdAtMapByActor: + additionalProperties: false + description: "" + title: created_at_map_by_actor + type: object + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + from: + $ref: '#/components/schemas/yorkie.v1.TextNodePos' + additionalProperties: false + description: "" + title: from + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + to: + $ref: '#/components/schemas/yorkie.v1.TextNodePos' + additionalProperties: false + description: "" + title: to + type: object + title: Edit + type: object + yorkie.v1.Operation.Edit.AttributesEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + additionalProperties: false + description: "" + title: value + type: string + title: AttributesEntry + type: object + yorkie.v1.Operation.Edit.CreatedAtMapByActorEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: value + type: object + title: CreatedAtMapByActorEntry + type: object + yorkie.v1.Operation.Increase: + additionalProperties: false + description: "" + properties: + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + value: + $ref: '#/components/schemas/yorkie.v1.JSONElementSimple' + additionalProperties: false + description: "" + title: value + type: object + title: Increase + type: object + yorkie.v1.Operation.Move: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + prevCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: prev_created_at + type: object + title: Move + type: object + yorkie.v1.Operation.Remove: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + title: Remove + type: object + yorkie.v1.Operation.Select: + additionalProperties: false + description: |- + NOTE(hackerwins): Select Operation is not used in the current version. + In the previous version, it was used to represent selection of Text. + However, it has been replaced by Presence now. It is retained for backward + compatibility purposes. + properties: + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + from: + $ref: '#/components/schemas/yorkie.v1.TextNodePos' + additionalProperties: false + description: "" + title: from + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + to: + $ref: '#/components/schemas/yorkie.v1.TextNodePos' + additionalProperties: false + description: "" + title: to + type: object + title: Select + type: object + yorkie.v1.Operation.Set: + additionalProperties: false + description: "" + properties: + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + key: + additionalProperties: false + description: "" + title: key + type: string + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + value: + $ref: '#/components/schemas/yorkie.v1.JSONElementSimple' + additionalProperties: false + description: "" + title: value + type: object + title: Set + type: object + yorkie.v1.Operation.Style: + additionalProperties: false + description: "" + properties: + attributes: + additionalProperties: false + description: "" + title: attributes + type: object + createdAtMapByActor: + additionalProperties: false + description: "" + title: created_at_map_by_actor + type: object + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + from: + $ref: '#/components/schemas/yorkie.v1.TextNodePos' + additionalProperties: false + description: "" + title: from + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + to: + $ref: '#/components/schemas/yorkie.v1.TextNodePos' + additionalProperties: false + description: "" + title: to + type: object + title: Style + type: object + yorkie.v1.Operation.Style.AttributesEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + additionalProperties: false + description: "" + title: value + type: string + title: AttributesEntry + type: object + yorkie.v1.Operation.Style.CreatedAtMapByActorEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: value + type: object + title: CreatedAtMapByActorEntry + type: object + yorkie.v1.Operation.TreeEdit: + additionalProperties: false + description: "" + properties: + contents: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.TreeNodes' + type: object + title: contents + type: array + createdAtMapByActor: + additionalProperties: false + description: "" + title: created_at_map_by_actor + type: object + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + from: + $ref: '#/components/schemas/yorkie.v1.TreePos' + additionalProperties: false + description: "" + title: from + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + splitLevel: + additionalProperties: false + description: "" + title: split_level + type: integer + to: + $ref: '#/components/schemas/yorkie.v1.TreePos' + additionalProperties: false + description: "" + title: to + type: object + title: TreeEdit + type: object + yorkie.v1.Operation.TreeEdit.CreatedAtMapByActorEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: value + type: object + title: CreatedAtMapByActorEntry + type: object + yorkie.v1.Operation.TreeStyle: + additionalProperties: false + description: "" + properties: + attributes: + additionalProperties: false + description: "" + title: attributes + type: object + attributesToRemove: + additionalProperties: false + description: "" + items: + type: string + title: attributes_to_remove + type: array + createdAtMapByActor: + additionalProperties: false + description: "" + title: created_at_map_by_actor + type: object + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + from: + $ref: '#/components/schemas/yorkie.v1.TreePos' + additionalProperties: false + description: "" + title: from + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + to: + $ref: '#/components/schemas/yorkie.v1.TreePos' + additionalProperties: false + description: "" + title: to + type: object + title: TreeStyle + type: object + yorkie.v1.Operation.TreeStyle.AttributesEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + additionalProperties: false + description: "" + title: value + type: string + title: AttributesEntry + type: object + yorkie.v1.Operation.TreeStyle.CreatedAtMapByActorEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: value + type: object + title: CreatedAtMapByActorEntry + type: object + yorkie.v1.Presence: + additionalProperties: false + description: "" + properties: + data: + additionalProperties: false + description: "" + title: data + type: object + title: Presence + type: object + yorkie.v1.Presence.DataEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + additionalProperties: false + description: "" + title: value + type: string + title: DataEntry + type: object + yorkie.v1.PresenceChange: + additionalProperties: false + description: "" + properties: + presence: + $ref: '#/components/schemas/yorkie.v1.Presence' + additionalProperties: false + description: "" + title: presence + type: object + type: + $ref: '#/components/schemas/yorkie.v1.PresenceChange.ChangeType' + additionalProperties: false + description: "" + title: type + title: PresenceChange + type: object + yorkie.v1.PresenceChange.ChangeType: + description: "" + enum: + - - CHANGE_TYPE_UNSPECIFIED + - 0 + - CHANGE_TYPE_PUT + - 1 + - CHANGE_TYPE_DELETE + - 2 + - CHANGE_TYPE_CLEAR + - 3 + title: ChangeType + type: string + yorkie.v1.Project: + additionalProperties: false + description: "" + properties: + authWebhookMethods: + additionalProperties: false + description: "" + items: + type: string + title: auth_webhook_methods + type: array + authWebhookUrl: + additionalProperties: false + description: "" + title: auth_webhook_url + type: string + clientDeactivateThreshold: + additionalProperties: false + description: "" + title: client_deactivate_threshold + type: string + createdAt: + $ref: '#/components/schemas/google.protobuf.Timestamp' + additionalProperties: false + description: "" + title: created_at + type: object + id: + additionalProperties: false + description: "" + title: id + type: string + name: + additionalProperties: false + description: "" + title: name + type: string + publicKey: + additionalProperties: false + description: "" + title: public_key + type: string + secretKey: + additionalProperties: false + description: "" + title: secret_key + type: string + updatedAt: + $ref: '#/components/schemas/google.protobuf.Timestamp' + additionalProperties: false + description: "" + title: updated_at + type: object + title: Project + type: object + yorkie.v1.RemoveDocumentByAdminRequest: + additionalProperties: false + description: "" + properties: + documentKey: + additionalProperties: false + description: "" + title: document_key + type: string + force: + additionalProperties: false + description: "" + title: force + type: boolean + projectName: + additionalProperties: false + description: "" + title: project_name + type: string + title: RemoveDocumentByAdminRequest + type: object + yorkie.v1.RemoveDocumentByAdminResponse: + additionalProperties: false + description: "" + title: RemoveDocumentByAdminResponse + type: object + yorkie.v1.SearchDocumentsRequest: + additionalProperties: false + description: "" + properties: + pageSize: + additionalProperties: false + description: "" + title: page_size + type: integer + projectName: + additionalProperties: false + description: "" + title: project_name + type: string + query: + additionalProperties: false + description: "" + title: query + type: string + title: SearchDocumentsRequest + type: object + yorkie.v1.SearchDocumentsResponse: + additionalProperties: false + description: "" + properties: + documents: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.DocumentSummary' + type: object + title: documents + type: array + totalCount: + additionalProperties: false + description: "" + title: total_count + type: integer + title: SearchDocumentsResponse + type: object + yorkie.v1.SignUpRequest: + additionalProperties: false + description: "" + properties: + password: + additionalProperties: false + description: "" + title: password + type: string + username: + additionalProperties: false + description: "" + title: username + type: string + title: SignUpRequest + type: object + yorkie.v1.SignUpResponse: + additionalProperties: false + description: "" + properties: + user: + $ref: '#/components/schemas/yorkie.v1.User' + additionalProperties: false + description: "" + title: user + type: object + title: SignUpResponse + type: object + yorkie.v1.TextNodePos: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + offset: + additionalProperties: false + description: "" + title: offset + type: integer + relativeOffset: + additionalProperties: false + description: "" + title: relative_offset + type: integer + title: TextNodePos + type: object + yorkie.v1.TimeTicket: + additionalProperties: false + description: "" + properties: + actorId: + additionalProperties: false + description: "" + format: byte + title: actor_id + type: string + delimiter: + additionalProperties: false + description: "" + title: delimiter + type: integer + lamport: + additionalProperties: false + description: "" + oneOf: + - type: string + - type: number + title: lamport + title: TimeTicket + type: object + yorkie.v1.TreeNode: + additionalProperties: false + description: "" + properties: + attributes: + additionalProperties: false + description: "" + title: attributes + type: object + depth: + additionalProperties: false + description: "" + title: depth + type: integer + id: + $ref: '#/components/schemas/yorkie.v1.TreeNodeID' + additionalProperties: false + description: "" + title: id + type: object + insNextId: + $ref: '#/components/schemas/yorkie.v1.TreeNodeID' + additionalProperties: false + description: "" + title: ins_next_id + type: object + insPrevId: + $ref: '#/components/schemas/yorkie.v1.TreeNodeID' + additionalProperties: false + description: "" + title: ins_prev_id + type: object + removedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: removed_at + type: object + type: + additionalProperties: false + description: "" + title: type + type: string + value: + additionalProperties: false + description: "" + title: value + type: string + title: TreeNode + type: object + yorkie.v1.TreeNode.AttributesEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + $ref: '#/components/schemas/yorkie.v1.NodeAttr' + additionalProperties: false + description: "" + title: value + type: object + title: AttributesEntry + type: object + yorkie.v1.TreeNodeID: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + offset: + additionalProperties: false + description: "" + title: offset + type: integer + title: TreeNodeID + type: object + yorkie.v1.TreeNodes: + additionalProperties: false + description: "" + properties: + content: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.TreeNode' + type: object + title: content + type: array + title: TreeNodes + type: object + yorkie.v1.TreePos: + additionalProperties: false + description: "" + properties: + leftSiblingId: + $ref: '#/components/schemas/yorkie.v1.TreeNodeID' + additionalProperties: false + description: "" + title: left_sibling_id + type: object + parentId: + $ref: '#/components/schemas/yorkie.v1.TreeNodeID' + additionalProperties: false + description: "" + title: parent_id + type: object + title: TreePos + type: object + yorkie.v1.UpdatableProjectFields: + additionalProperties: false + description: "" + properties: + authWebhookMethods: + $ref: '#/components/schemas/yorkie.v1.UpdatableProjectFields.AuthWebhookMethods' + additionalProperties: false + description: "" + title: auth_webhook_methods + type: object + authWebhookUrl: + $ref: '#/components/schemas/google.protobuf.StringValue' + additionalProperties: false + description: "" + title: auth_webhook_url + type: object + clientDeactivateThreshold: + $ref: '#/components/schemas/google.protobuf.StringValue' + additionalProperties: false + description: "" + title: client_deactivate_threshold + type: object + name: + $ref: '#/components/schemas/google.protobuf.StringValue' + additionalProperties: false + description: "" + title: name + type: object + title: UpdatableProjectFields + type: object + yorkie.v1.UpdatableProjectFields.AuthWebhookMethods: + additionalProperties: false + description: "" + properties: + methods: + additionalProperties: false + description: "" + items: + type: string + title: methods + type: array + title: AuthWebhookMethods + type: object + yorkie.v1.UpdateProjectRequest: + additionalProperties: false + description: "" + properties: + fields: + $ref: '#/components/schemas/yorkie.v1.UpdatableProjectFields' + additionalProperties: false + description: "" + title: fields + type: object + id: + additionalProperties: false + description: "" + title: id + type: string + title: UpdateProjectRequest + type: object + yorkie.v1.UpdateProjectResponse: + additionalProperties: false + description: "" + properties: + project: + $ref: '#/components/schemas/yorkie.v1.Project' + additionalProperties: false + description: "" + title: project + type: object + title: UpdateProjectResponse + type: object + yorkie.v1.User: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/google.protobuf.Timestamp' + additionalProperties: false + description: "" + title: created_at + type: object + id: + additionalProperties: false + description: "" + title: id + type: string + username: + additionalProperties: false + description: "" + title: username + type: string + title: User + type: object + yorkie.v1.ValueType: + description: "" + enum: + - - VALUE_TYPE_NULL + - 0 + - VALUE_TYPE_BOOLEAN + - 1 + - VALUE_TYPE_INTEGER + - 2 + - VALUE_TYPE_LONG + - 3 + - VALUE_TYPE_DOUBLE + - 4 + - VALUE_TYPE_STRING + - 5 + - VALUE_TYPE_BYTES + - 6 + - VALUE_TYPE_DATE + - 7 + - VALUE_TYPE_JSON_OBJECT + - 8 + - VALUE_TYPE_JSON_ARRAY + - 9 + - VALUE_TYPE_TEXT + - 10 + - VALUE_TYPE_INTEGER_CNT + - 11 + - VALUE_TYPE_LONG_CNT + - 12 + - VALUE_TYPE_TREE + - 13 + title: ValueType + type: string + securitySchemes: + ApiKeyAuth: + in: header + name: Authorization + type: apiKey +security: +- ApiKeyAuth: [] +tags: +- description: Admin is a service that provides a API for Admin. + name: yorkie.v1.AdminService diff --git a/api/docs/yorkie/v1/resources.openapi.yaml b/api/docs/yorkie/v1/resources.openapi.yaml new file mode 100644 index 000000000..1c40a58a9 --- /dev/null +++ b/api/docs/yorkie/v1/resources.openapi.yaml @@ -0,0 +1,1724 @@ +openapi: 3.1.0 +info: + description: Yorkie is an open source document store for building collaborative + editing applications. + title: Yorkie + version: v0.4.27 +servers: +- description: Production server + url: https://api.yorkie.dev +- description: Local server + url: http://localhost:8080 +paths: {} +components: + responses: + connect.error: + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + application/proto: + schema: + $ref: '#/components/schemas/connect.error' + description: "" + schemas: + connect.error: + additionalProperties: false + description: 'Error type returned by Connect: https://connectrpc.com/docs/go/errors/#http-representation' + properties: + code: + enum: + - CodeCanceled + - CodeUnknown + - CodeInvalidArgument + - CodeDeadlineExceeded + - CodeNotFound + - CodeAlreadyExists + - CodePermissionDenied + - CodeResourceExhausted + - CodeFailedPrecondition + - CodeAborted + - CodeOutOfRange + - CodeInternal + - CodeUnavailable + - CodeDataLoss + - CodeUnauthenticated + examples: + - CodeNotFound + type: string + message: + type: string + title: Connect Error + type: object + google.protobuf.StringValue: + additionalProperties: false + description: |- + Wrapper message for `string`. + + The JSON representation for `StringValue` is JSON string. + properties: + value: + additionalProperties: false + description: The string value. + title: value + type: string + title: StringValue + type: object + google.protobuf.Timestamp: + additionalProperties: false + description: |- + A Timestamp represents a point in time independent of any time zone or local + calendar, encoded as a count of seconds and fractions of seconds at + nanosecond resolution. The count is relative to an epoch at UTC midnight on + January 1, 1970, in the proleptic Gregorian calendar which extends the + Gregorian calendar backwards to year one. + + All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap + second table is needed for interpretation, using a [24-hour linear + smear](https://developers.google.com/time/smear). + + The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By + restricting to that range, we ensure that we can convert to and from [RFC + 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings. + + # Examples + + Example 1: Compute Timestamp from POSIX `time()`. + + Timestamp timestamp; + timestamp.set_seconds(time(NULL)); + timestamp.set_nanos(0); + + Example 2: Compute Timestamp from POSIX `gettimeofday()`. + + struct timeval tv; + gettimeofday(&tv, NULL); + + Timestamp timestamp; + timestamp.set_seconds(tv.tv_sec); + timestamp.set_nanos(tv.tv_usec * 1000); + + Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. + + FILETIME ft; + GetSystemTimeAsFileTime(&ft); + UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; + + // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z + // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. + Timestamp timestamp; + timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); + timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); + + Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. + + long millis = System.currentTimeMillis(); + + Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) + .setNanos((int) ((millis % 1000) * 1000000)).build(); + + Example 5: Compute Timestamp from Java `Instant.now()`. + + Instant now = Instant.now(); + + Timestamp timestamp = + Timestamp.newBuilder().setSeconds(now.getEpochSecond()) + .setNanos(now.getNano()).build(); + + Example 6: Compute Timestamp from current time in Python. + + timestamp = Timestamp() + timestamp.GetCurrentTime() + + # JSON Mapping + + In JSON format, the Timestamp type is encoded as a string in the + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the + format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" + where {year} is always expressed using four digits while {month}, {day}, + {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional + seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), + are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone + is required. A proto3 JSON serializer should always use UTC (as indicated by + "Z") when printing the Timestamp type and a proto3 JSON parser should be + able to accept both UTC and other timezones (as indicated by an offset). + + For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past + 01:30 UTC on January 15, 2017. + + In JavaScript, one can convert a Date object to this format using the + standard + [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) + method. In Python, a standard `datetime.datetime` object can be converted + to this format using + [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with + the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use + the Joda Time's [`ISODateTimeFormat.dateTime()`]( + http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime() + ) to obtain a formatter capable of generating timestamps in this format. + format: date-time + type: string + yorkie.v1.Change: + additionalProperties: false + description: "" + properties: + id: + $ref: '#/components/schemas/yorkie.v1.ChangeID' + additionalProperties: false + description: "" + title: id + type: object + message: + additionalProperties: false + description: "" + title: message + type: string + operations: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.Operation' + type: object + title: operations + type: array + presenceChange: + $ref: '#/components/schemas/yorkie.v1.PresenceChange' + additionalProperties: false + description: "" + title: presence_change + type: object + title: Change + type: object + yorkie.v1.ChangeID: + additionalProperties: false + description: "" + properties: + actorId: + additionalProperties: false + description: "" + format: byte + title: actor_id + type: string + clientSeq: + additionalProperties: false + description: "" + title: client_seq + type: integer + lamport: + additionalProperties: false + description: "" + oneOf: + - type: string + - type: number + title: lamport + serverSeq: + additionalProperties: false + description: "" + oneOf: + - type: string + - type: number + title: server_seq + title: ChangeID + type: object + yorkie.v1.ChangePack: + additionalProperties: false + description: |- + ChangePack is a message that contains all changes that occurred in a document. + It is used to synchronize changes between clients and servers. + properties: + changes: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.Change' + type: object + title: changes + type: array + checkpoint: + $ref: '#/components/schemas/yorkie.v1.Checkpoint' + additionalProperties: false + description: "" + title: checkpoint + type: object + documentKey: + additionalProperties: false + description: "" + title: document_key + type: string + isRemoved: + additionalProperties: false + description: "" + title: is_removed + type: boolean + minSyncedTicket: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: min_synced_ticket + type: object + snapshot: + additionalProperties: false + description: "" + format: byte + title: snapshot + type: string + title: ChangePack + type: object + yorkie.v1.Checkpoint: + additionalProperties: false + description: "" + properties: + clientSeq: + additionalProperties: false + description: "" + title: client_seq + type: integer + serverSeq: + additionalProperties: false + description: "" + oneOf: + - type: string + - type: number + title: server_seq + title: Checkpoint + type: object + yorkie.v1.DocEvent: + additionalProperties: false + description: "" + properties: + body: + $ref: '#/components/schemas/yorkie.v1.DocEventBody' + additionalProperties: false + description: "" + title: body + type: object + publisher: + additionalProperties: false + description: "" + title: publisher + type: string + type: + $ref: '#/components/schemas/yorkie.v1.DocEventType' + additionalProperties: false + description: "" + title: type + title: DocEvent + type: object + yorkie.v1.DocEventBody: + additionalProperties: false + description: "" + properties: + payload: + additionalProperties: false + description: "" + format: byte + title: payload + type: string + topic: + additionalProperties: false + description: "" + title: topic + type: string + title: DocEventBody + type: object + yorkie.v1.DocEventType: + description: "" + enum: + - - DOC_EVENT_TYPE_DOCUMENT_CHANGED + - 0 + - DOC_EVENT_TYPE_DOCUMENT_WATCHED + - 1 + - DOC_EVENT_TYPE_DOCUMENT_UNWATCHED + - 2 + - DOC_EVENT_TYPE_DOCUMENT_BROADCAST + - 3 + title: DocEventType + type: string + yorkie.v1.DocumentSummary: + additionalProperties: false + description: "" + properties: + accessedAt: + $ref: '#/components/schemas/google.protobuf.Timestamp' + additionalProperties: false + description: "" + title: accessed_at + type: object + createdAt: + $ref: '#/components/schemas/google.protobuf.Timestamp' + additionalProperties: false + description: "" + title: created_at + type: object + id: + additionalProperties: false + description: "" + title: id + type: string + key: + additionalProperties: false + description: "" + title: key + type: string + snapshot: + additionalProperties: false + description: "" + title: snapshot + type: string + updatedAt: + $ref: '#/components/schemas/google.protobuf.Timestamp' + additionalProperties: false + description: "" + title: updated_at + type: object + title: DocumentSummary + type: object + yorkie.v1.JSONElement: + additionalProperties: false + description: "" + properties: + counter: + $ref: '#/components/schemas/yorkie.v1.JSONElement.Counter' + additionalProperties: false + description: "" + title: counter + type: object + jsonArray: + $ref: '#/components/schemas/yorkie.v1.JSONElement.JSONArray' + additionalProperties: false + description: "" + title: json_array + type: object + jsonObject: + $ref: '#/components/schemas/yorkie.v1.JSONElement.JSONObject' + additionalProperties: false + description: "" + title: json_object + type: object + primitive: + $ref: '#/components/schemas/yorkie.v1.JSONElement.Primitive' + additionalProperties: false + description: "" + title: primitive + type: object + text: + $ref: '#/components/schemas/yorkie.v1.JSONElement.Text' + additionalProperties: false + description: "" + title: text + type: object + tree: + $ref: '#/components/schemas/yorkie.v1.JSONElement.Tree' + additionalProperties: false + description: "" + title: tree + type: object + title: JSONElement + type: object + yorkie.v1.JSONElement.Counter: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + movedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: moved_at + type: object + removedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: removed_at + type: object + type: + $ref: '#/components/schemas/yorkie.v1.ValueType' + additionalProperties: false + description: "" + title: type + value: + additionalProperties: false + description: "" + format: byte + title: value + type: string + title: Counter + type: object + yorkie.v1.JSONElement.JSONArray: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + movedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: moved_at + type: object + nodes: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.RGANode' + type: object + title: nodes + type: array + removedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: removed_at + type: object + title: JSONArray + type: object + yorkie.v1.JSONElement.JSONObject: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + movedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: moved_at + type: object + nodes: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.RHTNode' + type: object + title: nodes + type: array + removedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: removed_at + type: object + title: JSONObject + type: object + yorkie.v1.JSONElement.Primitive: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + movedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: moved_at + type: object + removedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: removed_at + type: object + type: + $ref: '#/components/schemas/yorkie.v1.ValueType' + additionalProperties: false + description: "" + title: type + value: + additionalProperties: false + description: "" + format: byte + title: value + type: string + title: Primitive + type: object + yorkie.v1.JSONElement.Text: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + movedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: moved_at + type: object + nodes: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.TextNode' + type: object + title: nodes + type: array + removedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: removed_at + type: object + title: Text + type: object + yorkie.v1.JSONElement.Tree: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + movedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: moved_at + type: object + nodes: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.TreeNode' + type: object + title: nodes + type: array + removedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: removed_at + type: object + title: Tree + type: object + yorkie.v1.JSONElementSimple: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + movedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: moved_at + type: object + removedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: removed_at + type: object + type: + $ref: '#/components/schemas/yorkie.v1.ValueType' + additionalProperties: false + description: "" + title: type + value: + additionalProperties: false + description: "" + format: byte + title: value + type: string + title: JSONElementSimple + type: object + yorkie.v1.NodeAttr: + additionalProperties: false + description: "" + properties: + isRemoved: + additionalProperties: false + description: "" + title: is_removed + type: boolean + updatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: updated_at + type: object + value: + additionalProperties: false + description: "" + title: value + type: string + title: NodeAttr + type: object + yorkie.v1.Operation: + additionalProperties: false + description: "" + properties: + add: + $ref: '#/components/schemas/yorkie.v1.Operation.Add' + additionalProperties: false + description: "" + title: add + type: object + edit: + $ref: '#/components/schemas/yorkie.v1.Operation.Edit' + additionalProperties: false + description: "" + title: edit + type: object + increase: + $ref: '#/components/schemas/yorkie.v1.Operation.Increase' + additionalProperties: false + description: "" + title: increase + type: object + move: + $ref: '#/components/schemas/yorkie.v1.Operation.Move' + additionalProperties: false + description: "" + title: move + type: object + remove: + $ref: '#/components/schemas/yorkie.v1.Operation.Remove' + additionalProperties: false + description: "" + title: remove + type: object + select: + $ref: '#/components/schemas/yorkie.v1.Operation.Select' + additionalProperties: false + description: "" + title: select + type: object + set: + $ref: '#/components/schemas/yorkie.v1.Operation.Set' + additionalProperties: false + description: "" + title: set + type: object + style: + $ref: '#/components/schemas/yorkie.v1.Operation.Style' + additionalProperties: false + description: "" + title: style + type: object + treeEdit: + $ref: '#/components/schemas/yorkie.v1.Operation.TreeEdit' + additionalProperties: false + description: "" + title: tree_edit + type: object + treeStyle: + $ref: '#/components/schemas/yorkie.v1.Operation.TreeStyle' + additionalProperties: false + description: "" + title: tree_style + type: object + title: Operation + type: object + yorkie.v1.Operation.Add: + additionalProperties: false + description: "" + properties: + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + prevCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: prev_created_at + type: object + value: + $ref: '#/components/schemas/yorkie.v1.JSONElementSimple' + additionalProperties: false + description: "" + title: value + type: object + title: Add + type: object + yorkie.v1.Operation.Edit: + additionalProperties: false + description: "" + properties: + attributes: + additionalProperties: false + description: "" + title: attributes + type: object + content: + additionalProperties: false + description: "" + title: content + type: string + createdAtMapByActor: + additionalProperties: false + description: "" + title: created_at_map_by_actor + type: object + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + from: + $ref: '#/components/schemas/yorkie.v1.TextNodePos' + additionalProperties: false + description: "" + title: from + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + to: + $ref: '#/components/schemas/yorkie.v1.TextNodePos' + additionalProperties: false + description: "" + title: to + type: object + title: Edit + type: object + yorkie.v1.Operation.Edit.AttributesEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + additionalProperties: false + description: "" + title: value + type: string + title: AttributesEntry + type: object + yorkie.v1.Operation.Edit.CreatedAtMapByActorEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: value + type: object + title: CreatedAtMapByActorEntry + type: object + yorkie.v1.Operation.Increase: + additionalProperties: false + description: "" + properties: + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + value: + $ref: '#/components/schemas/yorkie.v1.JSONElementSimple' + additionalProperties: false + description: "" + title: value + type: object + title: Increase + type: object + yorkie.v1.Operation.Move: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + prevCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: prev_created_at + type: object + title: Move + type: object + yorkie.v1.Operation.Remove: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + title: Remove + type: object + yorkie.v1.Operation.Select: + additionalProperties: false + description: |- + NOTE(hackerwins): Select Operation is not used in the current version. + In the previous version, it was used to represent selection of Text. + However, it has been replaced by Presence now. It is retained for backward + compatibility purposes. + properties: + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + from: + $ref: '#/components/schemas/yorkie.v1.TextNodePos' + additionalProperties: false + description: "" + title: from + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + to: + $ref: '#/components/schemas/yorkie.v1.TextNodePos' + additionalProperties: false + description: "" + title: to + type: object + title: Select + type: object + yorkie.v1.Operation.Set: + additionalProperties: false + description: "" + properties: + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + key: + additionalProperties: false + description: "" + title: key + type: string + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + value: + $ref: '#/components/schemas/yorkie.v1.JSONElementSimple' + additionalProperties: false + description: "" + title: value + type: object + title: Set + type: object + yorkie.v1.Operation.Style: + additionalProperties: false + description: "" + properties: + attributes: + additionalProperties: false + description: "" + title: attributes + type: object + createdAtMapByActor: + additionalProperties: false + description: "" + title: created_at_map_by_actor + type: object + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + from: + $ref: '#/components/schemas/yorkie.v1.TextNodePos' + additionalProperties: false + description: "" + title: from + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + to: + $ref: '#/components/schemas/yorkie.v1.TextNodePos' + additionalProperties: false + description: "" + title: to + type: object + title: Style + type: object + yorkie.v1.Operation.Style.AttributesEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + additionalProperties: false + description: "" + title: value + type: string + title: AttributesEntry + type: object + yorkie.v1.Operation.Style.CreatedAtMapByActorEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: value + type: object + title: CreatedAtMapByActorEntry + type: object + yorkie.v1.Operation.TreeEdit: + additionalProperties: false + description: "" + properties: + contents: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.TreeNodes' + type: object + title: contents + type: array + createdAtMapByActor: + additionalProperties: false + description: "" + title: created_at_map_by_actor + type: object + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + from: + $ref: '#/components/schemas/yorkie.v1.TreePos' + additionalProperties: false + description: "" + title: from + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + splitLevel: + additionalProperties: false + description: "" + title: split_level + type: integer + to: + $ref: '#/components/schemas/yorkie.v1.TreePos' + additionalProperties: false + description: "" + title: to + type: object + title: TreeEdit + type: object + yorkie.v1.Operation.TreeEdit.CreatedAtMapByActorEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: value + type: object + title: CreatedAtMapByActorEntry + type: object + yorkie.v1.Operation.TreeStyle: + additionalProperties: false + description: "" + properties: + attributes: + additionalProperties: false + description: "" + title: attributes + type: object + attributesToRemove: + additionalProperties: false + description: "" + items: + type: string + title: attributes_to_remove + type: array + createdAtMapByActor: + additionalProperties: false + description: "" + title: created_at_map_by_actor + type: object + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + from: + $ref: '#/components/schemas/yorkie.v1.TreePos' + additionalProperties: false + description: "" + title: from + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + to: + $ref: '#/components/schemas/yorkie.v1.TreePos' + additionalProperties: false + description: "" + title: to + type: object + title: TreeStyle + type: object + yorkie.v1.Operation.TreeStyle.AttributesEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + additionalProperties: false + description: "" + title: value + type: string + title: AttributesEntry + type: object + yorkie.v1.Operation.TreeStyle.CreatedAtMapByActorEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: value + type: object + title: CreatedAtMapByActorEntry + type: object + yorkie.v1.Presence: + additionalProperties: false + description: "" + properties: + data: + additionalProperties: false + description: "" + title: data + type: object + title: Presence + type: object + yorkie.v1.Presence.DataEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + additionalProperties: false + description: "" + title: value + type: string + title: DataEntry + type: object + yorkie.v1.PresenceChange: + additionalProperties: false + description: "" + properties: + presence: + $ref: '#/components/schemas/yorkie.v1.Presence' + additionalProperties: false + description: "" + title: presence + type: object + type: + $ref: '#/components/schemas/yorkie.v1.PresenceChange.ChangeType' + additionalProperties: false + description: "" + title: type + title: PresenceChange + type: object + yorkie.v1.PresenceChange.ChangeType: + description: "" + enum: + - - CHANGE_TYPE_UNSPECIFIED + - 0 + - CHANGE_TYPE_PUT + - 1 + - CHANGE_TYPE_DELETE + - 2 + - CHANGE_TYPE_CLEAR + - 3 + title: ChangeType + type: string + yorkie.v1.Project: + additionalProperties: false + description: "" + properties: + authWebhookMethods: + additionalProperties: false + description: "" + items: + type: string + title: auth_webhook_methods + type: array + authWebhookUrl: + additionalProperties: false + description: "" + title: auth_webhook_url + type: string + clientDeactivateThreshold: + additionalProperties: false + description: "" + title: client_deactivate_threshold + type: string + createdAt: + $ref: '#/components/schemas/google.protobuf.Timestamp' + additionalProperties: false + description: "" + title: created_at + type: object + id: + additionalProperties: false + description: "" + title: id + type: string + name: + additionalProperties: false + description: "" + title: name + type: string + publicKey: + additionalProperties: false + description: "" + title: public_key + type: string + secretKey: + additionalProperties: false + description: "" + title: secret_key + type: string + updatedAt: + $ref: '#/components/schemas/google.protobuf.Timestamp' + additionalProperties: false + description: "" + title: updated_at + type: object + title: Project + type: object + yorkie.v1.RGANode: + additionalProperties: false + description: "" + properties: + element: + $ref: '#/components/schemas/yorkie.v1.JSONElement' + additionalProperties: false + description: "" + title: element + type: object + next: + $ref: '#/components/schemas/yorkie.v1.RGANode' + additionalProperties: false + description: "" + title: next + type: object + title: RGANode + type: object + yorkie.v1.RHTNode: + additionalProperties: false + description: "" + properties: + element: + $ref: '#/components/schemas/yorkie.v1.JSONElement' + additionalProperties: false + description: "" + title: element + type: object + key: + additionalProperties: false + description: "" + title: key + type: string + title: RHTNode + type: object + yorkie.v1.Snapshot: + additionalProperties: false + description: |- + /////////////////////////////////////// + Messages for Snapshot // + /////////////////////////////////////// + properties: + presences: + additionalProperties: false + description: "" + title: presences + type: object + root: + $ref: '#/components/schemas/yorkie.v1.JSONElement' + additionalProperties: false + description: "" + title: root + type: object + title: Snapshot + type: object + yorkie.v1.Snapshot.PresencesEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + $ref: '#/components/schemas/yorkie.v1.Presence' + additionalProperties: false + description: "" + title: value + type: object + title: PresencesEntry + type: object + yorkie.v1.TextNode: + additionalProperties: false + description: "" + properties: + attributes: + additionalProperties: false + description: "" + title: attributes + type: object + id: + $ref: '#/components/schemas/yorkie.v1.TextNodeID' + additionalProperties: false + description: "" + title: id + type: object + insPrevId: + $ref: '#/components/schemas/yorkie.v1.TextNodeID' + additionalProperties: false + description: "" + title: ins_prev_id + type: object + removedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: removed_at + type: object + value: + additionalProperties: false + description: "" + title: value + type: string + title: TextNode + type: object + yorkie.v1.TextNode.AttributesEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + $ref: '#/components/schemas/yorkie.v1.NodeAttr' + additionalProperties: false + description: "" + title: value + type: object + title: AttributesEntry + type: object + yorkie.v1.TextNodeID: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + offset: + additionalProperties: false + description: "" + title: offset + type: integer + title: TextNodeID + type: object + yorkie.v1.TextNodePos: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + offset: + additionalProperties: false + description: "" + title: offset + type: integer + relativeOffset: + additionalProperties: false + description: "" + title: relative_offset + type: integer + title: TextNodePos + type: object + yorkie.v1.TimeTicket: + additionalProperties: false + description: "" + properties: + actorId: + additionalProperties: false + description: "" + format: byte + title: actor_id + type: string + delimiter: + additionalProperties: false + description: "" + title: delimiter + type: integer + lamport: + additionalProperties: false + description: "" + oneOf: + - type: string + - type: number + title: lamport + title: TimeTicket + type: object + yorkie.v1.TreeNode: + additionalProperties: false + description: "" + properties: + attributes: + additionalProperties: false + description: "" + title: attributes + type: object + depth: + additionalProperties: false + description: "" + title: depth + type: integer + id: + $ref: '#/components/schemas/yorkie.v1.TreeNodeID' + additionalProperties: false + description: "" + title: id + type: object + insNextId: + $ref: '#/components/schemas/yorkie.v1.TreeNodeID' + additionalProperties: false + description: "" + title: ins_next_id + type: object + insPrevId: + $ref: '#/components/schemas/yorkie.v1.TreeNodeID' + additionalProperties: false + description: "" + title: ins_prev_id + type: object + removedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: removed_at + type: object + type: + additionalProperties: false + description: "" + title: type + type: string + value: + additionalProperties: false + description: "" + title: value + type: string + title: TreeNode + type: object + yorkie.v1.TreeNode.AttributesEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + $ref: '#/components/schemas/yorkie.v1.NodeAttr' + additionalProperties: false + description: "" + title: value + type: object + title: AttributesEntry + type: object + yorkie.v1.TreeNodeID: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + offset: + additionalProperties: false + description: "" + title: offset + type: integer + title: TreeNodeID + type: object + yorkie.v1.TreeNodes: + additionalProperties: false + description: "" + properties: + content: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.TreeNode' + type: object + title: content + type: array + title: TreeNodes + type: object + yorkie.v1.TreePos: + additionalProperties: false + description: "" + properties: + leftSiblingId: + $ref: '#/components/schemas/yorkie.v1.TreeNodeID' + additionalProperties: false + description: "" + title: left_sibling_id + type: object + parentId: + $ref: '#/components/schemas/yorkie.v1.TreeNodeID' + additionalProperties: false + description: "" + title: parent_id + type: object + title: TreePos + type: object + yorkie.v1.UpdatableProjectFields: + additionalProperties: false + description: "" + properties: + authWebhookMethods: + $ref: '#/components/schemas/yorkie.v1.UpdatableProjectFields.AuthWebhookMethods' + additionalProperties: false + description: "" + title: auth_webhook_methods + type: object + authWebhookUrl: + $ref: '#/components/schemas/google.protobuf.StringValue' + additionalProperties: false + description: "" + title: auth_webhook_url + type: object + clientDeactivateThreshold: + $ref: '#/components/schemas/google.protobuf.StringValue' + additionalProperties: false + description: "" + title: client_deactivate_threshold + type: object + name: + $ref: '#/components/schemas/google.protobuf.StringValue' + additionalProperties: false + description: "" + title: name + type: object + title: UpdatableProjectFields + type: object + yorkie.v1.UpdatableProjectFields.AuthWebhookMethods: + additionalProperties: false + description: "" + properties: + methods: + additionalProperties: false + description: "" + items: + type: string + title: methods + type: array + title: AuthWebhookMethods + type: object + yorkie.v1.User: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/google.protobuf.Timestamp' + additionalProperties: false + description: "" + title: created_at + type: object + id: + additionalProperties: false + description: "" + title: id + type: string + username: + additionalProperties: false + description: "" + title: username + type: string + title: User + type: object + yorkie.v1.ValueType: + description: "" + enum: + - - VALUE_TYPE_NULL + - 0 + - VALUE_TYPE_BOOLEAN + - 1 + - VALUE_TYPE_INTEGER + - 2 + - VALUE_TYPE_LONG + - 3 + - VALUE_TYPE_DOUBLE + - 4 + - VALUE_TYPE_STRING + - 5 + - VALUE_TYPE_BYTES + - 6 + - VALUE_TYPE_DATE + - 7 + - VALUE_TYPE_JSON_OBJECT + - 8 + - VALUE_TYPE_JSON_ARRAY + - 9 + - VALUE_TYPE_TEXT + - 10 + - VALUE_TYPE_INTEGER_CNT + - 11 + - VALUE_TYPE_LONG_CNT + - 12 + - VALUE_TYPE_TREE + - 13 + title: ValueType + type: string + securitySchemes: + ApiKeyAuth: + in: header + name: Authorization + type: apiKey +security: +- ApiKeyAuth: [] diff --git a/api/docs/yorkie/v1/yorkie.openapi.yaml b/api/docs/yorkie/v1/yorkie.openapi.yaml new file mode 100644 index 000000000..3305cddde --- /dev/null +++ b/api/docs/yorkie/v1/yorkie.openapi.yaml @@ -0,0 +1,1571 @@ +openapi: 3.1.0 +info: + description: Yorkie is an open source document store for building collaborative + editing applications. + title: Yorkie + version: v0.4.27 +servers: +- description: Production server + url: https://api.yorkie.dev +- description: Local server + url: http://localhost:8080 +paths: + /yorkie.v1.YorkieService/ActivateClient: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.YorkieService.ActivateClient.yorkie.v1.ActivateClientRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.YorkieService.ActivateClient.yorkie.v1.ActivateClientResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.YorkieService + /yorkie.v1.YorkieService/AttachDocument: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.YorkieService.AttachDocument.yorkie.v1.AttachDocumentRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.YorkieService.AttachDocument.yorkie.v1.AttachDocumentResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.YorkieService + /yorkie.v1.YorkieService/Broadcast: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.YorkieService.Broadcast.yorkie.v1.BroadcastRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.YorkieService.Broadcast.yorkie.v1.BroadcastResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.YorkieService + /yorkie.v1.YorkieService/DeactivateClient: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.YorkieService.DeactivateClient.yorkie.v1.DeactivateClientRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.YorkieService.DeactivateClient.yorkie.v1.DeactivateClientResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.YorkieService + /yorkie.v1.YorkieService/DetachDocument: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.YorkieService.DetachDocument.yorkie.v1.DetachDocumentRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.YorkieService.DetachDocument.yorkie.v1.DetachDocumentResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.YorkieService + /yorkie.v1.YorkieService/PushPullChanges: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.YorkieService.PushPullChanges.yorkie.v1.PushPullChangesRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.YorkieService.PushPullChanges.yorkie.v1.PushPullChangesResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.YorkieService + /yorkie.v1.YorkieService/RemoveDocument: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.YorkieService.RemoveDocument.yorkie.v1.RemoveDocumentRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.YorkieService.RemoveDocument.yorkie.v1.RemoveDocumentResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.YorkieService + /yorkie.v1.YorkieService/WatchDocument: + post: + description: "" + requestBody: + $ref: '#/components/requestBodies/yorkie.v1.YorkieService.WatchDocument.yorkie.v1.WatchDocumentRequest' + responses: + "200": + $ref: '#/components/responses/yorkie.v1.YorkieService.WatchDocument.yorkie.v1.WatchDocumentResponse' + default: + $ref: '#/components/responses/connect.error' + tags: + - yorkie.v1.YorkieService +components: + requestBodies: + yorkie.v1.YorkieService.ActivateClient.yorkie.v1.ActivateClientRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.ActivateClientRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.ActivateClientRequest' + required: true + yorkie.v1.YorkieService.AttachDocument.yorkie.v1.AttachDocumentRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.AttachDocumentRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.AttachDocumentRequest' + required: true + yorkie.v1.YorkieService.Broadcast.yorkie.v1.BroadcastRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.BroadcastRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.BroadcastRequest' + required: true + yorkie.v1.YorkieService.DeactivateClient.yorkie.v1.DeactivateClientRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.DeactivateClientRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.DeactivateClientRequest' + required: true + yorkie.v1.YorkieService.DetachDocument.yorkie.v1.DetachDocumentRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.DetachDocumentRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.DetachDocumentRequest' + required: true + yorkie.v1.YorkieService.PushPullChanges.yorkie.v1.PushPullChangesRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.PushPullChangesRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.PushPullChangesRequest' + required: true + yorkie.v1.YorkieService.RemoveDocument.yorkie.v1.RemoveDocumentRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.RemoveDocumentRequest' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.RemoveDocumentRequest' + required: true + yorkie.v1.YorkieService.WatchDocument.yorkie.v1.WatchDocumentRequest: + content: {} + required: true + responses: + connect.error: + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + application/proto: + schema: + $ref: '#/components/schemas/connect.error' + description: "" + yorkie.v1.YorkieService.ActivateClient.yorkie.v1.ActivateClientResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.ActivateClientResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.ActivateClientResponse' + description: "" + yorkie.v1.YorkieService.AttachDocument.yorkie.v1.AttachDocumentResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.AttachDocumentResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.AttachDocumentResponse' + description: "" + yorkie.v1.YorkieService.Broadcast.yorkie.v1.BroadcastResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.BroadcastResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.BroadcastResponse' + description: "" + yorkie.v1.YorkieService.DeactivateClient.yorkie.v1.DeactivateClientResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.DeactivateClientResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.DeactivateClientResponse' + description: "" + yorkie.v1.YorkieService.DetachDocument.yorkie.v1.DetachDocumentResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.DetachDocumentResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.DetachDocumentResponse' + description: "" + yorkie.v1.YorkieService.PushPullChanges.yorkie.v1.PushPullChangesResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.PushPullChangesResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.PushPullChangesResponse' + description: "" + yorkie.v1.YorkieService.RemoveDocument.yorkie.v1.RemoveDocumentResponse: + content: + application/json: + schema: + $ref: '#/components/schemas/yorkie.v1.RemoveDocumentResponse' + application/proto: + schema: + $ref: '#/components/schemas/yorkie.v1.RemoveDocumentResponse' + description: "" + yorkie.v1.YorkieService.WatchDocument.yorkie.v1.WatchDocumentResponse: + description: "" + schemas: + connect.error: + additionalProperties: false + description: 'Error type returned by Connect: https://connectrpc.com/docs/go/errors/#http-representation' + properties: + code: + enum: + - CodeCanceled + - CodeUnknown + - CodeInvalidArgument + - CodeDeadlineExceeded + - CodeNotFound + - CodeAlreadyExists + - CodePermissionDenied + - CodeResourceExhausted + - CodeFailedPrecondition + - CodeAborted + - CodeOutOfRange + - CodeInternal + - CodeUnavailable + - CodeDataLoss + - CodeUnauthenticated + examples: + - CodeNotFound + type: string + message: + type: string + title: Connect Error + type: object + yorkie.v1.ActivateClientRequest: + additionalProperties: false + description: "" + properties: + clientKey: + additionalProperties: false + description: "" + title: client_key + type: string + title: ActivateClientRequest + type: object + yorkie.v1.ActivateClientResponse: + additionalProperties: false + description: "" + properties: + clientId: + additionalProperties: false + description: "" + title: client_id + type: string + title: ActivateClientResponse + type: object + yorkie.v1.AttachDocumentRequest: + additionalProperties: false + description: "" + properties: + changePack: + $ref: '#/components/schemas/yorkie.v1.ChangePack' + additionalProperties: false + description: "" + title: change_pack + type: object + clientId: + additionalProperties: false + description: "" + title: client_id + type: string + title: AttachDocumentRequest + type: object + yorkie.v1.AttachDocumentResponse: + additionalProperties: false + description: "" + properties: + changePack: + $ref: '#/components/schemas/yorkie.v1.ChangePack' + additionalProperties: false + description: "" + title: change_pack + type: object + documentId: + additionalProperties: false + description: "" + title: document_id + type: string + title: AttachDocumentResponse + type: object + yorkie.v1.BroadcastRequest: + additionalProperties: false + description: "" + properties: + clientId: + additionalProperties: false + description: "" + title: client_id + type: string + documentId: + additionalProperties: false + description: "" + title: document_id + type: string + payload: + additionalProperties: false + description: "" + format: byte + title: payload + type: string + topic: + additionalProperties: false + description: "" + title: topic + type: string + title: BroadcastRequest + type: object + yorkie.v1.BroadcastResponse: + additionalProperties: false + description: "" + title: BroadcastResponse + type: object + yorkie.v1.Change: + additionalProperties: false + description: "" + properties: + id: + $ref: '#/components/schemas/yorkie.v1.ChangeID' + additionalProperties: false + description: "" + title: id + type: object + message: + additionalProperties: false + description: "" + title: message + type: string + operations: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.Operation' + type: object + title: operations + type: array + presenceChange: + $ref: '#/components/schemas/yorkie.v1.PresenceChange' + additionalProperties: false + description: "" + title: presence_change + type: object + title: Change + type: object + yorkie.v1.ChangeID: + additionalProperties: false + description: "" + properties: + actorId: + additionalProperties: false + description: "" + format: byte + title: actor_id + type: string + clientSeq: + additionalProperties: false + description: "" + title: client_seq + type: integer + lamport: + additionalProperties: false + description: "" + oneOf: + - type: string + - type: number + title: lamport + serverSeq: + additionalProperties: false + description: "" + oneOf: + - type: string + - type: number + title: server_seq + title: ChangeID + type: object + yorkie.v1.ChangePack: + additionalProperties: false + description: |- + ChangePack is a message that contains all changes that occurred in a document. + It is used to synchronize changes between clients and servers. + properties: + changes: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.Change' + type: object + title: changes + type: array + checkpoint: + $ref: '#/components/schemas/yorkie.v1.Checkpoint' + additionalProperties: false + description: "" + title: checkpoint + type: object + documentKey: + additionalProperties: false + description: "" + title: document_key + type: string + isRemoved: + additionalProperties: false + description: "" + title: is_removed + type: boolean + minSyncedTicket: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: min_synced_ticket + type: object + snapshot: + additionalProperties: false + description: "" + format: byte + title: snapshot + type: string + title: ChangePack + type: object + yorkie.v1.Checkpoint: + additionalProperties: false + description: "" + properties: + clientSeq: + additionalProperties: false + description: "" + title: client_seq + type: integer + serverSeq: + additionalProperties: false + description: "" + oneOf: + - type: string + - type: number + title: server_seq + title: Checkpoint + type: object + yorkie.v1.DeactivateClientRequest: + additionalProperties: false + description: "" + properties: + clientId: + additionalProperties: false + description: "" + title: client_id + type: string + title: DeactivateClientRequest + type: object + yorkie.v1.DeactivateClientResponse: + additionalProperties: false + description: "" + title: DeactivateClientResponse + type: object + yorkie.v1.DetachDocumentRequest: + additionalProperties: false + description: "" + properties: + changePack: + $ref: '#/components/schemas/yorkie.v1.ChangePack' + additionalProperties: false + description: "" + title: change_pack + type: object + clientId: + additionalProperties: false + description: "" + title: client_id + type: string + documentId: + additionalProperties: false + description: "" + title: document_id + type: string + removeIfNotAttached: + additionalProperties: false + description: "" + title: remove_if_not_attached + type: boolean + title: DetachDocumentRequest + type: object + yorkie.v1.DetachDocumentResponse: + additionalProperties: false + description: "" + properties: + changePack: + $ref: '#/components/schemas/yorkie.v1.ChangePack' + additionalProperties: false + description: "" + title: change_pack + type: object + title: DetachDocumentResponse + type: object + yorkie.v1.DocEvent: + additionalProperties: false + description: "" + properties: + body: + $ref: '#/components/schemas/yorkie.v1.DocEventBody' + additionalProperties: false + description: "" + title: body + type: object + publisher: + additionalProperties: false + description: "" + title: publisher + type: string + type: + $ref: '#/components/schemas/yorkie.v1.DocEventType' + additionalProperties: false + description: "" + title: type + title: DocEvent + type: object + yorkie.v1.DocEventBody: + additionalProperties: false + description: "" + properties: + payload: + additionalProperties: false + description: "" + format: byte + title: payload + type: string + topic: + additionalProperties: false + description: "" + title: topic + type: string + title: DocEventBody + type: object + yorkie.v1.DocEventType: + description: "" + enum: + - - DOC_EVENT_TYPE_DOCUMENT_CHANGED + - 0 + - DOC_EVENT_TYPE_DOCUMENT_WATCHED + - 1 + - DOC_EVENT_TYPE_DOCUMENT_UNWATCHED + - 2 + - DOC_EVENT_TYPE_DOCUMENT_BROADCAST + - 3 + title: DocEventType + type: string + yorkie.v1.JSONElementSimple: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + movedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: moved_at + type: object + removedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: removed_at + type: object + type: + $ref: '#/components/schemas/yorkie.v1.ValueType' + additionalProperties: false + description: "" + title: type + value: + additionalProperties: false + description: "" + format: byte + title: value + type: string + title: JSONElementSimple + type: object + yorkie.v1.NodeAttr: + additionalProperties: false + description: "" + properties: + isRemoved: + additionalProperties: false + description: "" + title: is_removed + type: boolean + updatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: updated_at + type: object + value: + additionalProperties: false + description: "" + title: value + type: string + title: NodeAttr + type: object + yorkie.v1.Operation: + additionalProperties: false + description: "" + properties: + add: + $ref: '#/components/schemas/yorkie.v1.Operation.Add' + additionalProperties: false + description: "" + title: add + type: object + edit: + $ref: '#/components/schemas/yorkie.v1.Operation.Edit' + additionalProperties: false + description: "" + title: edit + type: object + increase: + $ref: '#/components/schemas/yorkie.v1.Operation.Increase' + additionalProperties: false + description: "" + title: increase + type: object + move: + $ref: '#/components/schemas/yorkie.v1.Operation.Move' + additionalProperties: false + description: "" + title: move + type: object + remove: + $ref: '#/components/schemas/yorkie.v1.Operation.Remove' + additionalProperties: false + description: "" + title: remove + type: object + select: + $ref: '#/components/schemas/yorkie.v1.Operation.Select' + additionalProperties: false + description: "" + title: select + type: object + set: + $ref: '#/components/schemas/yorkie.v1.Operation.Set' + additionalProperties: false + description: "" + title: set + type: object + style: + $ref: '#/components/schemas/yorkie.v1.Operation.Style' + additionalProperties: false + description: "" + title: style + type: object + treeEdit: + $ref: '#/components/schemas/yorkie.v1.Operation.TreeEdit' + additionalProperties: false + description: "" + title: tree_edit + type: object + treeStyle: + $ref: '#/components/schemas/yorkie.v1.Operation.TreeStyle' + additionalProperties: false + description: "" + title: tree_style + type: object + title: Operation + type: object + yorkie.v1.Operation.Add: + additionalProperties: false + description: "" + properties: + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + prevCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: prev_created_at + type: object + value: + $ref: '#/components/schemas/yorkie.v1.JSONElementSimple' + additionalProperties: false + description: "" + title: value + type: object + title: Add + type: object + yorkie.v1.Operation.Edit: + additionalProperties: false + description: "" + properties: + attributes: + additionalProperties: false + description: "" + title: attributes + type: object + content: + additionalProperties: false + description: "" + title: content + type: string + createdAtMapByActor: + additionalProperties: false + description: "" + title: created_at_map_by_actor + type: object + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + from: + $ref: '#/components/schemas/yorkie.v1.TextNodePos' + additionalProperties: false + description: "" + title: from + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + to: + $ref: '#/components/schemas/yorkie.v1.TextNodePos' + additionalProperties: false + description: "" + title: to + type: object + title: Edit + type: object + yorkie.v1.Operation.Edit.AttributesEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + additionalProperties: false + description: "" + title: value + type: string + title: AttributesEntry + type: object + yorkie.v1.Operation.Edit.CreatedAtMapByActorEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: value + type: object + title: CreatedAtMapByActorEntry + type: object + yorkie.v1.Operation.Increase: + additionalProperties: false + description: "" + properties: + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + value: + $ref: '#/components/schemas/yorkie.v1.JSONElementSimple' + additionalProperties: false + description: "" + title: value + type: object + title: Increase + type: object + yorkie.v1.Operation.Move: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + prevCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: prev_created_at + type: object + title: Move + type: object + yorkie.v1.Operation.Remove: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + title: Remove + type: object + yorkie.v1.Operation.Select: + additionalProperties: false + description: |- + NOTE(hackerwins): Select Operation is not used in the current version. + In the previous version, it was used to represent selection of Text. + However, it has been replaced by Presence now. It is retained for backward + compatibility purposes. + properties: + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + from: + $ref: '#/components/schemas/yorkie.v1.TextNodePos' + additionalProperties: false + description: "" + title: from + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + to: + $ref: '#/components/schemas/yorkie.v1.TextNodePos' + additionalProperties: false + description: "" + title: to + type: object + title: Select + type: object + yorkie.v1.Operation.Set: + additionalProperties: false + description: "" + properties: + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + key: + additionalProperties: false + description: "" + title: key + type: string + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + value: + $ref: '#/components/schemas/yorkie.v1.JSONElementSimple' + additionalProperties: false + description: "" + title: value + type: object + title: Set + type: object + yorkie.v1.Operation.Style: + additionalProperties: false + description: "" + properties: + attributes: + additionalProperties: false + description: "" + title: attributes + type: object + createdAtMapByActor: + additionalProperties: false + description: "" + title: created_at_map_by_actor + type: object + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + from: + $ref: '#/components/schemas/yorkie.v1.TextNodePos' + additionalProperties: false + description: "" + title: from + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + to: + $ref: '#/components/schemas/yorkie.v1.TextNodePos' + additionalProperties: false + description: "" + title: to + type: object + title: Style + type: object + yorkie.v1.Operation.Style.AttributesEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + additionalProperties: false + description: "" + title: value + type: string + title: AttributesEntry + type: object + yorkie.v1.Operation.Style.CreatedAtMapByActorEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: value + type: object + title: CreatedAtMapByActorEntry + type: object + yorkie.v1.Operation.TreeEdit: + additionalProperties: false + description: "" + properties: + contents: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.TreeNodes' + type: object + title: contents + type: array + createdAtMapByActor: + additionalProperties: false + description: "" + title: created_at_map_by_actor + type: object + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + from: + $ref: '#/components/schemas/yorkie.v1.TreePos' + additionalProperties: false + description: "" + title: from + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + splitLevel: + additionalProperties: false + description: "" + title: split_level + type: integer + to: + $ref: '#/components/schemas/yorkie.v1.TreePos' + additionalProperties: false + description: "" + title: to + type: object + title: TreeEdit + type: object + yorkie.v1.Operation.TreeEdit.CreatedAtMapByActorEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: value + type: object + title: CreatedAtMapByActorEntry + type: object + yorkie.v1.Operation.TreeStyle: + additionalProperties: false + description: "" + properties: + attributes: + additionalProperties: false + description: "" + title: attributes + type: object + attributesToRemove: + additionalProperties: false + description: "" + items: + type: string + title: attributes_to_remove + type: array + createdAtMapByActor: + additionalProperties: false + description: "" + title: created_at_map_by_actor + type: object + executedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: executed_at + type: object + from: + $ref: '#/components/schemas/yorkie.v1.TreePos' + additionalProperties: false + description: "" + title: from + type: object + parentCreatedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: parent_created_at + type: object + to: + $ref: '#/components/schemas/yorkie.v1.TreePos' + additionalProperties: false + description: "" + title: to + type: object + title: TreeStyle + type: object + yorkie.v1.Operation.TreeStyle.AttributesEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + additionalProperties: false + description: "" + title: value + type: string + title: AttributesEntry + type: object + yorkie.v1.Operation.TreeStyle.CreatedAtMapByActorEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: value + type: object + title: CreatedAtMapByActorEntry + type: object + yorkie.v1.Presence: + additionalProperties: false + description: "" + properties: + data: + additionalProperties: false + description: "" + title: data + type: object + title: Presence + type: object + yorkie.v1.Presence.DataEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + additionalProperties: false + description: "" + title: value + type: string + title: DataEntry + type: object + yorkie.v1.PresenceChange: + additionalProperties: false + description: "" + properties: + presence: + $ref: '#/components/schemas/yorkie.v1.Presence' + additionalProperties: false + description: "" + title: presence + type: object + type: + $ref: '#/components/schemas/yorkie.v1.PresenceChange.ChangeType' + additionalProperties: false + description: "" + title: type + title: PresenceChange + type: object + yorkie.v1.PresenceChange.ChangeType: + description: "" + enum: + - - CHANGE_TYPE_UNSPECIFIED + - 0 + - CHANGE_TYPE_PUT + - 1 + - CHANGE_TYPE_DELETE + - 2 + - CHANGE_TYPE_CLEAR + - 3 + title: ChangeType + type: string + yorkie.v1.PushPullChangesRequest: + additionalProperties: false + description: "" + properties: + changePack: + $ref: '#/components/schemas/yorkie.v1.ChangePack' + additionalProperties: false + description: "" + title: change_pack + type: object + clientId: + additionalProperties: false + description: "" + title: client_id + type: string + documentId: + additionalProperties: false + description: "" + title: document_id + type: string + pushOnly: + additionalProperties: false + description: "" + title: push_only + type: boolean + title: PushPullChangesRequest + type: object + yorkie.v1.PushPullChangesResponse: + additionalProperties: false + description: "" + properties: + changePack: + $ref: '#/components/schemas/yorkie.v1.ChangePack' + additionalProperties: false + description: "" + title: change_pack + type: object + title: PushPullChangesResponse + type: object + yorkie.v1.RemoveDocumentRequest: + additionalProperties: false + description: "" + properties: + changePack: + $ref: '#/components/schemas/yorkie.v1.ChangePack' + additionalProperties: false + description: "" + title: change_pack + type: object + clientId: + additionalProperties: false + description: "" + title: client_id + type: string + documentId: + additionalProperties: false + description: "" + title: document_id + type: string + title: RemoveDocumentRequest + type: object + yorkie.v1.RemoveDocumentResponse: + additionalProperties: false + description: "" + properties: + changePack: + $ref: '#/components/schemas/yorkie.v1.ChangePack' + additionalProperties: false + description: "" + title: change_pack + type: object + title: RemoveDocumentResponse + type: object + yorkie.v1.TextNodePos: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + offset: + additionalProperties: false + description: "" + title: offset + type: integer + relativeOffset: + additionalProperties: false + description: "" + title: relative_offset + type: integer + title: TextNodePos + type: object + yorkie.v1.TimeTicket: + additionalProperties: false + description: "" + properties: + actorId: + additionalProperties: false + description: "" + format: byte + title: actor_id + type: string + delimiter: + additionalProperties: false + description: "" + title: delimiter + type: integer + lamport: + additionalProperties: false + description: "" + oneOf: + - type: string + - type: number + title: lamport + title: TimeTicket + type: object + yorkie.v1.TreeNode: + additionalProperties: false + description: "" + properties: + attributes: + additionalProperties: false + description: "" + title: attributes + type: object + depth: + additionalProperties: false + description: "" + title: depth + type: integer + id: + $ref: '#/components/schemas/yorkie.v1.TreeNodeID' + additionalProperties: false + description: "" + title: id + type: object + insNextId: + $ref: '#/components/schemas/yorkie.v1.TreeNodeID' + additionalProperties: false + description: "" + title: ins_next_id + type: object + insPrevId: + $ref: '#/components/schemas/yorkie.v1.TreeNodeID' + additionalProperties: false + description: "" + title: ins_prev_id + type: object + removedAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: removed_at + type: object + type: + additionalProperties: false + description: "" + title: type + type: string + value: + additionalProperties: false + description: "" + title: value + type: string + title: TreeNode + type: object + yorkie.v1.TreeNode.AttributesEntry: + additionalProperties: false + description: "" + properties: + key: + additionalProperties: false + description: "" + title: key + type: string + value: + $ref: '#/components/schemas/yorkie.v1.NodeAttr' + additionalProperties: false + description: "" + title: value + type: object + title: AttributesEntry + type: object + yorkie.v1.TreeNodeID: + additionalProperties: false + description: "" + properties: + createdAt: + $ref: '#/components/schemas/yorkie.v1.TimeTicket' + additionalProperties: false + description: "" + title: created_at + type: object + offset: + additionalProperties: false + description: "" + title: offset + type: integer + title: TreeNodeID + type: object + yorkie.v1.TreeNodes: + additionalProperties: false + description: "" + properties: + content: + additionalProperties: false + description: "" + items: + $ref: '#/components/schemas/yorkie.v1.TreeNode' + type: object + title: content + type: array + title: TreeNodes + type: object + yorkie.v1.TreePos: + additionalProperties: false + description: "" + properties: + leftSiblingId: + $ref: '#/components/schemas/yorkie.v1.TreeNodeID' + additionalProperties: false + description: "" + title: left_sibling_id + type: object + parentId: + $ref: '#/components/schemas/yorkie.v1.TreeNodeID' + additionalProperties: false + description: "" + title: parent_id + type: object + title: TreePos + type: object + yorkie.v1.ValueType: + description: "" + enum: + - - VALUE_TYPE_NULL + - 0 + - VALUE_TYPE_BOOLEAN + - 1 + - VALUE_TYPE_INTEGER + - 2 + - VALUE_TYPE_LONG + - 3 + - VALUE_TYPE_DOUBLE + - 4 + - VALUE_TYPE_STRING + - 5 + - VALUE_TYPE_BYTES + - 6 + - VALUE_TYPE_DATE + - 7 + - VALUE_TYPE_JSON_OBJECT + - 8 + - VALUE_TYPE_JSON_ARRAY + - 9 + - VALUE_TYPE_TEXT + - 10 + - VALUE_TYPE_INTEGER_CNT + - 11 + - VALUE_TYPE_LONG_CNT + - 12 + - VALUE_TYPE_TREE + - 13 + title: ValueType + type: string + yorkie.v1.WatchDocumentRequest: + additionalProperties: false + description: "" + properties: + clientId: + additionalProperties: false + description: "" + title: client_id + type: string + documentId: + additionalProperties: false + description: "" + title: document_id + type: string + title: WatchDocumentRequest + type: object + yorkie.v1.WatchDocumentResponse: + additionalProperties: false + description: "" + properties: + event: + $ref: '#/components/schemas/yorkie.v1.DocEvent' + additionalProperties: false + description: "" + title: event + type: object + initialization: + $ref: '#/components/schemas/yorkie.v1.WatchDocumentResponse.Initialization' + additionalProperties: false + description: "" + title: initialization + type: object + title: WatchDocumentResponse + type: object + yorkie.v1.WatchDocumentResponse.Initialization: + additionalProperties: false + description: "" + properties: + clientIds: + additionalProperties: false + description: "" + items: + type: string + title: client_ids + type: array + title: Initialization + type: object + securitySchemes: + ApiKeyAuth: + in: header + name: Authorization + type: apiKey +security: +- ApiKeyAuth: [] +tags: +- description: Yorkie is a service that provides a API for SDKs. + name: yorkie.v1.YorkieService diff --git a/api/yorkie/v1/admin.pb.go b/api/yorkie/v1/admin.pb.go index 7ff402031..ace02635d 100644 --- a/api/yorkie/v1/admin.pb.go +++ b/api/yorkie/v1/admin.pb.go @@ -842,6 +842,116 @@ func (x *GetDocumentResponse) GetDocument() *DocumentSummary { return nil } +type GetDocumentsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + DocumentKeys []string `protobuf:"bytes,2,rep,name=document_keys,json=documentKeys,proto3" json:"document_keys,omitempty"` + IncludeSnapshot bool `protobuf:"varint,3,opt,name=include_snapshot,json=includeSnapshot,proto3" json:"include_snapshot,omitempty"` +} + +func (x *GetDocumentsRequest) Reset() { + *x = GetDocumentsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_yorkie_v1_admin_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetDocumentsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetDocumentsRequest) ProtoMessage() {} + +func (x *GetDocumentsRequest) ProtoReflect() protoreflect.Message { + mi := &file_yorkie_v1_admin_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetDocumentsRequest.ProtoReflect.Descriptor instead. +func (*GetDocumentsRequest) Descriptor() ([]byte, []int) { + return file_yorkie_v1_admin_proto_rawDescGZIP(), []int{16} +} + +func (x *GetDocumentsRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *GetDocumentsRequest) GetDocumentKeys() []string { + if x != nil { + return x.DocumentKeys + } + return nil +} + +func (x *GetDocumentsRequest) GetIncludeSnapshot() bool { + if x != nil { + return x.IncludeSnapshot + } + return false +} + +type GetDocumentsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Documents []*DocumentSummary `protobuf:"bytes,1,rep,name=documents,proto3" json:"documents,omitempty"` +} + +func (x *GetDocumentsResponse) Reset() { + *x = GetDocumentsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_yorkie_v1_admin_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetDocumentsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetDocumentsResponse) ProtoMessage() {} + +func (x *GetDocumentsResponse) ProtoReflect() protoreflect.Message { + mi := &file_yorkie_v1_admin_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetDocumentsResponse.ProtoReflect.Descriptor instead. +func (*GetDocumentsResponse) Descriptor() ([]byte, []int) { + return file_yorkie_v1_admin_proto_rawDescGZIP(), []int{17} +} + +func (x *GetDocumentsResponse) GetDocuments() []*DocumentSummary { + if x != nil { + return x.Documents + } + return nil +} + type RemoveDocumentByAdminRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -855,7 +965,7 @@ type RemoveDocumentByAdminRequest struct { func (x *RemoveDocumentByAdminRequest) Reset() { *x = RemoveDocumentByAdminRequest{} if protoimpl.UnsafeEnabled { - mi := &file_yorkie_v1_admin_proto_msgTypes[16] + mi := &file_yorkie_v1_admin_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -868,7 +978,7 @@ func (x *RemoveDocumentByAdminRequest) String() string { func (*RemoveDocumentByAdminRequest) ProtoMessage() {} func (x *RemoveDocumentByAdminRequest) ProtoReflect() protoreflect.Message { - mi := &file_yorkie_v1_admin_proto_msgTypes[16] + mi := &file_yorkie_v1_admin_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -881,7 +991,7 @@ func (x *RemoveDocumentByAdminRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveDocumentByAdminRequest.ProtoReflect.Descriptor instead. func (*RemoveDocumentByAdminRequest) Descriptor() ([]byte, []int) { - return file_yorkie_v1_admin_proto_rawDescGZIP(), []int{16} + return file_yorkie_v1_admin_proto_rawDescGZIP(), []int{18} } func (x *RemoveDocumentByAdminRequest) GetProjectName() string { @@ -914,7 +1024,7 @@ type RemoveDocumentByAdminResponse struct { func (x *RemoveDocumentByAdminResponse) Reset() { *x = RemoveDocumentByAdminResponse{} if protoimpl.UnsafeEnabled { - mi := &file_yorkie_v1_admin_proto_msgTypes[17] + mi := &file_yorkie_v1_admin_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -927,7 +1037,7 @@ func (x *RemoveDocumentByAdminResponse) String() string { func (*RemoveDocumentByAdminResponse) ProtoMessage() {} func (x *RemoveDocumentByAdminResponse) ProtoReflect() protoreflect.Message { - mi := &file_yorkie_v1_admin_proto_msgTypes[17] + mi := &file_yorkie_v1_admin_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -940,7 +1050,7 @@ func (x *RemoveDocumentByAdminResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveDocumentByAdminResponse.ProtoReflect.Descriptor instead. func (*RemoveDocumentByAdminResponse) Descriptor() ([]byte, []int) { - return file_yorkie_v1_admin_proto_rawDescGZIP(), []int{17} + return file_yorkie_v1_admin_proto_rawDescGZIP(), []int{19} } type GetSnapshotMetaRequest struct { @@ -956,7 +1066,7 @@ type GetSnapshotMetaRequest struct { func (x *GetSnapshotMetaRequest) Reset() { *x = GetSnapshotMetaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_yorkie_v1_admin_proto_msgTypes[18] + mi := &file_yorkie_v1_admin_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -969,7 +1079,7 @@ func (x *GetSnapshotMetaRequest) String() string { func (*GetSnapshotMetaRequest) ProtoMessage() {} func (x *GetSnapshotMetaRequest) ProtoReflect() protoreflect.Message { - mi := &file_yorkie_v1_admin_proto_msgTypes[18] + mi := &file_yorkie_v1_admin_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -982,7 +1092,7 @@ func (x *GetSnapshotMetaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSnapshotMetaRequest.ProtoReflect.Descriptor instead. func (*GetSnapshotMetaRequest) Descriptor() ([]byte, []int) { - return file_yorkie_v1_admin_proto_rawDescGZIP(), []int{18} + return file_yorkie_v1_admin_proto_rawDescGZIP(), []int{20} } func (x *GetSnapshotMetaRequest) GetProjectName() string { @@ -1018,7 +1128,7 @@ type GetSnapshotMetaResponse struct { func (x *GetSnapshotMetaResponse) Reset() { *x = GetSnapshotMetaResponse{} if protoimpl.UnsafeEnabled { - mi := &file_yorkie_v1_admin_proto_msgTypes[19] + mi := &file_yorkie_v1_admin_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1031,7 +1141,7 @@ func (x *GetSnapshotMetaResponse) String() string { func (*GetSnapshotMetaResponse) ProtoMessage() {} func (x *GetSnapshotMetaResponse) ProtoReflect() protoreflect.Message { - mi := &file_yorkie_v1_admin_proto_msgTypes[19] + mi := &file_yorkie_v1_admin_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1044,7 +1154,7 @@ func (x *GetSnapshotMetaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSnapshotMetaResponse.ProtoReflect.Descriptor instead. func (*GetSnapshotMetaResponse) Descriptor() ([]byte, []int) { - return file_yorkie_v1_admin_proto_rawDescGZIP(), []int{19} + return file_yorkie_v1_admin_proto_rawDescGZIP(), []int{21} } func (x *GetSnapshotMetaResponse) GetSnapshot() []byte { @@ -1074,7 +1184,7 @@ type SearchDocumentsRequest struct { func (x *SearchDocumentsRequest) Reset() { *x = SearchDocumentsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_yorkie_v1_admin_proto_msgTypes[20] + mi := &file_yorkie_v1_admin_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1087,7 +1197,7 @@ func (x *SearchDocumentsRequest) String() string { func (*SearchDocumentsRequest) ProtoMessage() {} func (x *SearchDocumentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_yorkie_v1_admin_proto_msgTypes[20] + mi := &file_yorkie_v1_admin_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1100,7 +1210,7 @@ func (x *SearchDocumentsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchDocumentsRequest.ProtoReflect.Descriptor instead. func (*SearchDocumentsRequest) Descriptor() ([]byte, []int) { - return file_yorkie_v1_admin_proto_rawDescGZIP(), []int{20} + return file_yorkie_v1_admin_proto_rawDescGZIP(), []int{22} } func (x *SearchDocumentsRequest) GetProjectName() string { @@ -1136,7 +1246,7 @@ type SearchDocumentsResponse struct { func (x *SearchDocumentsResponse) Reset() { *x = SearchDocumentsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_yorkie_v1_admin_proto_msgTypes[21] + mi := &file_yorkie_v1_admin_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1149,7 +1259,7 @@ func (x *SearchDocumentsResponse) String() string { func (*SearchDocumentsResponse) ProtoMessage() {} func (x *SearchDocumentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_yorkie_v1_admin_proto_msgTypes[21] + mi := &file_yorkie_v1_admin_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1162,7 +1272,7 @@ func (x *SearchDocumentsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchDocumentsResponse.ProtoReflect.Descriptor instead. func (*SearchDocumentsResponse) Descriptor() ([]byte, []int) { - return file_yorkie_v1_admin_proto_rawDescGZIP(), []int{21} + return file_yorkie_v1_admin_proto_rawDescGZIP(), []int{23} } func (x *SearchDocumentsResponse) GetTotalCount() int32 { @@ -1194,7 +1304,7 @@ type ListChangesRequest struct { func (x *ListChangesRequest) Reset() { *x = ListChangesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_yorkie_v1_admin_proto_msgTypes[22] + mi := &file_yorkie_v1_admin_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1207,7 +1317,7 @@ func (x *ListChangesRequest) String() string { func (*ListChangesRequest) ProtoMessage() {} func (x *ListChangesRequest) ProtoReflect() protoreflect.Message { - mi := &file_yorkie_v1_admin_proto_msgTypes[22] + mi := &file_yorkie_v1_admin_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1220,7 +1330,7 @@ func (x *ListChangesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListChangesRequest.ProtoReflect.Descriptor instead. func (*ListChangesRequest) Descriptor() ([]byte, []int) { - return file_yorkie_v1_admin_proto_rawDescGZIP(), []int{22} + return file_yorkie_v1_admin_proto_rawDescGZIP(), []int{24} } func (x *ListChangesRequest) GetProjectName() string { @@ -1269,7 +1379,7 @@ type ListChangesResponse struct { func (x *ListChangesResponse) Reset() { *x = ListChangesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_yorkie_v1_admin_proto_msgTypes[23] + mi := &file_yorkie_v1_admin_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1282,7 +1392,7 @@ func (x *ListChangesResponse) String() string { func (*ListChangesResponse) ProtoMessage() {} func (x *ListChangesResponse) ProtoReflect() protoreflect.Message { - mi := &file_yorkie_v1_admin_proto_msgTypes[23] + mi := &file_yorkie_v1_admin_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1295,7 +1405,7 @@ func (x *ListChangesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListChangesResponse.ProtoReflect.Descriptor instead. func (*ListChangesResponse) Descriptor() ([]byte, []int) { - return file_yorkie_v1_admin_proto_rawDescGZIP(), []int{23} + return file_yorkie_v1_admin_proto_rawDescGZIP(), []int{25} } func (x *ListChangesResponse) GetChanges() []*Change { @@ -1385,100 +1495,119 @@ var file_yorkie_v1_admin_proto_rawDesc = []byte{ 0x36, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x08, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x7a, 0x0a, 0x1c, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x41, 0x64, 0x6d, 0x69, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x88, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x73, 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x30, 0x01, 0x52, 0x09, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x71, 0x22, 0x53, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, - 0x1c, 0x0a, 0x07, 0x6c, 0x61, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x42, 0x02, 0x30, 0x01, 0x52, 0x07, 0x6c, 0x61, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x6e, 0x0a, - 0x16, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, + 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x22, 0x50, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x22, 0x7a, 0x0a, 0x1c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x22, 0x1f, 0x0a, 0x1d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x42, 0x79, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x81, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4b, + 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x71, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x30, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x53, 0x65, 0x71, 0x22, 0x53, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1c, 0x0a, 0x07, + 0x6c, 0x61, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x30, + 0x01, 0x52, 0x07, 0x6c, 0x61, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x6e, 0x0a, 0x16, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1b, 0x0a, + 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x74, 0x0a, 0x17, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x79, 0x6f, 0x72, 0x6b, + 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x22, 0xbd, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x74, 0x0a, - 0x17, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x79, - 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x22, 0xbd, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, - 0x0c, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, - 0x12, 0x25, 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x65, 0x71, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x30, 0x01, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x76, - 0x69, 0x6f, 0x75, 0x73, 0x53, 0x65, 0x71, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x77, 0x61, - 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x46, 0x6f, 0x72, 0x77, - 0x61, 0x72, 0x64, 0x22, 0x42, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x79, 0x6f, - 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x32, 0xf5, 0x07, 0x0a, 0x0c, 0x41, 0x64, 0x6d, 0x69, - 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x53, 0x69, 0x67, 0x6e, - 0x55, 0x70, 0x12, 0x18, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x69, 0x67, 0x6e, 0x55, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x79, - 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x70, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x05, 0x4c, 0x6f, 0x67, - 0x49, 0x6e, 0x12, 0x17, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x79, 0x6f, - 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1f, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x79, 0x6f, 0x72, 0x6b, - 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, - 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x1e, 0x2e, - 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, - 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x4b, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1c, - 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x79, - 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, - 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1f, - 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x47, 0x65, 0x74, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, + 0x0c, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x42, 0x02, 0x30, 0x01, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, + 0x73, 0x53, 0x65, 0x71, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, + 0x22, 0x42, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x32, 0xc8, 0x08, 0x0a, 0x0c, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x70, 0x12, + 0x18, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, + 0x55, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x79, 0x6f, 0x72, 0x6b, + 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x70, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x49, 0x6e, 0x12, + 0x17, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x49, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1f, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x4c, 0x69, + 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x1e, 0x2e, 0x79, 0x6f, 0x72, + 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x79, 0x6f, 0x72, + 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, + 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1c, 0x2e, 0x79, 0x6f, + 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x79, 0x6f, 0x72, 0x6b, + 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1f, 0x2e, 0x79, 0x6f, + 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x79, + 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x54, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x1f, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1e, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x12, 0x27, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, @@ -1522,7 +1651,7 @@ func file_yorkie_v1_admin_proto_rawDescGZIP() []byte { return file_yorkie_v1_admin_proto_rawDescData } -var file_yorkie_v1_admin_proto_msgTypes = make([]protoimpl.MessageInfo, 24) +var file_yorkie_v1_admin_proto_msgTypes = make([]protoimpl.MessageInfo, 26) var file_yorkie_v1_admin_proto_goTypes = []interface{}{ (*SignUpRequest)(nil), // 0: yorkie.v1.SignUpRequest (*SignUpResponse)(nil), // 1: yorkie.v1.SignUpResponse @@ -1540,60 +1669,65 @@ var file_yorkie_v1_admin_proto_goTypes = []interface{}{ (*ListDocumentsResponse)(nil), // 13: yorkie.v1.ListDocumentsResponse (*GetDocumentRequest)(nil), // 14: yorkie.v1.GetDocumentRequest (*GetDocumentResponse)(nil), // 15: yorkie.v1.GetDocumentResponse - (*RemoveDocumentByAdminRequest)(nil), // 16: yorkie.v1.RemoveDocumentByAdminRequest - (*RemoveDocumentByAdminResponse)(nil), // 17: yorkie.v1.RemoveDocumentByAdminResponse - (*GetSnapshotMetaRequest)(nil), // 18: yorkie.v1.GetSnapshotMetaRequest - (*GetSnapshotMetaResponse)(nil), // 19: yorkie.v1.GetSnapshotMetaResponse - (*SearchDocumentsRequest)(nil), // 20: yorkie.v1.SearchDocumentsRequest - (*SearchDocumentsResponse)(nil), // 21: yorkie.v1.SearchDocumentsResponse - (*ListChangesRequest)(nil), // 22: yorkie.v1.ListChangesRequest - (*ListChangesResponse)(nil), // 23: yorkie.v1.ListChangesResponse - (*User)(nil), // 24: yorkie.v1.User - (*Project)(nil), // 25: yorkie.v1.Project - (*UpdatableProjectFields)(nil), // 26: yorkie.v1.UpdatableProjectFields - (*DocumentSummary)(nil), // 27: yorkie.v1.DocumentSummary - (*Change)(nil), // 28: yorkie.v1.Change + (*GetDocumentsRequest)(nil), // 16: yorkie.v1.GetDocumentsRequest + (*GetDocumentsResponse)(nil), // 17: yorkie.v1.GetDocumentsResponse + (*RemoveDocumentByAdminRequest)(nil), // 18: yorkie.v1.RemoveDocumentByAdminRequest + (*RemoveDocumentByAdminResponse)(nil), // 19: yorkie.v1.RemoveDocumentByAdminResponse + (*GetSnapshotMetaRequest)(nil), // 20: yorkie.v1.GetSnapshotMetaRequest + (*GetSnapshotMetaResponse)(nil), // 21: yorkie.v1.GetSnapshotMetaResponse + (*SearchDocumentsRequest)(nil), // 22: yorkie.v1.SearchDocumentsRequest + (*SearchDocumentsResponse)(nil), // 23: yorkie.v1.SearchDocumentsResponse + (*ListChangesRequest)(nil), // 24: yorkie.v1.ListChangesRequest + (*ListChangesResponse)(nil), // 25: yorkie.v1.ListChangesResponse + (*User)(nil), // 26: yorkie.v1.User + (*Project)(nil), // 27: yorkie.v1.Project + (*UpdatableProjectFields)(nil), // 28: yorkie.v1.UpdatableProjectFields + (*DocumentSummary)(nil), // 29: yorkie.v1.DocumentSummary + (*Change)(nil), // 30: yorkie.v1.Change } var file_yorkie_v1_admin_proto_depIdxs = []int32{ - 24, // 0: yorkie.v1.SignUpResponse.user:type_name -> yorkie.v1.User - 25, // 1: yorkie.v1.CreateProjectResponse.project:type_name -> yorkie.v1.Project - 25, // 2: yorkie.v1.GetProjectResponse.project:type_name -> yorkie.v1.Project - 25, // 3: yorkie.v1.ListProjectsResponse.projects:type_name -> yorkie.v1.Project - 26, // 4: yorkie.v1.UpdateProjectRequest.fields:type_name -> yorkie.v1.UpdatableProjectFields - 25, // 5: yorkie.v1.UpdateProjectResponse.project:type_name -> yorkie.v1.Project - 27, // 6: yorkie.v1.ListDocumentsResponse.documents:type_name -> yorkie.v1.DocumentSummary - 27, // 7: yorkie.v1.GetDocumentResponse.document:type_name -> yorkie.v1.DocumentSummary - 27, // 8: yorkie.v1.SearchDocumentsResponse.documents:type_name -> yorkie.v1.DocumentSummary - 28, // 9: yorkie.v1.ListChangesResponse.changes:type_name -> yorkie.v1.Change - 0, // 10: yorkie.v1.AdminService.SignUp:input_type -> yorkie.v1.SignUpRequest - 2, // 11: yorkie.v1.AdminService.LogIn:input_type -> yorkie.v1.LogInRequest - 4, // 12: yorkie.v1.AdminService.CreateProject:input_type -> yorkie.v1.CreateProjectRequest - 8, // 13: yorkie.v1.AdminService.ListProjects:input_type -> yorkie.v1.ListProjectsRequest - 6, // 14: yorkie.v1.AdminService.GetProject:input_type -> yorkie.v1.GetProjectRequest - 10, // 15: yorkie.v1.AdminService.UpdateProject:input_type -> yorkie.v1.UpdateProjectRequest - 12, // 16: yorkie.v1.AdminService.ListDocuments:input_type -> yorkie.v1.ListDocumentsRequest - 14, // 17: yorkie.v1.AdminService.GetDocument:input_type -> yorkie.v1.GetDocumentRequest - 16, // 18: yorkie.v1.AdminService.RemoveDocumentByAdmin:input_type -> yorkie.v1.RemoveDocumentByAdminRequest - 18, // 19: yorkie.v1.AdminService.GetSnapshotMeta:input_type -> yorkie.v1.GetSnapshotMetaRequest - 20, // 20: yorkie.v1.AdminService.SearchDocuments:input_type -> yorkie.v1.SearchDocumentsRequest - 22, // 21: yorkie.v1.AdminService.ListChanges:input_type -> yorkie.v1.ListChangesRequest - 1, // 22: yorkie.v1.AdminService.SignUp:output_type -> yorkie.v1.SignUpResponse - 3, // 23: yorkie.v1.AdminService.LogIn:output_type -> yorkie.v1.LogInResponse - 5, // 24: yorkie.v1.AdminService.CreateProject:output_type -> yorkie.v1.CreateProjectResponse - 9, // 25: yorkie.v1.AdminService.ListProjects:output_type -> yorkie.v1.ListProjectsResponse - 7, // 26: yorkie.v1.AdminService.GetProject:output_type -> yorkie.v1.GetProjectResponse - 11, // 27: yorkie.v1.AdminService.UpdateProject:output_type -> yorkie.v1.UpdateProjectResponse - 13, // 28: yorkie.v1.AdminService.ListDocuments:output_type -> yorkie.v1.ListDocumentsResponse - 15, // 29: yorkie.v1.AdminService.GetDocument:output_type -> yorkie.v1.GetDocumentResponse - 17, // 30: yorkie.v1.AdminService.RemoveDocumentByAdmin:output_type -> yorkie.v1.RemoveDocumentByAdminResponse - 19, // 31: yorkie.v1.AdminService.GetSnapshotMeta:output_type -> yorkie.v1.GetSnapshotMetaResponse - 21, // 32: yorkie.v1.AdminService.SearchDocuments:output_type -> yorkie.v1.SearchDocumentsResponse - 23, // 33: yorkie.v1.AdminService.ListChanges:output_type -> yorkie.v1.ListChangesResponse - 22, // [22:34] is the sub-list for method output_type - 10, // [10:22] is the sub-list for method input_type - 10, // [10:10] is the sub-list for extension type_name - 10, // [10:10] is the sub-list for extension extendee - 0, // [0:10] is the sub-list for field type_name + 26, // 0: yorkie.v1.SignUpResponse.user:type_name -> yorkie.v1.User + 27, // 1: yorkie.v1.CreateProjectResponse.project:type_name -> yorkie.v1.Project + 27, // 2: yorkie.v1.GetProjectResponse.project:type_name -> yorkie.v1.Project + 27, // 3: yorkie.v1.ListProjectsResponse.projects:type_name -> yorkie.v1.Project + 28, // 4: yorkie.v1.UpdateProjectRequest.fields:type_name -> yorkie.v1.UpdatableProjectFields + 27, // 5: yorkie.v1.UpdateProjectResponse.project:type_name -> yorkie.v1.Project + 29, // 6: yorkie.v1.ListDocumentsResponse.documents:type_name -> yorkie.v1.DocumentSummary + 29, // 7: yorkie.v1.GetDocumentResponse.document:type_name -> yorkie.v1.DocumentSummary + 29, // 8: yorkie.v1.GetDocumentsResponse.documents:type_name -> yorkie.v1.DocumentSummary + 29, // 9: yorkie.v1.SearchDocumentsResponse.documents:type_name -> yorkie.v1.DocumentSummary + 30, // 10: yorkie.v1.ListChangesResponse.changes:type_name -> yorkie.v1.Change + 0, // 11: yorkie.v1.AdminService.SignUp:input_type -> yorkie.v1.SignUpRequest + 2, // 12: yorkie.v1.AdminService.LogIn:input_type -> yorkie.v1.LogInRequest + 4, // 13: yorkie.v1.AdminService.CreateProject:input_type -> yorkie.v1.CreateProjectRequest + 8, // 14: yorkie.v1.AdminService.ListProjects:input_type -> yorkie.v1.ListProjectsRequest + 6, // 15: yorkie.v1.AdminService.GetProject:input_type -> yorkie.v1.GetProjectRequest + 10, // 16: yorkie.v1.AdminService.UpdateProject:input_type -> yorkie.v1.UpdateProjectRequest + 12, // 17: yorkie.v1.AdminService.ListDocuments:input_type -> yorkie.v1.ListDocumentsRequest + 14, // 18: yorkie.v1.AdminService.GetDocument:input_type -> yorkie.v1.GetDocumentRequest + 16, // 19: yorkie.v1.AdminService.GetDocuments:input_type -> yorkie.v1.GetDocumentsRequest + 18, // 20: yorkie.v1.AdminService.RemoveDocumentByAdmin:input_type -> yorkie.v1.RemoveDocumentByAdminRequest + 20, // 21: yorkie.v1.AdminService.GetSnapshotMeta:input_type -> yorkie.v1.GetSnapshotMetaRequest + 22, // 22: yorkie.v1.AdminService.SearchDocuments:input_type -> yorkie.v1.SearchDocumentsRequest + 24, // 23: yorkie.v1.AdminService.ListChanges:input_type -> yorkie.v1.ListChangesRequest + 1, // 24: yorkie.v1.AdminService.SignUp:output_type -> yorkie.v1.SignUpResponse + 3, // 25: yorkie.v1.AdminService.LogIn:output_type -> yorkie.v1.LogInResponse + 5, // 26: yorkie.v1.AdminService.CreateProject:output_type -> yorkie.v1.CreateProjectResponse + 9, // 27: yorkie.v1.AdminService.ListProjects:output_type -> yorkie.v1.ListProjectsResponse + 7, // 28: yorkie.v1.AdminService.GetProject:output_type -> yorkie.v1.GetProjectResponse + 11, // 29: yorkie.v1.AdminService.UpdateProject:output_type -> yorkie.v1.UpdateProjectResponse + 13, // 30: yorkie.v1.AdminService.ListDocuments:output_type -> yorkie.v1.ListDocumentsResponse + 15, // 31: yorkie.v1.AdminService.GetDocument:output_type -> yorkie.v1.GetDocumentResponse + 17, // 32: yorkie.v1.AdminService.GetDocuments:output_type -> yorkie.v1.GetDocumentsResponse + 19, // 33: yorkie.v1.AdminService.RemoveDocumentByAdmin:output_type -> yorkie.v1.RemoveDocumentByAdminResponse + 21, // 34: yorkie.v1.AdminService.GetSnapshotMeta:output_type -> yorkie.v1.GetSnapshotMetaResponse + 23, // 35: yorkie.v1.AdminService.SearchDocuments:output_type -> yorkie.v1.SearchDocumentsResponse + 25, // 36: yorkie.v1.AdminService.ListChanges:output_type -> yorkie.v1.ListChangesResponse + 24, // [24:37] is the sub-list for method output_type + 11, // [11:24] is the sub-list for method input_type + 11, // [11:11] is the sub-list for extension type_name + 11, // [11:11] is the sub-list for extension extendee + 0, // [0:11] is the sub-list for field type_name } func init() { file_yorkie_v1_admin_proto_init() } @@ -1796,7 +1930,7 @@ func file_yorkie_v1_admin_proto_init() { } } file_yorkie_v1_admin_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveDocumentByAdminRequest); i { + switch v := v.(*GetDocumentsRequest); i { case 0: return &v.state case 1: @@ -1808,7 +1942,7 @@ func file_yorkie_v1_admin_proto_init() { } } file_yorkie_v1_admin_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveDocumentByAdminResponse); i { + switch v := v.(*GetDocumentsResponse); i { case 0: return &v.state case 1: @@ -1820,7 +1954,7 @@ func file_yorkie_v1_admin_proto_init() { } } file_yorkie_v1_admin_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSnapshotMetaRequest); i { + switch v := v.(*RemoveDocumentByAdminRequest); i { case 0: return &v.state case 1: @@ -1832,7 +1966,7 @@ func file_yorkie_v1_admin_proto_init() { } } file_yorkie_v1_admin_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSnapshotMetaResponse); i { + switch v := v.(*RemoveDocumentByAdminResponse); i { case 0: return &v.state case 1: @@ -1844,7 +1978,7 @@ func file_yorkie_v1_admin_proto_init() { } } file_yorkie_v1_admin_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchDocumentsRequest); i { + switch v := v.(*GetSnapshotMetaRequest); i { case 0: return &v.state case 1: @@ -1856,7 +1990,7 @@ func file_yorkie_v1_admin_proto_init() { } } file_yorkie_v1_admin_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchDocumentsResponse); i { + switch v := v.(*GetSnapshotMetaResponse); i { case 0: return &v.state case 1: @@ -1868,7 +2002,7 @@ func file_yorkie_v1_admin_proto_init() { } } file_yorkie_v1_admin_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListChangesRequest); i { + switch v := v.(*SearchDocumentsRequest); i { case 0: return &v.state case 1: @@ -1880,6 +2014,30 @@ func file_yorkie_v1_admin_proto_init() { } } file_yorkie_v1_admin_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SearchDocumentsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_yorkie_v1_admin_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListChangesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_yorkie_v1_admin_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListChangesResponse); i { case 0: return &v.state @@ -1898,7 +2056,7 @@ func file_yorkie_v1_admin_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_yorkie_v1_admin_proto_rawDesc, NumEnums: 0, - NumMessages: 24, + NumMessages: 26, NumExtensions: 0, NumServices: 1, }, diff --git a/api/yorkie/v1/admin.proto b/api/yorkie/v1/admin.proto index 753e3181c..a9956afdc 100644 --- a/api/yorkie/v1/admin.proto +++ b/api/yorkie/v1/admin.proto @@ -36,6 +36,7 @@ service AdminService { rpc ListDocuments (ListDocumentsRequest) returns (ListDocumentsResponse) {} rpc GetDocument (GetDocumentRequest) returns (GetDocumentResponse) {} + rpc GetDocuments (GetDocumentsRequest) returns (GetDocumentsResponse) {} rpc RemoveDocumentByAdmin (RemoveDocumentByAdminRequest) returns (RemoveDocumentByAdminResponse) {} rpc GetSnapshotMeta (GetSnapshotMetaRequest) returns (GetSnapshotMetaResponse) {} rpc SearchDocuments (SearchDocumentsRequest) returns (SearchDocumentsResponse) {} @@ -113,6 +114,16 @@ message GetDocumentResponse { DocumentSummary document = 1; } +message GetDocumentsRequest { + string project_name = 1; + repeated string document_keys = 2; + bool include_snapshot = 3; +} + +message GetDocumentsResponse { + repeated DocumentSummary documents = 1; +} + message RemoveDocumentByAdminRequest { string project_name = 1; string document_key = 2; diff --git a/api/yorkie/v1/resources.pb.go b/api/yorkie/v1/resources.pb.go index c9af821f0..ad76f5ca0 100644 --- a/api/yorkie/v1/resources.pb.go +++ b/api/yorkie/v1/resources.pb.go @@ -1038,6 +1038,7 @@ type NodeAttr struct { Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` UpdatedAt *TimeTicket `protobuf:"bytes,2,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + IsRemoved bool `protobuf:"varint,3,opt,name=is_removed,json=isRemoved,proto3" json:"is_removed,omitempty"` } func (x *NodeAttr) Reset() { @@ -1086,6 +1087,13 @@ func (x *NodeAttr) GetUpdatedAt() *TimeTicket { return nil } +func (x *NodeAttr) GetIsRemoved() bool { + if x != nil { + return x.IsRemoved + } + return false +} + type TextNode struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2909,12 +2917,13 @@ type Operation_TreeStyle struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ParentCreatedAt *TimeTicket `protobuf:"bytes,1,opt,name=parent_created_at,json=parentCreatedAt,proto3" json:"parent_created_at,omitempty"` - From *TreePos `protobuf:"bytes,2,opt,name=from,proto3" json:"from,omitempty"` - To *TreePos `protobuf:"bytes,3,opt,name=to,proto3" json:"to,omitempty"` - Attributes map[string]string `protobuf:"bytes,4,rep,name=attributes,proto3" json:"attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - ExecutedAt *TimeTicket `protobuf:"bytes,5,opt,name=executed_at,json=executedAt,proto3" json:"executed_at,omitempty"` - AttributesToRemove []string `protobuf:"bytes,6,rep,name=attributes_to_remove,json=attributesToRemove,proto3" json:"attributes_to_remove,omitempty"` + ParentCreatedAt *TimeTicket `protobuf:"bytes,1,opt,name=parent_created_at,json=parentCreatedAt,proto3" json:"parent_created_at,omitempty"` + From *TreePos `protobuf:"bytes,2,opt,name=from,proto3" json:"from,omitempty"` + To *TreePos `protobuf:"bytes,3,opt,name=to,proto3" json:"to,omitempty"` + Attributes map[string]string `protobuf:"bytes,4,rep,name=attributes,proto3" json:"attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ExecutedAt *TimeTicket `protobuf:"bytes,5,opt,name=executed_at,json=executedAt,proto3" json:"executed_at,omitempty"` + AttributesToRemove []string `protobuf:"bytes,6,rep,name=attributes_to_remove,json=attributesToRemove,proto3" json:"attributes_to_remove,omitempty"` + CreatedAtMapByActor map[string]*TimeTicket `protobuf:"bytes,7,rep,name=created_at_map_by_actor,json=createdAtMapByActor,proto3" json:"created_at_map_by_actor,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *Operation_TreeStyle) Reset() { @@ -2991,6 +3000,13 @@ func (x *Operation_TreeStyle) GetAttributesToRemove() []string { return nil } +func (x *Operation_TreeStyle) GetCreatedAtMapByActor() map[string]*TimeTicket { + if x != nil { + return x.CreatedAtMapByActor + } + return nil +} + type JSONElement_JSONObject struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3005,7 +3021,7 @@ type JSONElement_JSONObject struct { func (x *JSONElement_JSONObject) Reset() { *x = JSONElement_JSONObject{} if protoimpl.UnsafeEnabled { - mi := &file_yorkie_v1_resources_proto_msgTypes[44] + mi := &file_yorkie_v1_resources_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3018,7 +3034,7 @@ func (x *JSONElement_JSONObject) String() string { func (*JSONElement_JSONObject) ProtoMessage() {} func (x *JSONElement_JSONObject) ProtoReflect() protoreflect.Message { - mi := &file_yorkie_v1_resources_proto_msgTypes[44] + mi := &file_yorkie_v1_resources_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3076,7 +3092,7 @@ type JSONElement_JSONArray struct { func (x *JSONElement_JSONArray) Reset() { *x = JSONElement_JSONArray{} if protoimpl.UnsafeEnabled { - mi := &file_yorkie_v1_resources_proto_msgTypes[45] + mi := &file_yorkie_v1_resources_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3089,7 +3105,7 @@ func (x *JSONElement_JSONArray) String() string { func (*JSONElement_JSONArray) ProtoMessage() {} func (x *JSONElement_JSONArray) ProtoReflect() protoreflect.Message { - mi := &file_yorkie_v1_resources_proto_msgTypes[45] + mi := &file_yorkie_v1_resources_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3148,7 +3164,7 @@ type JSONElement_Primitive struct { func (x *JSONElement_Primitive) Reset() { *x = JSONElement_Primitive{} if protoimpl.UnsafeEnabled { - mi := &file_yorkie_v1_resources_proto_msgTypes[46] + mi := &file_yorkie_v1_resources_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3161,7 +3177,7 @@ func (x *JSONElement_Primitive) String() string { func (*JSONElement_Primitive) ProtoMessage() {} func (x *JSONElement_Primitive) ProtoReflect() protoreflect.Message { - mi := &file_yorkie_v1_resources_proto_msgTypes[46] + mi := &file_yorkie_v1_resources_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3226,7 +3242,7 @@ type JSONElement_Text struct { func (x *JSONElement_Text) Reset() { *x = JSONElement_Text{} if protoimpl.UnsafeEnabled { - mi := &file_yorkie_v1_resources_proto_msgTypes[47] + mi := &file_yorkie_v1_resources_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3239,7 +3255,7 @@ func (x *JSONElement_Text) String() string { func (*JSONElement_Text) ProtoMessage() {} func (x *JSONElement_Text) ProtoReflect() protoreflect.Message { - mi := &file_yorkie_v1_resources_proto_msgTypes[47] + mi := &file_yorkie_v1_resources_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3298,7 +3314,7 @@ type JSONElement_Counter struct { func (x *JSONElement_Counter) Reset() { *x = JSONElement_Counter{} if protoimpl.UnsafeEnabled { - mi := &file_yorkie_v1_resources_proto_msgTypes[48] + mi := &file_yorkie_v1_resources_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3311,7 +3327,7 @@ func (x *JSONElement_Counter) String() string { func (*JSONElement_Counter) ProtoMessage() {} func (x *JSONElement_Counter) ProtoReflect() protoreflect.Message { - mi := &file_yorkie_v1_resources_proto_msgTypes[48] + mi := &file_yorkie_v1_resources_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3376,7 +3392,7 @@ type JSONElement_Tree struct { func (x *JSONElement_Tree) Reset() { *x = JSONElement_Tree{} if protoimpl.UnsafeEnabled { - mi := &file_yorkie_v1_resources_proto_msgTypes[49] + mi := &file_yorkie_v1_resources_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3389,7 +3405,7 @@ func (x *JSONElement_Tree) String() string { func (*JSONElement_Tree) ProtoMessage() {} func (x *JSONElement_Tree) ProtoReflect() protoreflect.Message { - mi := &file_yorkie_v1_resources_proto_msgTypes[49] + mi := &file_yorkie_v1_resources_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3444,7 +3460,7 @@ type UpdatableProjectFields_AuthWebhookMethods struct { func (x *UpdatableProjectFields_AuthWebhookMethods) Reset() { *x = UpdatableProjectFields_AuthWebhookMethods{} if protoimpl.UnsafeEnabled { - mi := &file_yorkie_v1_resources_proto_msgTypes[52] + mi := &file_yorkie_v1_resources_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3457,7 +3473,7 @@ func (x *UpdatableProjectFields_AuthWebhookMethods) String() string { func (*UpdatableProjectFields_AuthWebhookMethods) ProtoMessage() {} func (x *UpdatableProjectFields_AuthWebhookMethods) ProtoReflect() protoreflect.Message { - mi := &file_yorkie_v1_resources_proto_msgTypes[52] + mi := &file_yorkie_v1_resources_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3540,7 +3556,7 @@ var file_yorkie_v1_resources_proto_rawDesc = []byte{ 0x6c, 0x61, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x30, 0x01, 0x52, 0x07, 0x6c, 0x61, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0xb6, 0x1e, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x84, 0x20, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x48, 0x00, 0x52, 0x03, 0x73, 0x65, @@ -3758,7 +3774,7 @@ var file_yorkie_v1_resources_proto_rawDesc = []byte{ 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x93, 0x03, 0x0a, 0x09, 0x54, 0x72, 0x65, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x41, + 0x1a, 0xe1, 0x04, 0x0a, 0x09, 0x54, 0x72, 0x65, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x11, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, @@ -3779,95 +3795,80 @@ var file_yorkie_v1_resources_proto_rawDesc = []byte{ 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x54, - 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x1a, 0x3d, 0x0a, 0x0f, 0x41, 0x74, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xf1, - 0x01, 0x0a, 0x11, 0x4a, 0x53, 0x4f, 0x4e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, - 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, - 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x6f, - 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, - 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, - 0x6b, 0x65, 0x74, 0x52, 0x07, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x34, 0x0a, 0x0a, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x28, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x14, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0xa9, 0x0d, 0x0a, 0x0b, 0x4a, 0x53, 0x4f, 0x4e, 0x45, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x44, 0x0a, 0x0b, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x4a, 0x53, 0x4f, 0x4e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x6a, 0x73, - 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x41, 0x0a, 0x0a, 0x6a, 0x73, 0x6f, 0x6e, - 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x79, - 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x45, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x41, 0x72, 0x72, 0x61, 0x79, 0x48, 0x00, - 0x52, 0x09, 0x6a, 0x73, 0x6f, 0x6e, 0x41, 0x72, 0x72, 0x61, 0x79, 0x12, 0x40, 0x0a, 0x09, 0x70, - 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x45, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, - 0x48, 0x00, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x12, 0x31, 0x0a, - 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x79, 0x6f, - 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x45, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x48, 0x00, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, - 0x12, 0x3a, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x53, - 0x4f, 0x4e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, - 0x72, 0x48, 0x00, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x04, - 0x74, 0x72, 0x65, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x79, 0x6f, 0x72, - 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x45, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x48, 0x00, 0x52, 0x04, 0x74, 0x72, 0x65, 0x65, 0x1a, - 0xd4, 0x01, 0x0a, 0x0a, 0x4a, 0x53, 0x4f, 0x4e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, - 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x48, 0x54, 0x4e, 0x6f, 0x64, - 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, - 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, - 0x6b, 0x65, 0x74, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x30, - 0x0a, 0x08, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x72, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x1a, 0xd3, 0x01, 0x0a, 0x09, 0x4a, 0x53, 0x4f, 0x4e, 0x41, - 0x72, 0x72, 0x61, 0x79, 0x12, 0x28, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x47, 0x41, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x34, - 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x6d, 0x0a, 0x17, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x6d, 0x61, 0x70, 0x5f, 0x62, 0x79, 0x5f, 0x61, 0x63, 0x74, + 0x6f, 0x72, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, + 0x72, 0x65, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x4d, 0x61, 0x70, 0x42, 0x79, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x13, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x4d, 0x61, 0x70, 0x42, + 0x79, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0x3d, 0x0a, 0x0f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5d, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x4d, 0x61, 0x70, 0x42, 0x79, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x6d, - 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, + 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xf1, 0x01, 0x0a, + 0x11, 0x4a, 0x53, 0x4f, 0x4e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x6f, 0x76, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, - 0x74, 0x52, 0x09, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x1a, 0xe9, 0x01, 0x0a, - 0x09, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x74, 0x52, 0x07, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, - 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x28, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, + 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0xa9, 0x0d, 0x0a, 0x0b, 0x4a, 0x53, 0x4f, 0x4e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x44, 0x0a, 0x0b, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x53, + 0x4f, 0x4e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x6a, 0x73, 0x6f, 0x6e, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x41, 0x0a, 0x0a, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x79, 0x6f, 0x72, + 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x41, 0x72, 0x72, 0x61, 0x79, 0x48, 0x00, 0x52, 0x09, + 0x6a, 0x73, 0x6f, 0x6e, 0x41, 0x72, 0x72, 0x61, 0x79, 0x12, 0x40, 0x0a, 0x09, 0x70, 0x72, 0x69, + 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x79, + 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x48, 0x00, + 0x52, 0x09, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x74, + 0x65, 0x78, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x79, 0x6f, 0x72, 0x6b, + 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x48, 0x00, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x3a, + 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x48, + 0x00, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x04, 0x74, 0x72, + 0x65, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x54, 0x72, 0x65, 0x65, 0x48, 0x00, 0x52, 0x04, 0x74, 0x72, 0x65, 0x65, 0x1a, 0xd4, 0x01, + 0x0a, 0x0a, 0x4a, 0x53, 0x4f, 0x4e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, 0x0a, 0x05, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x79, 0x6f, + 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x48, 0x54, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, + 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, + 0x74, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x30, 0x0a, 0x08, + 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, + 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x34, + 0x0a, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x6d, 0x6f, 0x76, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x72, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x1a, 0xcf, 0x01, 0x0a, 0x04, 0x54, 0x65, 0x78, - 0x74, 0x12, 0x29, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x78, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x0a, + 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x64, 0x41, 0x74, 0x1a, 0xd3, 0x01, 0x0a, 0x09, 0x4a, 0x53, 0x4f, 0x4e, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x12, 0x28, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x47, + 0x41, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, @@ -3877,287 +3878,316 @@ var file_yorkie_v1_resources_proto_rawDesc = []byte{ 0x65, 0x64, 0x41, 0x74, 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, - 0x09, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x1a, 0xe7, 0x01, 0x0a, 0x07, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, - 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, - 0x74, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x30, 0x0a, 0x08, - 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, - 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x34, - 0x0a, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x72, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x64, 0x41, 0x74, 0x1a, 0xcf, 0x01, 0x0a, 0x04, 0x54, 0x72, 0x65, 0x65, 0x12, 0x29, 0x0a, - 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, - 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, - 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, + 0x09, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x1a, 0xe9, 0x01, 0x0a, 0x09, 0x50, + 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x30, - 0x0a, 0x08, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x0a, 0x08, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, + 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x72, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x42, 0x06, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x4d, - 0x0a, 0x07, 0x52, 0x48, 0x54, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x07, 0x65, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x79, - 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x45, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x63, 0x0a, - 0x07, 0x52, 0x47, 0x41, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x6e, 0x65, 0x78, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x47, 0x41, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x65, 0x78, 0x74, - 0x12, 0x30, 0x0a, 0x07, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x53, - 0x4f, 0x4e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x65, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x22, 0x56, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x74, 0x72, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, - 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xcd, 0x02, 0x0a, 0x08, 0x54, - 0x65, 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x65, 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, + 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x1a, 0xcf, 0x01, 0x0a, 0x04, 0x54, 0x65, 0x78, 0x74, 0x12, + 0x29, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, + 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x6d, 0x6f, 0x76, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x1a, 0xe7, 0x01, 0x0a, 0x07, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, - 0x09, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x69, 0x6e, - 0x73, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x78, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x50, 0x72, 0x65, 0x76, 0x49, - 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x1a, 0x52, 0x0a, 0x0f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x6f, 0x72, - 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x74, 0x72, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5a, 0x0a, 0x0a, 0x54, 0x65, - 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, + 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x6f, + 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, - 0x6b, 0x65, 0x74, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, - 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0xae, 0x03, 0x0a, 0x08, 0x54, 0x72, 0x65, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x65, 0x65, - 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, - 0x09, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x69, 0x6e, - 0x73, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x65, 0x65, - 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x50, 0x72, 0x65, 0x76, 0x49, - 0x64, 0x12, 0x35, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x52, 0x09, 0x69, - 0x6e, 0x73, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x70, 0x74, - 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x64, 0x65, 0x70, 0x74, 0x68, 0x12, 0x43, - 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, + 0x6b, 0x65, 0x74, 0x52, 0x07, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x34, 0x0a, 0x0a, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, + 0x41, 0x74, 0x1a, 0xcf, 0x01, 0x0a, 0x04, 0x54, 0x72, 0x65, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x6e, + 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x6f, 0x72, + 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, + 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, + 0x74, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x30, 0x0a, 0x08, + 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, + 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x34, + 0x0a, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x64, 0x41, 0x74, 0x42, 0x06, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x4d, 0x0a, 0x07, + 0x52, 0x48, 0x54, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x07, 0x65, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x79, 0x6f, 0x72, + 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x07, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x63, 0x0a, 0x07, 0x52, + 0x47, 0x41, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x47, 0x41, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x12, 0x30, + 0x0a, 0x07, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x22, 0x75, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x74, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x22, 0xcd, 0x02, 0x0a, 0x08, 0x54, 0x65, 0x78, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x78, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, + 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x49, 0x44, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x50, 0x72, 0x65, 0x76, 0x49, 0x64, 0x12, 0x43, + 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x1a, 0x52, 0x0a, 0x0f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x74, 0x72, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x09, 0x54, 0x72, 0x65, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x22, 0x5a, 0x0a, 0x0a, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x49, - 0x44, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, - 0x7c, 0x0a, 0x07, 0x54, 0x72, 0x65, 0x65, 0x50, 0x6f, 0x73, 0x12, 0x32, 0x0a, 0x09, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, - 0x64, 0x65, 0x49, 0x44, 0x52, 0x08, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3d, - 0x0a, 0x0f, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x52, 0x0d, - 0x6c, 0x65, 0x66, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x22, 0x6d, 0x0a, - 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xfd, 0x02, 0x0a, - 0x07, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x75, - 0x74, 0x68, 0x5f, 0x77, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x68, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, - 0x6b, 0x55, 0x72, 0x6c, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x77, 0x65, 0x62, - 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x12, 0x61, 0x75, 0x74, 0x68, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x4d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x1b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5a, 0x0a, 0x0a, 0x54, 0x65, 0x78, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x49, 0x44, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, + 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, + 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x22, 0xae, 0x03, 0x0a, 0x08, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x12, 0x25, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, + 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, + 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x49, 0x44, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x50, 0x72, 0x65, 0x76, 0x49, 0x64, 0x12, 0x35, + 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x4e, + 0x65, 0x78, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x64, 0x65, 0x70, 0x74, 0x68, 0x12, 0x43, 0x0a, 0x0a, 0x61, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x65, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x1a, 0x52, 0x0a, 0x0f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x74, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x09, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x5a, 0x0a, 0x0a, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x12, 0x34, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7c, 0x0a, 0x07, + 0x54, 0x72, 0x65, 0x65, 0x50, 0x6f, 0x73, 0x12, 0x32, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, + 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x49, + 0x44, 0x52, 0x08, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3d, 0x0a, 0x0f, 0x6c, + 0x65, 0x66, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x52, 0x0d, 0x6c, 0x65, 0x66, + 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x22, 0x6d, 0x0a, 0x04, 0x55, 0x73, + 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xfd, 0x02, 0x0a, 0x07, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x75, 0x74, 0x68, 0x5f, + 0x77, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x68, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x55, 0x72, + 0x6c, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x77, 0x65, 0x62, 0x68, 0x6f, 0x6f, + 0x6b, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x12, 0x61, 0x75, 0x74, 0x68, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x1b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, + 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, + 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x88, 0x03, 0x0a, 0x16, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x10, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x77, + 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, + 0x61, 0x75, 0x74, 0x68, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x55, 0x72, 0x6c, 0x12, 0x66, + 0x0a, 0x14, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x77, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x79, + 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x2e, + 0x41, 0x75, 0x74, 0x68, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x4d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x73, 0x52, 0x12, 0x61, 0x75, 0x74, 0x68, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x4d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x12, 0x5c, 0x0a, 0x1b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x19, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x1a, 0x2e, 0x0a, 0x12, 0x41, 0x75, 0x74, 0x68, 0x57, 0x65, 0x62, 0x68, + 0x6f, 0x6f, 0x6b, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x73, 0x22, 0x82, 0x02, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x88, 0x03, 0x0a, - 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x10, 0x61, 0x75, 0x74, - 0x68, 0x5f, 0x77, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x68, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x55, 0x72, - 0x6c, 0x12, 0x66, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x77, 0x65, 0x62, 0x68, 0x6f, 0x6f, - 0x6b, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x34, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x4d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x73, 0x52, 0x12, 0x61, 0x75, 0x74, 0x68, 0x57, 0x65, 0x62, 0x68, 0x6f, - 0x6f, 0x6b, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x12, 0x5c, 0x0a, 0x1b, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x74, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x19, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x54, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x1a, 0x2e, 0x0a, 0x12, 0x41, 0x75, 0x74, 0x68, 0x57, - 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x12, 0x18, 0x0a, - 0x07, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x22, 0x82, 0x02, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, - 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xea, 0x01, 0x0a, - 0x0e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, - 0x38, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, - 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, - 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x70, 0x72, 0x65, - 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x6f, - 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x6d, 0x0a, 0x0a, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x48, 0x41, 0x4e, - 0x47, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x55, 0x54, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x48, - 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, - 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x43, 0x4c, 0x45, 0x41, 0x52, 0x10, 0x03, 0x22, 0x76, 0x0a, 0x08, 0x50, 0x72, 0x65, - 0x73, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x4e, 0x0a, 0x0a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, - 0x21, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x42, 0x02, 0x30, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, - 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x71, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, - 0x71, 0x22, 0x84, 0x01, 0x0a, 0x0b, 0x54, 0x65, 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, - 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, - 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, - 0x76, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x63, 0x0a, 0x0a, 0x54, 0x69, 0x6d, 0x65, - 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x07, 0x6c, 0x61, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x30, 0x01, 0x52, 0x07, 0x6c, 0x61, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x3e, 0x0a, - 0x0c, 0x44, 0x6f, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, - 0x70, 0x69, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x82, 0x01, - 0x0a, 0x08, 0x44, 0x6f, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x73, 0x68, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x73, 0x68, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x6f, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x04, 0x62, 0x6f, - 0x64, 0x79, 0x2a, 0xd4, 0x02, 0x0a, 0x09, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x13, 0x0a, 0x0f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, - 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x16, 0x0a, - 0x12, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, - 0x47, 0x45, 0x52, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x4f, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x56, 0x41, - 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, - 0x04, 0x12, 0x15, 0x0a, 0x11, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x14, 0x0a, 0x10, 0x56, 0x41, 0x4c, 0x55, - 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x06, 0x12, 0x13, - 0x0a, 0x0f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x41, 0x54, - 0x45, 0x10, 0x07, 0x12, 0x1a, 0x0a, 0x16, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x08, 0x12, - 0x19, 0x0a, 0x15, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4a, 0x53, - 0x4f, 0x4e, 0x5f, 0x41, 0x52, 0x52, 0x41, 0x59, 0x10, 0x09, 0x12, 0x13, 0x0a, 0x0f, 0x56, 0x41, - 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x58, 0x54, 0x10, 0x0a, 0x12, - 0x1a, 0x0a, 0x16, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, - 0x54, 0x45, 0x47, 0x45, 0x52, 0x5f, 0x43, 0x4e, 0x54, 0x10, 0x0b, 0x12, 0x17, 0x0a, 0x13, 0x56, - 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x4f, 0x4e, 0x47, 0x5f, 0x43, - 0x4e, 0x54, 0x10, 0x0c, 0x12, 0x13, 0x0a, 0x0f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x54, 0x52, 0x45, 0x45, 0x10, 0x0d, 0x2a, 0xa6, 0x01, 0x0a, 0x0c, 0x44, 0x6f, - 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x4f, - 0x43, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x43, - 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x23, 0x0a, 0x1f, 0x44, 0x4f, 0x43, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x44, 0x4f, 0x43, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x57, 0x41, 0x54, 0x43, 0x48, - 0x45, 0x44, 0x10, 0x01, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x4f, 0x43, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x43, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, - 0x55, 0x4e, 0x57, 0x41, 0x54, 0x43, 0x48, 0x45, 0x44, 0x10, 0x02, 0x12, 0x25, 0x0a, 0x21, 0x44, - 0x4f, 0x43, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, - 0x43, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x42, 0x52, 0x4f, 0x41, 0x44, 0x43, 0x41, 0x53, 0x54, - 0x10, 0x03, 0x42, 0x45, 0x0a, 0x11, 0x64, 0x65, 0x76, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2d, 0x74, 0x65, 0x61, - 0x6d, 0x2f, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x79, 0x6f, 0x72, - 0x6b, 0x69, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, + 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xea, 0x01, 0x0a, 0x0e, 0x50, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x79, 0x6f, 0x72, + 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x6d, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x50, 0x55, 0x54, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x48, 0x41, 0x4e, 0x47, + 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x02, 0x12, + 0x15, 0x0a, 0x11, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, + 0x4c, 0x45, 0x41, 0x52, 0x10, 0x03, 0x22, 0x76, 0x0a, 0x08, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x63, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4e, + 0x0a, 0x0a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0a, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x42, 0x02, 0x30, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x71, 0x12, + 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x71, 0x22, 0x84, + 0x01, 0x0a, 0x0b, 0x54, 0x65, 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x73, 0x12, 0x34, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x0f, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x4f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x63, 0x0a, 0x0a, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, + 0x6b, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x07, 0x6c, 0x61, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x30, 0x01, 0x52, 0x07, 0x6c, 0x61, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, + 0x19, 0x0a, 0x08, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x0c, 0x44, 0x6f, + 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, + 0x70, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x82, 0x01, 0x0a, 0x08, 0x44, + 0x6f, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x2a, + 0xd4, 0x02, 0x0a, 0x09, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x13, 0x0a, + 0x0f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, + 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x56, 0x41, + 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, + 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x4c, 0x4f, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x56, 0x41, 0x4c, 0x55, 0x45, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x04, 0x12, 0x15, + 0x0a, 0x11, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, + 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x14, 0x0a, 0x10, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x56, + 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x45, 0x10, 0x07, + 0x12, 0x1a, 0x0a, 0x16, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4a, + 0x53, 0x4f, 0x4e, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x08, 0x12, 0x19, 0x0a, 0x15, + 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x5f, + 0x41, 0x52, 0x52, 0x41, 0x59, 0x10, 0x09, 0x12, 0x13, 0x0a, 0x0f, 0x56, 0x41, 0x4c, 0x55, 0x45, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x58, 0x54, 0x10, 0x0a, 0x12, 0x1a, 0x0a, 0x16, + 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x47, + 0x45, 0x52, 0x5f, 0x43, 0x4e, 0x54, 0x10, 0x0b, 0x12, 0x17, 0x0a, 0x13, 0x56, 0x41, 0x4c, 0x55, + 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x4f, 0x4e, 0x47, 0x5f, 0x43, 0x4e, 0x54, 0x10, + 0x0c, 0x12, 0x13, 0x0a, 0x0f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x54, 0x52, 0x45, 0x45, 0x10, 0x0d, 0x2a, 0xa6, 0x01, 0x0a, 0x0c, 0x44, 0x6f, 0x63, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x4f, 0x43, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x43, 0x55, 0x4d, 0x45, + 0x4e, 0x54, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x00, 0x12, 0x23, 0x0a, 0x1f, + 0x44, 0x4f, 0x43, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, + 0x4f, 0x43, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x57, 0x41, 0x54, 0x43, 0x48, 0x45, 0x44, 0x10, + 0x01, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x4f, 0x43, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x43, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x57, + 0x41, 0x54, 0x43, 0x48, 0x45, 0x44, 0x10, 0x02, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x4f, 0x43, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x43, 0x55, 0x4d, + 0x45, 0x4e, 0x54, 0x5f, 0x42, 0x52, 0x4f, 0x41, 0x44, 0x43, 0x41, 0x53, 0x54, 0x10, 0x03, 0x42, + 0x45, 0x0a, 0x11, 0x64, 0x65, 0x76, 0x2e, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2d, 0x74, 0x65, 0x61, 0x6d, 0x2f, 0x79, + 0x6f, 0x72, 0x6b, 0x69, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x79, 0x6f, 0x72, 0x6b, 0x69, 0x65, + 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4173,7 +4203,7 @@ func file_yorkie_v1_resources_proto_rawDescGZIP() []byte { } var file_yorkie_v1_resources_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_yorkie_v1_resources_proto_msgTypes = make([]protoimpl.MessageInfo, 54) +var file_yorkie_v1_resources_proto_msgTypes = make([]protoimpl.MessageInfo, 55) var file_yorkie_v1_resources_proto_goTypes = []interface{}{ (ValueType)(0), // 0: yorkie.v1.ValueType (DocEventType)(0), // 1: yorkie.v1.DocEventType @@ -4222,18 +4252,19 @@ var file_yorkie_v1_resources_proto_goTypes = []interface{}{ nil, // 44: yorkie.v1.Operation.Style.CreatedAtMapByActorEntry nil, // 45: yorkie.v1.Operation.TreeEdit.CreatedAtMapByActorEntry nil, // 46: yorkie.v1.Operation.TreeStyle.AttributesEntry - (*JSONElement_JSONObject)(nil), // 47: yorkie.v1.JSONElement.JSONObject - (*JSONElement_JSONArray)(nil), // 48: yorkie.v1.JSONElement.JSONArray - (*JSONElement_Primitive)(nil), // 49: yorkie.v1.JSONElement.Primitive - (*JSONElement_Text)(nil), // 50: yorkie.v1.JSONElement.Text - (*JSONElement_Counter)(nil), // 51: yorkie.v1.JSONElement.Counter - (*JSONElement_Tree)(nil), // 52: yorkie.v1.JSONElement.Tree - nil, // 53: yorkie.v1.TextNode.AttributesEntry - nil, // 54: yorkie.v1.TreeNode.AttributesEntry - (*UpdatableProjectFields_AuthWebhookMethods)(nil), // 55: yorkie.v1.UpdatableProjectFields.AuthWebhookMethods - nil, // 56: yorkie.v1.Presence.DataEntry - (*timestamppb.Timestamp)(nil), // 57: google.protobuf.Timestamp - (*wrapperspb.StringValue)(nil), // 58: google.protobuf.StringValue + nil, // 47: yorkie.v1.Operation.TreeStyle.CreatedAtMapByActorEntry + (*JSONElement_JSONObject)(nil), // 48: yorkie.v1.JSONElement.JSONObject + (*JSONElement_JSONArray)(nil), // 49: yorkie.v1.JSONElement.JSONArray + (*JSONElement_Primitive)(nil), // 50: yorkie.v1.JSONElement.Primitive + (*JSONElement_Text)(nil), // 51: yorkie.v1.JSONElement.Text + (*JSONElement_Counter)(nil), // 52: yorkie.v1.JSONElement.Counter + (*JSONElement_Tree)(nil), // 53: yorkie.v1.JSONElement.Tree + nil, // 54: yorkie.v1.TextNode.AttributesEntry + nil, // 55: yorkie.v1.TreeNode.AttributesEntry + (*UpdatableProjectFields_AuthWebhookMethods)(nil), // 56: yorkie.v1.UpdatableProjectFields.AuthWebhookMethods + nil, // 57: yorkie.v1.Presence.DataEntry + (*timestamppb.Timestamp)(nil), // 58: google.protobuf.Timestamp + (*wrapperspb.StringValue)(nil), // 59: google.protobuf.StringValue } var file_yorkie_v1_resources_proto_depIdxs = []int32{ 9, // 0: yorkie.v1.Snapshot.root:type_name -> yorkie.v1.JSONElement @@ -4258,12 +4289,12 @@ var file_yorkie_v1_resources_proto_depIdxs = []int32{ 27, // 19: yorkie.v1.JSONElementSimple.moved_at:type_name -> yorkie.v1.TimeTicket 27, // 20: yorkie.v1.JSONElementSimple.removed_at:type_name -> yorkie.v1.TimeTicket 0, // 21: yorkie.v1.JSONElementSimple.type:type_name -> yorkie.v1.ValueType - 47, // 22: yorkie.v1.JSONElement.json_object:type_name -> yorkie.v1.JSONElement.JSONObject - 48, // 23: yorkie.v1.JSONElement.json_array:type_name -> yorkie.v1.JSONElement.JSONArray - 49, // 24: yorkie.v1.JSONElement.primitive:type_name -> yorkie.v1.JSONElement.Primitive - 50, // 25: yorkie.v1.JSONElement.text:type_name -> yorkie.v1.JSONElement.Text - 51, // 26: yorkie.v1.JSONElement.counter:type_name -> yorkie.v1.JSONElement.Counter - 52, // 27: yorkie.v1.JSONElement.tree:type_name -> yorkie.v1.JSONElement.Tree + 48, // 22: yorkie.v1.JSONElement.json_object:type_name -> yorkie.v1.JSONElement.JSONObject + 49, // 23: yorkie.v1.JSONElement.json_array:type_name -> yorkie.v1.JSONElement.JSONArray + 50, // 24: yorkie.v1.JSONElement.primitive:type_name -> yorkie.v1.JSONElement.Primitive + 51, // 25: yorkie.v1.JSONElement.text:type_name -> yorkie.v1.JSONElement.Text + 52, // 26: yorkie.v1.JSONElement.counter:type_name -> yorkie.v1.JSONElement.Counter + 53, // 27: yorkie.v1.JSONElement.tree:type_name -> yorkie.v1.JSONElement.Tree 9, // 28: yorkie.v1.RHTNode.element:type_name -> yorkie.v1.JSONElement 11, // 29: yorkie.v1.RGANode.next:type_name -> yorkie.v1.RGANode 9, // 30: yorkie.v1.RGANode.element:type_name -> yorkie.v1.JSONElement @@ -4271,30 +4302,30 @@ var file_yorkie_v1_resources_proto_depIdxs = []int32{ 14, // 32: yorkie.v1.TextNode.id:type_name -> yorkie.v1.TextNodeID 27, // 33: yorkie.v1.TextNode.removed_at:type_name -> yorkie.v1.TimeTicket 14, // 34: yorkie.v1.TextNode.ins_prev_id:type_name -> yorkie.v1.TextNodeID - 53, // 35: yorkie.v1.TextNode.attributes:type_name -> yorkie.v1.TextNode.AttributesEntry + 54, // 35: yorkie.v1.TextNode.attributes:type_name -> yorkie.v1.TextNode.AttributesEntry 27, // 36: yorkie.v1.TextNodeID.created_at:type_name -> yorkie.v1.TimeTicket 17, // 37: yorkie.v1.TreeNode.id:type_name -> yorkie.v1.TreeNodeID 27, // 38: yorkie.v1.TreeNode.removed_at:type_name -> yorkie.v1.TimeTicket 17, // 39: yorkie.v1.TreeNode.ins_prev_id:type_name -> yorkie.v1.TreeNodeID 17, // 40: yorkie.v1.TreeNode.ins_next_id:type_name -> yorkie.v1.TreeNodeID - 54, // 41: yorkie.v1.TreeNode.attributes:type_name -> yorkie.v1.TreeNode.AttributesEntry + 55, // 41: yorkie.v1.TreeNode.attributes:type_name -> yorkie.v1.TreeNode.AttributesEntry 15, // 42: yorkie.v1.TreeNodes.content:type_name -> yorkie.v1.TreeNode 27, // 43: yorkie.v1.TreeNodeID.created_at:type_name -> yorkie.v1.TimeTicket 17, // 44: yorkie.v1.TreePos.parent_id:type_name -> yorkie.v1.TreeNodeID 17, // 45: yorkie.v1.TreePos.left_sibling_id:type_name -> yorkie.v1.TreeNodeID - 57, // 46: yorkie.v1.User.created_at:type_name -> google.protobuf.Timestamp - 57, // 47: yorkie.v1.Project.created_at:type_name -> google.protobuf.Timestamp - 57, // 48: yorkie.v1.Project.updated_at:type_name -> google.protobuf.Timestamp - 58, // 49: yorkie.v1.UpdatableProjectFields.name:type_name -> google.protobuf.StringValue - 58, // 50: yorkie.v1.UpdatableProjectFields.auth_webhook_url:type_name -> google.protobuf.StringValue - 55, // 51: yorkie.v1.UpdatableProjectFields.auth_webhook_methods:type_name -> yorkie.v1.UpdatableProjectFields.AuthWebhookMethods - 58, // 52: yorkie.v1.UpdatableProjectFields.client_deactivate_threshold:type_name -> google.protobuf.StringValue - 57, // 53: yorkie.v1.DocumentSummary.created_at:type_name -> google.protobuf.Timestamp - 57, // 54: yorkie.v1.DocumentSummary.accessed_at:type_name -> google.protobuf.Timestamp - 57, // 55: yorkie.v1.DocumentSummary.updated_at:type_name -> google.protobuf.Timestamp + 58, // 46: yorkie.v1.User.created_at:type_name -> google.protobuf.Timestamp + 58, // 47: yorkie.v1.Project.created_at:type_name -> google.protobuf.Timestamp + 58, // 48: yorkie.v1.Project.updated_at:type_name -> google.protobuf.Timestamp + 59, // 49: yorkie.v1.UpdatableProjectFields.name:type_name -> google.protobuf.StringValue + 59, // 50: yorkie.v1.UpdatableProjectFields.auth_webhook_url:type_name -> google.protobuf.StringValue + 56, // 51: yorkie.v1.UpdatableProjectFields.auth_webhook_methods:type_name -> yorkie.v1.UpdatableProjectFields.AuthWebhookMethods + 59, // 52: yorkie.v1.UpdatableProjectFields.client_deactivate_threshold:type_name -> google.protobuf.StringValue + 58, // 53: yorkie.v1.DocumentSummary.created_at:type_name -> google.protobuf.Timestamp + 58, // 54: yorkie.v1.DocumentSummary.accessed_at:type_name -> google.protobuf.Timestamp + 58, // 55: yorkie.v1.DocumentSummary.updated_at:type_name -> google.protobuf.Timestamp 2, // 56: yorkie.v1.PresenceChange.type:type_name -> yorkie.v1.PresenceChange.ChangeType 24, // 57: yorkie.v1.PresenceChange.presence:type_name -> yorkie.v1.Presence - 56, // 58: yorkie.v1.Presence.data:type_name -> yorkie.v1.Presence.DataEntry + 57, // 58: yorkie.v1.Presence.data:type_name -> yorkie.v1.Presence.DataEntry 27, // 59: yorkie.v1.TextNodePos.created_at:type_name -> yorkie.v1.TimeTicket 1, // 60: yorkie.v1.DocEvent.type:type_name -> yorkie.v1.DocEventType 28, // 61: yorkie.v1.DocEvent.body:type_name -> yorkie.v1.DocEventBody @@ -4343,40 +4374,42 @@ var file_yorkie_v1_resources_proto_depIdxs = []int32{ 18, // 104: yorkie.v1.Operation.TreeStyle.to:type_name -> yorkie.v1.TreePos 46, // 105: yorkie.v1.Operation.TreeStyle.attributes:type_name -> yorkie.v1.Operation.TreeStyle.AttributesEntry 27, // 106: yorkie.v1.Operation.TreeStyle.executed_at:type_name -> yorkie.v1.TimeTicket - 27, // 107: yorkie.v1.Operation.Edit.CreatedAtMapByActorEntry.value:type_name -> yorkie.v1.TimeTicket - 27, // 108: yorkie.v1.Operation.Style.CreatedAtMapByActorEntry.value:type_name -> yorkie.v1.TimeTicket - 27, // 109: yorkie.v1.Operation.TreeEdit.CreatedAtMapByActorEntry.value:type_name -> yorkie.v1.TimeTicket - 10, // 110: yorkie.v1.JSONElement.JSONObject.nodes:type_name -> yorkie.v1.RHTNode - 27, // 111: yorkie.v1.JSONElement.JSONObject.created_at:type_name -> yorkie.v1.TimeTicket - 27, // 112: yorkie.v1.JSONElement.JSONObject.moved_at:type_name -> yorkie.v1.TimeTicket - 27, // 113: yorkie.v1.JSONElement.JSONObject.removed_at:type_name -> yorkie.v1.TimeTicket - 11, // 114: yorkie.v1.JSONElement.JSONArray.nodes:type_name -> yorkie.v1.RGANode - 27, // 115: yorkie.v1.JSONElement.JSONArray.created_at:type_name -> yorkie.v1.TimeTicket - 27, // 116: yorkie.v1.JSONElement.JSONArray.moved_at:type_name -> yorkie.v1.TimeTicket - 27, // 117: yorkie.v1.JSONElement.JSONArray.removed_at:type_name -> yorkie.v1.TimeTicket - 0, // 118: yorkie.v1.JSONElement.Primitive.type:type_name -> yorkie.v1.ValueType - 27, // 119: yorkie.v1.JSONElement.Primitive.created_at:type_name -> yorkie.v1.TimeTicket - 27, // 120: yorkie.v1.JSONElement.Primitive.moved_at:type_name -> yorkie.v1.TimeTicket - 27, // 121: yorkie.v1.JSONElement.Primitive.removed_at:type_name -> yorkie.v1.TimeTicket - 13, // 122: yorkie.v1.JSONElement.Text.nodes:type_name -> yorkie.v1.TextNode - 27, // 123: yorkie.v1.JSONElement.Text.created_at:type_name -> yorkie.v1.TimeTicket - 27, // 124: yorkie.v1.JSONElement.Text.moved_at:type_name -> yorkie.v1.TimeTicket - 27, // 125: yorkie.v1.JSONElement.Text.removed_at:type_name -> yorkie.v1.TimeTicket - 0, // 126: yorkie.v1.JSONElement.Counter.type:type_name -> yorkie.v1.ValueType - 27, // 127: yorkie.v1.JSONElement.Counter.created_at:type_name -> yorkie.v1.TimeTicket - 27, // 128: yorkie.v1.JSONElement.Counter.moved_at:type_name -> yorkie.v1.TimeTicket - 27, // 129: yorkie.v1.JSONElement.Counter.removed_at:type_name -> yorkie.v1.TimeTicket - 15, // 130: yorkie.v1.JSONElement.Tree.nodes:type_name -> yorkie.v1.TreeNode - 27, // 131: yorkie.v1.JSONElement.Tree.created_at:type_name -> yorkie.v1.TimeTicket - 27, // 132: yorkie.v1.JSONElement.Tree.moved_at:type_name -> yorkie.v1.TimeTicket - 27, // 133: yorkie.v1.JSONElement.Tree.removed_at:type_name -> yorkie.v1.TimeTicket - 12, // 134: yorkie.v1.TextNode.AttributesEntry.value:type_name -> yorkie.v1.NodeAttr - 12, // 135: yorkie.v1.TreeNode.AttributesEntry.value:type_name -> yorkie.v1.NodeAttr - 136, // [136:136] is the sub-list for method output_type - 136, // [136:136] is the sub-list for method input_type - 136, // [136:136] is the sub-list for extension type_name - 136, // [136:136] is the sub-list for extension extendee - 0, // [0:136] is the sub-list for field type_name + 47, // 107: yorkie.v1.Operation.TreeStyle.created_at_map_by_actor:type_name -> yorkie.v1.Operation.TreeStyle.CreatedAtMapByActorEntry + 27, // 108: yorkie.v1.Operation.Edit.CreatedAtMapByActorEntry.value:type_name -> yorkie.v1.TimeTicket + 27, // 109: yorkie.v1.Operation.Style.CreatedAtMapByActorEntry.value:type_name -> yorkie.v1.TimeTicket + 27, // 110: yorkie.v1.Operation.TreeEdit.CreatedAtMapByActorEntry.value:type_name -> yorkie.v1.TimeTicket + 27, // 111: yorkie.v1.Operation.TreeStyle.CreatedAtMapByActorEntry.value:type_name -> yorkie.v1.TimeTicket + 10, // 112: yorkie.v1.JSONElement.JSONObject.nodes:type_name -> yorkie.v1.RHTNode + 27, // 113: yorkie.v1.JSONElement.JSONObject.created_at:type_name -> yorkie.v1.TimeTicket + 27, // 114: yorkie.v1.JSONElement.JSONObject.moved_at:type_name -> yorkie.v1.TimeTicket + 27, // 115: yorkie.v1.JSONElement.JSONObject.removed_at:type_name -> yorkie.v1.TimeTicket + 11, // 116: yorkie.v1.JSONElement.JSONArray.nodes:type_name -> yorkie.v1.RGANode + 27, // 117: yorkie.v1.JSONElement.JSONArray.created_at:type_name -> yorkie.v1.TimeTicket + 27, // 118: yorkie.v1.JSONElement.JSONArray.moved_at:type_name -> yorkie.v1.TimeTicket + 27, // 119: yorkie.v1.JSONElement.JSONArray.removed_at:type_name -> yorkie.v1.TimeTicket + 0, // 120: yorkie.v1.JSONElement.Primitive.type:type_name -> yorkie.v1.ValueType + 27, // 121: yorkie.v1.JSONElement.Primitive.created_at:type_name -> yorkie.v1.TimeTicket + 27, // 122: yorkie.v1.JSONElement.Primitive.moved_at:type_name -> yorkie.v1.TimeTicket + 27, // 123: yorkie.v1.JSONElement.Primitive.removed_at:type_name -> yorkie.v1.TimeTicket + 13, // 124: yorkie.v1.JSONElement.Text.nodes:type_name -> yorkie.v1.TextNode + 27, // 125: yorkie.v1.JSONElement.Text.created_at:type_name -> yorkie.v1.TimeTicket + 27, // 126: yorkie.v1.JSONElement.Text.moved_at:type_name -> yorkie.v1.TimeTicket + 27, // 127: yorkie.v1.JSONElement.Text.removed_at:type_name -> yorkie.v1.TimeTicket + 0, // 128: yorkie.v1.JSONElement.Counter.type:type_name -> yorkie.v1.ValueType + 27, // 129: yorkie.v1.JSONElement.Counter.created_at:type_name -> yorkie.v1.TimeTicket + 27, // 130: yorkie.v1.JSONElement.Counter.moved_at:type_name -> yorkie.v1.TimeTicket + 27, // 131: yorkie.v1.JSONElement.Counter.removed_at:type_name -> yorkie.v1.TimeTicket + 15, // 132: yorkie.v1.JSONElement.Tree.nodes:type_name -> yorkie.v1.TreeNode + 27, // 133: yorkie.v1.JSONElement.Tree.created_at:type_name -> yorkie.v1.TimeTicket + 27, // 134: yorkie.v1.JSONElement.Tree.moved_at:type_name -> yorkie.v1.TimeTicket + 27, // 135: yorkie.v1.JSONElement.Tree.removed_at:type_name -> yorkie.v1.TimeTicket + 12, // 136: yorkie.v1.TextNode.AttributesEntry.value:type_name -> yorkie.v1.NodeAttr + 12, // 137: yorkie.v1.TreeNode.AttributesEntry.value:type_name -> yorkie.v1.NodeAttr + 138, // [138:138] is the sub-list for method output_type + 138, // [138:138] is the sub-list for method input_type + 138, // [138:138] is the sub-list for extension type_name + 138, // [138:138] is the sub-list for extension extendee + 0, // [0:138] is the sub-list for field type_name } func init() { file_yorkie_v1_resources_proto_init() } @@ -4829,7 +4862,7 @@ func file_yorkie_v1_resources_proto_init() { return nil } } - file_yorkie_v1_resources_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_yorkie_v1_resources_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JSONElement_JSONObject); i { case 0: return &v.state @@ -4841,7 +4874,7 @@ func file_yorkie_v1_resources_proto_init() { return nil } } - file_yorkie_v1_resources_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_yorkie_v1_resources_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JSONElement_JSONArray); i { case 0: return &v.state @@ -4853,7 +4886,7 @@ func file_yorkie_v1_resources_proto_init() { return nil } } - file_yorkie_v1_resources_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_yorkie_v1_resources_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JSONElement_Primitive); i { case 0: return &v.state @@ -4865,7 +4898,7 @@ func file_yorkie_v1_resources_proto_init() { return nil } } - file_yorkie_v1_resources_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_yorkie_v1_resources_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JSONElement_Text); i { case 0: return &v.state @@ -4877,7 +4910,7 @@ func file_yorkie_v1_resources_proto_init() { return nil } } - file_yorkie_v1_resources_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_yorkie_v1_resources_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JSONElement_Counter); i { case 0: return &v.state @@ -4889,7 +4922,7 @@ func file_yorkie_v1_resources_proto_init() { return nil } } - file_yorkie_v1_resources_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_yorkie_v1_resources_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JSONElement_Tree); i { case 0: return &v.state @@ -4901,7 +4934,7 @@ func file_yorkie_v1_resources_proto_init() { return nil } } - file_yorkie_v1_resources_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_yorkie_v1_resources_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdatableProjectFields_AuthWebhookMethods); i { case 0: return &v.state @@ -4940,7 +4973,7 @@ func file_yorkie_v1_resources_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_yorkie_v1_resources_proto_rawDesc, NumEnums: 3, - NumMessages: 54, + NumMessages: 55, NumExtensions: 0, NumServices: 0, }, diff --git a/api/yorkie/v1/resources.proto b/api/yorkie/v1/resources.proto index 1b186a94a..d1a8c3776 100644 --- a/api/yorkie/v1/resources.proto +++ b/api/yorkie/v1/resources.proto @@ -134,6 +134,7 @@ message Operation { map attributes = 4; TimeTicket executed_at = 5; repeated string attributes_to_remove = 6; + map created_at_map_by_actor = 7; } oneof body { @@ -225,6 +226,7 @@ message RGANode { message NodeAttr { string value = 1; TimeTicket updated_at = 2; + bool is_removed = 3; } message TextNode { diff --git a/api/yorkie/v1/v1connect/admin.connect.go b/api/yorkie/v1/v1connect/admin.connect.go index d78294f72..f3d5bb4d6 100644 --- a/api/yorkie/v1/v1connect/admin.connect.go +++ b/api/yorkie/v1/v1connect/admin.connect.go @@ -69,6 +69,9 @@ const ( // AdminServiceGetDocumentProcedure is the fully-qualified name of the AdminService's GetDocument // RPC. AdminServiceGetDocumentProcedure = "/yorkie.v1.AdminService/GetDocument" + // AdminServiceGetDocumentsProcedure is the fully-qualified name of the AdminService's GetDocuments + // RPC. + AdminServiceGetDocumentsProcedure = "/yorkie.v1.AdminService/GetDocuments" // AdminServiceRemoveDocumentByAdminProcedure is the fully-qualified name of the AdminService's // RemoveDocumentByAdmin RPC. AdminServiceRemoveDocumentByAdminProcedure = "/yorkie.v1.AdminService/RemoveDocumentByAdmin" @@ -93,6 +96,7 @@ type AdminServiceClient interface { UpdateProject(context.Context, *connect.Request[v1.UpdateProjectRequest]) (*connect.Response[v1.UpdateProjectResponse], error) ListDocuments(context.Context, *connect.Request[v1.ListDocumentsRequest]) (*connect.Response[v1.ListDocumentsResponse], error) GetDocument(context.Context, *connect.Request[v1.GetDocumentRequest]) (*connect.Response[v1.GetDocumentResponse], error) + GetDocuments(context.Context, *connect.Request[v1.GetDocumentsRequest]) (*connect.Response[v1.GetDocumentsResponse], error) RemoveDocumentByAdmin(context.Context, *connect.Request[v1.RemoveDocumentByAdminRequest]) (*connect.Response[v1.RemoveDocumentByAdminResponse], error) GetSnapshotMeta(context.Context, *connect.Request[v1.GetSnapshotMetaRequest]) (*connect.Response[v1.GetSnapshotMetaResponse], error) SearchDocuments(context.Context, *connect.Request[v1.SearchDocumentsRequest]) (*connect.Response[v1.SearchDocumentsResponse], error) @@ -149,6 +153,11 @@ func NewAdminServiceClient(httpClient connect.HTTPClient, baseURL string, opts . baseURL+AdminServiceGetDocumentProcedure, opts..., ), + getDocuments: connect.NewClient[v1.GetDocumentsRequest, v1.GetDocumentsResponse]( + httpClient, + baseURL+AdminServiceGetDocumentsProcedure, + opts..., + ), removeDocumentByAdmin: connect.NewClient[v1.RemoveDocumentByAdminRequest, v1.RemoveDocumentByAdminResponse]( httpClient, baseURL+AdminServiceRemoveDocumentByAdminProcedure, @@ -182,6 +191,7 @@ type adminServiceClient struct { updateProject *connect.Client[v1.UpdateProjectRequest, v1.UpdateProjectResponse] listDocuments *connect.Client[v1.ListDocumentsRequest, v1.ListDocumentsResponse] getDocument *connect.Client[v1.GetDocumentRequest, v1.GetDocumentResponse] + getDocuments *connect.Client[v1.GetDocumentsRequest, v1.GetDocumentsResponse] removeDocumentByAdmin *connect.Client[v1.RemoveDocumentByAdminRequest, v1.RemoveDocumentByAdminResponse] getSnapshotMeta *connect.Client[v1.GetSnapshotMetaRequest, v1.GetSnapshotMetaResponse] searchDocuments *connect.Client[v1.SearchDocumentsRequest, v1.SearchDocumentsResponse] @@ -228,6 +238,11 @@ func (c *adminServiceClient) GetDocument(ctx context.Context, req *connect.Reque return c.getDocument.CallUnary(ctx, req) } +// GetDocuments calls yorkie.v1.AdminService.GetDocuments. +func (c *adminServiceClient) GetDocuments(ctx context.Context, req *connect.Request[v1.GetDocumentsRequest]) (*connect.Response[v1.GetDocumentsResponse], error) { + return c.getDocuments.CallUnary(ctx, req) +} + // RemoveDocumentByAdmin calls yorkie.v1.AdminService.RemoveDocumentByAdmin. func (c *adminServiceClient) RemoveDocumentByAdmin(ctx context.Context, req *connect.Request[v1.RemoveDocumentByAdminRequest]) (*connect.Response[v1.RemoveDocumentByAdminResponse], error) { return c.removeDocumentByAdmin.CallUnary(ctx, req) @@ -258,6 +273,7 @@ type AdminServiceHandler interface { UpdateProject(context.Context, *connect.Request[v1.UpdateProjectRequest]) (*connect.Response[v1.UpdateProjectResponse], error) ListDocuments(context.Context, *connect.Request[v1.ListDocumentsRequest]) (*connect.Response[v1.ListDocumentsResponse], error) GetDocument(context.Context, *connect.Request[v1.GetDocumentRequest]) (*connect.Response[v1.GetDocumentResponse], error) + GetDocuments(context.Context, *connect.Request[v1.GetDocumentsRequest]) (*connect.Response[v1.GetDocumentsResponse], error) RemoveDocumentByAdmin(context.Context, *connect.Request[v1.RemoveDocumentByAdminRequest]) (*connect.Response[v1.RemoveDocumentByAdminResponse], error) GetSnapshotMeta(context.Context, *connect.Request[v1.GetSnapshotMetaRequest]) (*connect.Response[v1.GetSnapshotMetaResponse], error) SearchDocuments(context.Context, *connect.Request[v1.SearchDocumentsRequest]) (*connect.Response[v1.SearchDocumentsResponse], error) @@ -310,6 +326,11 @@ func NewAdminServiceHandler(svc AdminServiceHandler, opts ...connect.HandlerOpti svc.GetDocument, opts..., ) + adminServiceGetDocumentsHandler := connect.NewUnaryHandler( + AdminServiceGetDocumentsProcedure, + svc.GetDocuments, + opts..., + ) adminServiceRemoveDocumentByAdminHandler := connect.NewUnaryHandler( AdminServiceRemoveDocumentByAdminProcedure, svc.RemoveDocumentByAdmin, @@ -348,6 +369,8 @@ func NewAdminServiceHandler(svc AdminServiceHandler, opts ...connect.HandlerOpti adminServiceListDocumentsHandler.ServeHTTP(w, r) case AdminServiceGetDocumentProcedure: adminServiceGetDocumentHandler.ServeHTTP(w, r) + case AdminServiceGetDocumentsProcedure: + adminServiceGetDocumentsHandler.ServeHTTP(w, r) case AdminServiceRemoveDocumentByAdminProcedure: adminServiceRemoveDocumentByAdminHandler.ServeHTTP(w, r) case AdminServiceGetSnapshotMetaProcedure: @@ -397,6 +420,10 @@ func (UnimplementedAdminServiceHandler) GetDocument(context.Context, *connect.Re return nil, connect.NewError(connect.CodeUnimplemented, errors.New("yorkie.v1.AdminService.GetDocument is not implemented")) } +func (UnimplementedAdminServiceHandler) GetDocuments(context.Context, *connect.Request[v1.GetDocumentsRequest]) (*connect.Response[v1.GetDocumentsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("yorkie.v1.AdminService.GetDocuments is not implemented")) +} + func (UnimplementedAdminServiceHandler) RemoveDocumentByAdmin(context.Context, *connect.Request[v1.RemoveDocumentByAdminRequest]) (*connect.Response[v1.RemoveDocumentByAdminResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("yorkie.v1.AdminService.RemoveDocumentByAdmin is not implemented")) } diff --git a/buf.gen.yaml b/buf.gen.yaml index 8e4b54834..b5bc57803 100644 --- a/buf.gen.yaml +++ b/buf.gen.yaml @@ -6,3 +6,7 @@ plugins: - plugin: connect-go out: api opt: paths=source_relative + - plugin: connect-openapi + out: api/docs + opt: + - base=api/docs/yorkie.base.yaml diff --git a/build/charts/yorkie-argocd/templates/ingress.yaml b/build/charts/yorkie-argocd/templates/ingress.yaml index 2505bfe86..ff1a01152 100644 --- a/build/charts/yorkie-argocd/templates/ingress.yaml +++ b/build/charts/yorkie-argocd/templates/ingress.yaml @@ -3,15 +3,28 @@ kind: Ingress metadata: name: {{ .Values.argocd.name }} namespace: {{ .Values.argocd.namespace }} - {{ if .Values.ingress.alb.enabled }} + {{ if .Values.ingress.awsAlb.enabled }} annotations: alb.ingress.kubernetes.io/scheme: internet-facing - # Set alb.ingress.kubernetes.io/certificate-arn annotation to TLS certificate's ARN issued in AWS ACM - alb.ingress.kubernetes.io/certificate-arn: {{ .Values.ingress.alb.certArn }} + # Set alb.ingress.kubernetes.io/certificate-arn annotation to TLS certificate's ARN issued by AWS ACM + alb.ingress.kubernetes.io/certificate-arn: {{ .Values.ingress.awsAlb.certArn }} alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]' alb.ingress.kubernetes.io/group.name: {{ .Values.ingress.hosts.apiHost }} alb.ingress.kubernetes.io/group.order: '2' {{ end }} + {{ if .Values.ingress.ncpAlb.enabled }} + annotations: + # Set alb.ingress.kubernetes.io/ssl-certificate-no annotation to TLS certificate's number issued by NCP + alb.ingress.kubernetes.io/ssl-certificate-no: "{{ .Values.ingress.ncpAlb.certNo }}" + alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS":443}]' + alb.ingress.kubernetes.io/ssl-redirect: "443" + alb.ingress.kubernetes.io/backend-protocol: HTTP + alb.ingress.kubernetes.io/enable-http2: "true" + # Set alb.ingress.kubernetes.io/healthcheck-path annotation to health check path in yorkie + # NCP ALB will use this path to check the health of the service + # If the health check fails, NCP ALB will not route the traffic to the service + alb.ingress.kubernetes.io/healthcheck-path: /healthz + {{ end }} spec: ingressClassName: {{ .Values.ingress.ingressClassName }} rules: diff --git a/build/charts/yorkie-argocd/values.yaml b/build/charts/yorkie-argocd/values.yaml index a5d75a9e5..44dc182a7 100644 --- a/build/charts/yorkie-argocd/values.yaml +++ b/build/charts/yorkie-argocd/values.yaml @@ -33,7 +33,7 @@ argocd: # Configuration for ingress (eg: AWS ALB) ingress: ingressClassName: nginx - ## Set to alb if you are using AWS ALB + ## Set to alb if you are using AWS, NCP ALB # ingressClassName: alb # Use same host for yorkie cluster @@ -42,7 +42,10 @@ ingress: apiHost: api.yorkie.dev argoCDPath: /argocd - alb: + awsAlb: enabled: false - certArn: arn:aws:acm:ap-northeast-2:123412341234:certificate/1234-1234-1234-1234-1234 + + ncpAlb: + enabled: true + certNo: 1234 diff --git a/build/charts/yorkie-cluster/Chart.yaml b/build/charts/yorkie-cluster/Chart.yaml index b8b2e2ea8..3d0eb1272 100644 --- a/build/charts/yorkie-cluster/Chart.yaml +++ b/build/charts/yorkie-cluster/Chart.yaml @@ -11,8 +11,8 @@ maintainers: sources: - https://github.com/yorkie-team/yorkie -version: 0.4.13 -appVersion: "0.4.13" +version: 0.4.27 +appVersion: "0.4.27" kubeVersion: ">=1.23.0-0" keywords: diff --git a/build/charts/yorkie-cluster/README.md b/build/charts/yorkie-cluster/README.md index 39d9e17d5..1ec2b262c 100644 --- a/build/charts/yorkie-cluster/README.md +++ b/build/charts/yorkie-cluster/README.md @@ -13,6 +13,7 @@ Installs the yorkie-cluster, which provides cluster mode for Yorkie server to ha Before installing the chart, you need to install Istio with [Istio Operator](https://istio.io/latest/docs/setup/install/operator/) using [istioctl](https://istio.io/latest/docs/setup/getting-started/#download). ```bash +kubectl create namespace yorkie istioctl install -f <(curl -s https://raw.githubusercontent.com/yorkie-team/yorkie/main/build/charts/yorkie-cluster/istio-operator.yaml) ``` @@ -50,6 +51,7 @@ Also, you need to uninstall istio with [istioctl](https://istio.io/latest/docs/s ```bash istioctl uninstall --purge +kubectl delete namespace yorkie ``` This will remove all the istio components including CRDs. diff --git a/build/charts/yorkie-cluster/istio-operator.yaml b/build/charts/yorkie-cluster/istio-operator.yaml index 4c1063a4b..28993e684 100644 --- a/build/charts/yorkie-cluster/istio-operator.yaml +++ b/build/charts/yorkie-cluster/istio-operator.yaml @@ -1,7 +1,7 @@ apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: - name: istio-operator + name: yorkie-gateway-operator namespace: istio-system spec: profile: default @@ -11,7 +11,12 @@ spec: components: ingressGateways: - name: istio-ingressgateway + enabled: false + - name: yorkie-gateway + namespace: yorkie enabled: true + label: + istio: yorkie-gateway k8s: service: type: NodePort diff --git a/build/charts/yorkie-cluster/templates/istio/gateway.yaml b/build/charts/yorkie-cluster/templates/istio/gateway.yaml index 905f3dd20..3d7d8a645 100644 --- a/build/charts/yorkie-cluster/templates/istio/gateway.yaml +++ b/build/charts/yorkie-cluster/templates/istio/gateway.yaml @@ -4,9 +4,8 @@ metadata: name: {{ .Values.yorkie.name }}-gateway namespace: {{ .Values.yorkie.namespace }} spec: - # use istio default controller selector: - istio: ingressgateway + istio: yorkie-gateway servers: - port: number: 80 diff --git a/build/charts/yorkie-cluster/templates/istio/ingress-envoy-filter.yaml b/build/charts/yorkie-cluster/templates/istio/ingress-envoy-filter.yaml index 027a93132..c05e63c06 100644 --- a/build/charts/yorkie-cluster/templates/istio/ingress-envoy-filter.yaml +++ b/build/charts/yorkie-cluster/templates/istio/ingress-envoy-filter.yaml @@ -2,11 +2,11 @@ apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: ingress-stream-idle-timeout-filter - namespace: istio-system + namespace: {{ .Values.yorkie.namespace }} spec: workloadSelector: labels: - istio: ingressgateway + istio: yorkie-gateway configPatches: - applyTo: NETWORK_FILTER match: @@ -26,11 +26,11 @@ apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: ingress-shard-key-header-filter - namespace: istio-system + namespace: {{ .Values.yorkie.namespace }} spec: workloadSelector: labels: - istio: ingressgateway + istio: yorkie-gateway configPatches: - applyTo: HTTP_FILTER match: diff --git a/build/charts/yorkie-cluster/templates/istio/ingress.yaml b/build/charts/yorkie-cluster/templates/istio/ingress.yaml index a4b481278..033c59433 100644 --- a/build/charts/yorkie-cluster/templates/istio/ingress.yaml +++ b/build/charts/yorkie-cluster/templates/istio/ingress.yaml @@ -2,18 +2,31 @@ apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: {{ .Values.yorkie.name }} - namespace: istio-system - {{ if .Values.ingress.alb.enabled }} + namespace: {{ .Values.yorkie.namespace }} + {{ if .Values.ingress.awsAlb.enabled }} annotations: alb.ingress.kubernetes.io/scheme: internet-facing - # Set alb.ingress.kubernetes.io/certificate-arn annotation to TLS certificate's ARN issued in AWS ACM - alb.ingress.kubernetes.io/certificate-arn: {{ .Values.ingress.alb.certArn }} + # Set alb.ingress.kubernetes.io/certificate-arn annotation to TLS certificate's ARN issued by AWS ACM + alb.ingress.kubernetes.io/certificate-arn: {{ .Values.ingress.awsAlb.certArn }} alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS": 443}]' alb.ingress.kubernetes.io/backend-protocol: HTTP alb.ingress.kubernetes.io/backend-protocol-version: HTTP2 alb.ingress.kubernetes.io/group.name: {{ .Values.ingress.hosts.apiHost }} alb.ingress.kubernetes.io/group.order: '10' {{ end }} + {{ if .Values.ingress.ncpAlb.enabled }} + annotations: + # Set alb.ingress.kubernetes.io/ssl-certificate-no annotation to TLS certificate's number issued by NCP + alb.ingress.kubernetes.io/ssl-certificate-no: "{{ .Values.ingress.ncpAlb.certNo }}" + alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS":443}]' + alb.ingress.kubernetes.io/ssl-redirect: "443" + alb.ingress.kubernetes.io/backend-protocol: HTTP + alb.ingress.kubernetes.io/enable-http2: "true" + # Set alb.ingress.kubernetes.io/healthcheck-path annotation to health check path in yorkie + # NCP ALB will use this path to check the health of the service + # If the health check fails, NCP ALB will not route the traffic to the service + alb.ingress.kubernetes.io/healthcheck-path: /healthz + {{ end }} spec: ingressClassName: {{ .Values.ingress.ingressClassName }} rules: @@ -29,6 +42,6 @@ spec: pathType: Prefix backend: service: - name: istio-ingressgateway + name: yorkie-gateway port: number: 80 diff --git a/build/charts/yorkie-cluster/templates/yorkie/deployment.yaml b/build/charts/yorkie-cluster/templates/yorkie/deployment.yaml index c95fba9ee..a07c01a10 100644 --- a/build/charts/yorkie-cluster/templates/yorkie/deployment.yaml +++ b/build/charts/yorkie-cluster/templates/yorkie/deployment.yaml @@ -39,7 +39,7 @@ spec: args: [ "server", "--mongo-connection-uri", - "mongodb://{{ .Values.yorkie.args.dbUrl }}:{{ .Values.yorkie.args.dbPort }}/yorkie-meta", + "{{ .Values.yorkie.args.dbConnectionUri }}", "--enable-pprof", "--rpc-port", "{{ .Values.yorkie.ports.rpcPort }}", diff --git a/build/charts/yorkie-cluster/templates/yorkie/namespace.yaml b/build/charts/yorkie-cluster/templates/yorkie/namespace.yaml deleted file mode 100644 index 2b71a32bb..000000000 --- a/build/charts/yorkie-cluster/templates/yorkie/namespace.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: {{ .Values.yorkie.namespace }} - labels: - ## Because we only need to load balance worklaods to Yorkie service, - ## we don't need sidecar proxy for service mesh. - ## We are only using Istio's ingressgateway envoy for load balancing. - istio-injection: disabled diff --git a/build/charts/yorkie-cluster/values.yaml b/build/charts/yorkie-cluster/values.yaml index 0772fa324..d1f726540 100644 --- a/build/charts/yorkie-cluster/values.yaml +++ b/build/charts/yorkie-cluster/values.yaml @@ -13,8 +13,7 @@ yorkie: tag: "" args: - dbUrl: mongodb.mongodb.svc.cluster.local - dbPort: 27017 + dbConnectionUri: mongodb://mongodb.mongodb.svc.cluster.local:27017/yorkie-meta ports: rpcPort: 8080 @@ -46,17 +45,21 @@ ingressGateway: # Configuration for ingress (eg: AWS ALB) ingress: ingressClassName: nginx - ## Set to alb if you are using AWS ALB + ## Set to alb if you are using AWS, NCP ALB # ingressClassName: alb hosts: enabled: false apiHost: api.yorkie.dev - alb: + awsAlb: enabled: false certArn: arn:aws:acm:ap-northeast-2:123412341234:certificate/1234-1234-1234-1234-1234 + ncpAlb: + enabled: false + certNo: 1234 + # Configuration for ratelimit ratelimit: enabled: false diff --git a/build/charts/yorkie-mongodb/values.yaml b/build/charts/yorkie-mongodb/values.yaml index b9e01f5dc..364ca8ce8 100644 --- a/build/charts/yorkie-mongodb/values.yaml +++ b/build/charts/yorkie-mongodb/values.yaml @@ -120,6 +120,16 @@ mongodb-sharded: size: *configSize mountPath: /data/configdb storageClass: *storageClass + ## @param configsvr.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) + ## Example: + ## resources: + ## requests: + ## cpu: 2 + ## memory: 512Mi + ## limits: + ## cpu: 3 + ## memory: 1024Mi + resources: {} # Configuration for shard server shardsvr: @@ -154,6 +164,12 @@ mongodb-sharded: size: *dataSize mountPath: /data/db storageClass: *storageClass + ## @param shardsvr.dataNode.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) + resources: + requests: + memory: 1Gi + limits: + memory: 2Gi # Configuration for mongos mongos: @@ -196,6 +212,16 @@ mongodb-sharded: enabled: false startupProbe: enabled: false + ## @param mongos.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) + ## Example: + ## resources: + ## requests: + ## cpu: 2 + ## memory: 512Mi + ## limits: + ## cpu: 3 + ## memory: 1024Mi + resources: {} # Configuration for Prometheus monitoring metrics: diff --git a/build/charts/yorkie-monitoring/templates/ingress.yaml b/build/charts/yorkie-monitoring/templates/ingress.yaml index a79509b5d..2fabc54b9 100644 --- a/build/charts/yorkie-monitoring/templates/ingress.yaml +++ b/build/charts/yorkie-monitoring/templates/ingress.yaml @@ -3,16 +3,29 @@ kind: Ingress metadata: name: {{ .Values.monitoring.name }} namespace: {{ .Values.monitoring.namespace }} - {{ if .Values.ingress.alb.enabled }} + {{ if .Values.ingress.awsAlb.enabled }} annotations: alb.ingress.kubernetes.io/scheme: internet-facing - # Set alb.ingress.kubernetes.io/certificate-arn annotation to TLS certificate's ARN issued in AWS ACM - alb.ingress.kubernetes.io/certificate-arn: {{ .Values.ingress.alb.certArn }} + # Set alb.ingress.kubernetes.io/certificate-arn annotation to TLS certificate's ARN issued by AWS ACM + alb.ingress.kubernetes.io/certificate-arn: {{ .Values.ingress.awsAlb.certArn }} alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]' alb.ingress.kubernetes.io/backend-protocol: HTTP alb.ingress.kubernetes.io/group.name: {{ .Values.ingress.hosts.apiHost }} alb.ingress.kubernetes.io/group.order: '1' {{ end }} + {{ if .Values.ingress.ncpAlb.enabled }} + annotations: + # Set alb.ingress.kubernetes.io/ssl-certificate-no annotation to TLS certificate's number issued by NCP + alb.ingress.kubernetes.io/ssl-certificate-no: "{{ .Values.ingress.ncpAlb.certNo }}" + alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS":443}]' + alb.ingress.kubernetes.io/ssl-redirect: "443" + alb.ingress.kubernetes.io/backend-protocol: HTTP + alb.ingress.kubernetes.io/enable-http2: "true" + # Set alb.ingress.kubernetes.io/healthcheck-path annotation to health check path in yorkie + # NCP ALB will use this path to check the health of the service + # If the health check fails, NCP ALB will not route the traffic to the service + alb.ingress.kubernetes.io/healthcheck-path: /healthz + {{ end }} spec: ingressClassName: {{ .Values.ingress.ingressClassName }} rules: diff --git a/build/charts/yorkie-monitoring/values.yaml b/build/charts/yorkie-monitoring/values.yaml index 6399e28cc..019af4bb2 100644 --- a/build/charts/yorkie-monitoring/values.yaml +++ b/build/charts/yorkie-monitoring/values.yaml @@ -12,7 +12,7 @@ monitoring: # Configuration for ingress (eg: AWS ALB) ingress: ingressClassName: nginx - ## Set to alb if you are using AWS ALB + ## Set to alb if you are using AWS, NCP ALB # ingressClassName: alb # Use same host for yorkie cluster @@ -21,11 +21,14 @@ ingress: apiHost: &apiHost api.yorkie.dev grafanaPath: /grafana - alb: + awsAlb: enabled: false - certArn: arn:aws:acm:ap-northeast-2:123412341234:certificate/1234-1234-1234-1234-1234 + ncpAlb: + enabled: false + certNo: 1234 + # Configuration for manual prometheus monitoring stack kube-prometheus-stack: # fullnameOverride should be {{monitoring.name}} + "prometheus-stack" diff --git a/client/client.go b/client/client.go index f1673a9ac..e3b8c30ed 100644 --- a/client/client.go +++ b/client/client.go @@ -28,6 +28,7 @@ import ( "os" "path/filepath" "strings" + "sync/atomic" "connectrpc.com/connect" "github.com/rs/xid" @@ -72,12 +73,22 @@ var ( // ErrInitializationNotReceived occurs when the first response of the watch stream is not received. ErrInitializationNotReceived = errors.New("initialization is not received") + + // ErrAlreadySubscribed occurs when the client is already subscribed to the document. + ErrAlreadySubscribed = errors.New("already subscribed") ) // Attachment represents the document attached. type Attachment struct { doc *document.Document docID types.ID + + // TODO(krapie): We need to consider the case where a client opens multiple subscriptions for the same document. + isSubscribed atomic.Bool + + rch <-chan WatchResponse + watchCtx context.Context + closeWatchStream context.CancelFunc } // Client is a normal client that can communicate with the server. @@ -322,6 +333,17 @@ func (c *Client) Attach(ctx context.Context, doc *document.Document, options ... docID: types.ID(res.Msg.DocumentId), } + watchCtx, cancelFunc := context.WithCancel(ctx) + c.attachments[doc.Key()].watchCtx = watchCtx + c.attachments[doc.Key()].closeWatchStream = cancelFunc + + if !opts.IsManual { + err = c.runWatchLoop(watchCtx, doc) + if err != nil { + return err + } + } + return nil } @@ -346,6 +368,8 @@ func (c *Client) Detach(ctx context.Context, doc *document.Document, options ... return ErrDocumentNotAttached } + attachment.closeWatchStream() + if err := doc.Update(func(root *json.Object, p *presence.Presence) error { p.Clear() return nil @@ -406,63 +430,104 @@ func (c *Client) Sync(ctx context.Context, options ...SyncOptions) error { return nil } -// Watch subscribes to events on a given documentIDs. -// If an error occurs before stream initialization, the second response, error, -// is returned. If the context "ctx" is canceled or timed out, returned channel -// is closed, and "WatchResponse" from this closed channel has zero events and -// nil "Err()". -func (c *Client) Watch( - ctx context.Context, +// Subscribe subscribes to events on a given document. +func (c *Client) Subscribe( doc *document.Document, -) (<-chan WatchResponse, error) { +) (<-chan WatchResponse, context.CancelFunc, error) { + attachment, ok := c.attachments[doc.Key()] + if !ok { + return nil, nil, ErrDocumentNotAttached + } + + if !attachment.isSubscribed.CompareAndSwap(false, true) { + return nil, nil, ErrAlreadySubscribed + } + + return attachment.rch, attachment.closeWatchStream, nil +} + +// Watch watches events on a given document. It is not necessary to be called +// outside of this package, but it is exposed for testing purposes. +func (c *Client) Watch(ctx context.Context, doc *document.Document) ( + *connect.ServerStreamForClient[api.WatchDocumentResponse], + error, +) { attachment, ok := c.attachments[doc.Key()] if !ok { return nil, ErrDocumentNotAttached } - rch := make(chan WatchResponse) - stream, err := c.client.WatchDocument( + return c.client.WatchDocument( ctx, withShardKey(connect.NewRequest(&api.WatchDocumentRequest{ ClientId: c.id.String(), DocumentId: attachment.docID.String(), - }, - ), c.options.APIKey, doc.Key().String())) + }), c.options.APIKey, doc.Key().String()), + ) +} + +// runWatchLoop subscribes to events on a given documentIDs. +// If an error occurs before stream initialization, the second response, error, +// is returned. If the context "watchCtx" is canceled or timed out, returned channel +// is closed, and "WatchResponse" from this closed channel has zero events and +// nil "Err()". +func (c *Client) runWatchLoop( + ctx context.Context, + doc *document.Document, +) error { + attachment, ok := c.attachments[doc.Key()] + if !ok { + return ErrDocumentNotAttached + } + + stream, err := c.Watch(ctx, doc) if err != nil { - return nil, err + return err } // NOTE(hackerwins): We need to receive the first response to initialize - // the watch stream. Watch should be blocked until the first response is + // the watch stream. runWatchLoop should be blocked until the first response is // received. if !stream.Receive() { - return nil, ErrInitializationNotReceived + return ErrInitializationNotReceived } if _, err := handleResponse(stream.Msg(), doc); err != nil { - return nil, err + return err } if err = stream.Err(); err != nil { - return nil, err + return err } + rch := make(chan WatchResponse) + attachment.rch = rch + go func() { for stream.Receive() { pbResp := stream.Msg() resp, err := handleResponse(pbResp, doc) if err != nil { rch <- WatchResponse{Err: err} + ctx.Done() close(rch) return } - if resp == nil { + if resp == nil || !attachment.isSubscribed.Load() { continue } rch <- *resp } if err = stream.Err(); err != nil { + attachment.isSubscribed.Store(false) rch <- WatchResponse{Err: err} + ctx.Done() close(rch) + + // If watch stream is disconnected, we re-establish the watch stream. + err = c.runWatchLoop(ctx, doc) + if err != nil { + return + } return } }() @@ -504,7 +569,7 @@ func (c *Client) Watch( } }() - return rch, nil + return nil } func handleResponse( diff --git a/client/options.go b/client/options.go index 82c50f1a3..739264c7d 100644 --- a/client/options.go +++ b/client/options.go @@ -93,6 +93,7 @@ type AttachOption func(*AttachOptions) type AttachOptions struct { // Presence is the presence of the client. Presence innerpresence.Presence + IsManual bool } // WithPresence configures the presence of the client. @@ -100,6 +101,11 @@ func WithPresence(presence innerpresence.Presence) AttachOption { return func(o *AttachOptions) { o.Presence = presence } } +// WithManualSync configures the manual sync of the client. +func WithManualSync() AttachOption { + return func(o *AttachOptions) { o.IsManual = true } +} + // DetachOption configures DetachOptions. type DetachOption func(*DetachOptions) diff --git a/cmd/yorkie/server.go b/cmd/yorkie/server.go index 7162727f9..558feea5c 100644 --- a/cmd/yorkie/server.go +++ b/cmd/yorkie/server.go @@ -313,6 +313,12 @@ func init() { server.DefaultSnapshotWithPurgingChanges, "Whether to delete previous changes when the snapshot is created.", ) + cmd.Flags().BoolVar( + &conf.Backend.SnapshotDisableGC, + "backend-snapshot-disable-gc", + server.DefaultSnapshotDisableGC, + "Whether to disable garbage collection of snapshots.", + ) cmd.Flags().Uint64Var( &conf.Backend.AuthWebhookMaxRetries, "auth-webhook-max-retries", diff --git a/cmd/yorkie/version.go b/cmd/yorkie/version.go index 1be123afa..573249324 100644 --- a/cmd/yorkie/version.go +++ b/cmd/yorkie/version.go @@ -19,23 +19,18 @@ package main import ( "fmt" "runtime" - "runtime/debug" "github.com/spf13/cobra" "github.com/yorkie-team/yorkie/internal/version" ) -const commitRevisionKey = "vcs.revision" - func newVersionCmd() *cobra.Command { return &cobra.Command{ Use: "version", Short: "Print the version number of Yorkie", RunE: func(cmd *cobra.Command, args []string) error { - revision := settingByKey(commitRevisionKey) fmt.Printf("Yorkie: %s\n", version.Version) - fmt.Printf("Commit: %s\n", revision[:7]) fmt.Printf("Go: %s\n", runtime.Version()) fmt.Printf("Build date: %s\n", version.BuildDate) return nil @@ -43,21 +38,6 @@ func newVersionCmd() *cobra.Command { } } -func settingByKey(key string) string { - info, ok := debug.ReadBuildInfo() - if !ok { - return "" - } - - for _, setting := range info.Settings { - if setting.Key == key { - return setting.Value - } - } - - return "" -} - func init() { rootCmd.AddCommand(newVersionCmd()) } diff --git a/design/README.md b/design/README.md index 9c0515a2f..bb566b763 100644 --- a/design/README.md +++ b/design/README.md @@ -14,6 +14,7 @@ - [Housekeeping](housekeeping.md): Deactivating outdated clients for efficient garbage collection - [Retention](retention.md): Clearing unnecessary changes with `--backend-snapshot-with-purging-changes` flag - [Sharded Cluster Mode](sharded-cluster-mode.md): Shard-based server cluster mode with consistent hashing +- [MongoDB Sharding](mongodb-sharding.md): MongoDB sharding with sharding strategy considerations ## Maintaining the Document diff --git a/design/media/mongodb-sharding-cluster-arch.png b/design/media/mongodb-sharding-cluster-arch.png new file mode 100644 index 0000000000000000000000000000000000000000..bc656a7638a15e1e391d6e6703e54ad229b3fc44 GIT binary patch literal 596943 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 QG{BWxv3ARtqr8 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⁣yYTPBFB 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

fWQ`Sq3~{>A2&Y+LhXf^$L!>OfDK+j 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%0DwJ|irHA<9@sks%+X-yReqm4Bxn6)H_ULbAx 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

  • *TODbjKCJcy@e~!+tFF)Fk5?O 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≤z8EM(a#>(!QD7RBR^I;hZfz8J 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 literal 0 HcmV?d00001 diff --git a/design/media/mongodb-sharding-current-relation.png b/design/media/mongodb-sharding-current-relation.png new file mode 100644 index 0000000000000000000000000000000000000000..c7ed6fee549e45688095387e15c6fee3b25d49ed GIT binary patch literal 384402 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�i8u}l$q)DJ{}L~-7{K#T(QkI7`g3JEc#SiXoqCDPXFwrFy0DM^2uB~r#qb>< zt`T6#SvI@6wmRLMa-DOoy_#_Q@*UpQgc3%8XPt|y+ZQN^b>fa&FI}3cLa|QN2CBRQ z(~Meu!xN<-8P_gUP4pz}8YPat%rysoz75%od4m|*t~x!zuvD0`nhJnr@AO;oB7s|n z`P9C@40OWC%ok@3z8%~biQQ=uFs8&(kc$J+!Mg7+n1jQ#_k#f!q}G$psgMRNQ-VXTpvIz6rM z1{x^*rd<~;f-{$9G`PM1mBgqJE2Ya$HEZo_aZy(#>VM}`DCC!c`=uSFDlc~VRk*Cq z`GsHDV>0ULulgO}XsHwYqiPONb$&{n|2&wk%#5qhkf5ZCO|9PKBHw={o56qvy-GH8 zNs6hWc{aDtuJz~qUaWRu*T2O%?wV69Aayv~!plMD^v(|sH$U#BXel^yq14?h$X^(jdAgoFJ9>mZ8wkaOO5cx8yK1ghdb8+>> z>Lh*b$*?rCkjTlY=mu|uU~#8Z00LTm4n5-}7r%ewn}Ko8g~1yBlWOpU zk2y;C8hv!l=izY+DD|l)IlT5jy2Y16_5s;@YW>klWT+<8V8b?Qa!)d=><#d5b5xjY~B+T&S z9dKlF%_u}8U`1y}yV3=aiZ~om1t|AB>V`pFkB{;@WWdJb&V+gy%w^8sJ${A)*r!>7YOa0oMct&F4q>UQvDLeTMupp<556 z``aC_hPS3!3|eQ>PoS`}19ms^;Y%p5)3pD2#Ib^-N06VApW z+i;w()gyM=6Z9{TCH=`3pNBqnYkSPU7L!&DIXk3(o_^N%*7+$Zjuf<#a6UZ<|4NAY zg|d8644FJKiO85dN}LVt8e?&kC*7SzopDH-W4coTQIraGn`3^aEHN}0+YckWh^-$e z7JqHxHL&X!9a13AiJ{=qo7Q1^J@pM}wcM7JN1J?LcJDNbSPm4xe=Qw*O}u{#viVSo zwOsFzYoCDq+gu|#yDM0atL`Y78M+=l6mSgD3l-C0OFqsO=8%t|B7(QkwgSdoZ`LHb z$U-gE|1QpyWy?8;^FeTA&)vZb{V3uDKmz&oa(s#!zZo6mwr=oS=rmYQvrYm+!URx5 z`1A!HsqE_md3Wb_@LJ!helJiY5oZ6;wOw=%2o=`aw55AhPzYqBg`oK24Op=sss5ii z;SRFN?W(!b{G((-1YddtkrUb4PSsFrlG|Wr9;uszk_A;atyjKDdZx$yXREWNfDjF& zzw_#lsEv$o0qeoT>|JvI`P`Et`4~){em{yHVWFKzkS@$(P2^U`Y~0z6PuJe)1y>(Klcrsm2*adAhi{Ax0F&uWFSfg;m60WH6-Y?kW{mxG&3s8$ zH-Y?Y*f>6rxgHh3cv8iJ3b3^a>f{OEpP9$M-(69cfn0bFVuUF`24k6iU>JO=3IHnfzfBpe0=^E&=}v4p z2_ls}S}#xs;!gmm1^fnb5U0y(wo|Q!1wDZ(U3##UTSE~XhAMR$H$YZRWPR{Co7B!R zQwp!v!97!(ID0PK7Ub0x@$%q1f4+fA&QuBZS?otBtutX1JA&rgRgaCA-Z-Ozp$4(G z7{pa5v@xtzYtl>sSr6~*cx<}wGk`DW=YKQrYiFCFd|wn5W9|kR;#jm9znua8Id(Nl zP$@o%nIRh6RLWIB@*QW6!HgQvQq$j@tuf#EGx)}E(PTf;ks|1!#9tK#D!euQ{wx91 z9K?K=gry=qThG#oo9mk?IT-NqHBDAopp-7`_sx+_4;QB#L@x>X8E0Y5 zvs7HuecK39R$*r4dWG*&da_oRMa0SXjYR2>8uIj{nsYt&=UoBxGmjM5Bw8Nr`rKx8 z7&{)Ob=P1R$0_n+t-t2lBUW{fH?1qGOK~{`p@6n1jfRZ+!~;)h{F0N(OzUTX9m?IK zWU7yT{WfQdVuBL~c+Rb;mEBc-E{pG!ZIyJ@;VF^JX%XH~MykOi`(Ur@tq5)J`zvp=M_d4TBR zX|OoLXOlM0^f0pYsl0@6@B0%%lI{iwmdGY284K{AVi%U5J|$<}M`WRMocNlYJ z%@=s=MFo+8)RiX;J;}yzWg-z6J}X@$|1ea~`9w~y35zrG8DnDTl2sBqlBDkdV)O%W zNTgYPlpx?&|A{1N01$R*a3)Pw$2u>y2=rY(7Ref25%y|xBt$rpM#?f#si~N|r_`cX zFQAabam+G~%H`0prRb|_MPFS@y)(^8xENcl0NM;G8R_g53M(|rOuq3Eh+M@wD~cxcw-EzAbk(osf_rUJ7Fg^ zrZo%^Vd$94R)--%OvffwD7b7Uc<|Fs)4y%%@4*7#BF5PM7k8dQg=^zpcD-*%XEj64 zJvXm=%MAk}RJ?D+<9c_r6*Ufrdh0b@3cG8XzISB^N7f&rRl#~{CiLkp+KDH|3~&@E zevDGHSNKu1t4|ndS@5eSQfeRUUgR&L)FLZvcKw^FfrC#l3#BL%!o(K4$xR$Ca);Wn z9n`k8uR?8l`EQR^R!rpHeaQBui6Iq6 zIbtkeLq5}TGO%n-FdgWB67f*A_l<(vq08EN^%`p~_AfOZVg&rOjWmE15#maI_6PXu znGfe5UumwC#@WZy=C!iE^=oA$>An6mvyJzmZ!q9Nye9xN&ODSLG-7~G^MveDDqP>y zt$1rz?`Ln|Bp!s2q|?eLgct~CBjv+;6C(%C-3*PX9wkyy!$13IbJQjZcq(3NsFGXh~%5N#Yr73^nN?%?fz!lcwq6tV zu32kgb9eEjJF?YvLN1Qg2XquSIiqNahkl4igI4VMLae4fXq0S`-ViD=?sH|>kp?r# z67S2dH9ls`oHCfJi^A_0x#KjLBqd)}B4)N$xu{#>YsMXcSpM2Gs!WQqGxmH7-T&S7&2!Kou8F zVbU0tf;J1?p$VSP>jm00%z+~%Ha`482sR(u-CPme{^vSJAj0@(fN6RcO@vWse|$mi4H?!OUNq(oSTKoFFc=9sPc2A z9Obhl?fCyJ1p{@@(6Zm*0@r5UZU}G}rVi?Ge1zg~b{z3V1-WHFYirII*>BHiGqu!O zWerK&#mX0!&a-eAMac1`U16)fnmrNth;DmWWoa*=axoO~=%!l-1pj{FB^~w+qmfiP ze2l!_nxJtqpe61#{Ppec_1F9(-t~lMOs6~`?;Xc*?VG=IQH)~HoC#91TPMpDS5|*)Ifn_aq#W&x5rA`Na$jC{E8RFXI ztFSfF&w*M_HLDiKm9K?zd<{Ug&*iJf+asS}bEd{th;t<$BL8FAtYdXHTF)F)%}&gb zM~8TS1G)>8Ec^+RT@6%MZyiRr@7k3kNLL?Ur4Twxb>NwN(s?R}64#tba8_-+*eQP5 znJ=W%<@z)MU*ev`|1=dn~Y(iwS1i zICNCf30f1}Zbg`rRB;n}m=M7ZmE;HkE#~}&g4F|t8kghY5Ey7oWiqT_ubrf$pvRSz-#pJh5BD2&WCEp6S-9FvfI8l z6lKz^qbtP0z=t>P5)Nj5FGX1qoos2GZP?+bq-*qX882suIRYDrHEft!K@egz~qLn6P1n!8(c`V=vyYcdgz5~-TbGc!=VWw#-&llR`5qy;-LGOG~ z7`{EdZ9tl?=w1J0|0W|`;epw`gFPAnA&_HqU2`$OvYn3AvF5a3QAa-{`uI&q9e@~k z&;~sBsSQONsvHC%OKAZ|#dcL7$E2iQ^RTU?Kv3))2_=MIG_gljvKD3I|RgtTSJ$M27$=oJlKkQHvqtf>8YsK*c*<$6f~L_SSrGE!or?h z4V%6@dq@+S7J2OVVJG7e<4bB~b>ve!{PXM9rVujI4z@_l(J(Bd4z@TdMKx$J^nv4{p!!P0}@8H-~! zAnbLDxvo4n@Q7|?Q0~dZUP@f&Tz{X<{2<*?sukrgMrfG`-{qUX?s(4$5Pvof~YD}kGxtTZ%)R4`i?y3PT% zc7j;F*##V5up4Vbn6w+eYX-#?DK)w=T>`R}H z`FP&X+Ad$jg|jdEyMU!tE057=*UcN0c`Y{|T6o;Y1`cPFN6T8c`E8Gh9 z58i5$s7`g3o2k*(Dtbt+>ejdx)08tZKR*@GEfw^ z9ygAEU3>)7izxc~qwe}y?W3eFVJ5wxFK39q(Fq8`Db|Q_P3J)VRI2<({z)hkS|dkj zsqorE0wPGTb92bwK^MJ(0SC5F-novZSDB?}Vba*uD~RtJn5xy-_g21L@A<@qHR*rp zTwrfkFzT1dmspki>DNK`^*Uf&qINHNlaGp-s_uDb&`Zu7d}~F6mNb;;eIR$sDkRAPqYF!tb9Y$!=iqwGhx`LP4;Dq1iyXY(yKmN2*GMDMaQ^ z33#qR$2AOq5qDA6A|kt3h`F^Wv3qe@b0ny~eJfIy8hFO#^eE{~&^r$F zU%<}fWJ7}Ldn#J=zdX4HIh+EnW`@NY@O*6W0YnES1deSFV1?y!o@=8KfriZ<`e@G zhINgmW^WKs0$)U6JgAcn$Uv~zeCIsaR@~Wq1k`M&&|Y>xLS!h!$iO-dAY&AwMDIM3 zfz&euvq6i;{G-?z$>35#b+`w%n~kbXdny*#FhUh&-OCf@SHjK7)Q<>?cp}{cqwp36cjVvbt2>UZsA~4p!szxg?Go!p6=Qe;bP%dNZVMW;%qM z6OKC&Q(Pp;z?l%v;CO%C=C|19f1TmIv0OjeRC(qxA#8q7H)U|$WN)51WnNjw+Ofcm z%9V!uXOdwJWJpHRTVVE(Mvp!aIA?qqSR#|F3kjm06wo}<-l-_fAdg6FeTTPjkc6ME z)pDa6y4?CQ2J&}viZI)(W_K;Pn3lL1c{|GVyAlPypk2b}Ai`b)uj7L8+3up?YUz{3 zl2JqZy{Wb2nFz7S2Z5c0n7^n49>9>}TLZ`+j|~Z>G)ZIhpC2qP{stMuFE=zOI;!fhIIr}#7`56k{i!HYpm zImdHnys7X#?%Dv)_O_UPx)@(*zJc`gss^BH9+5x4QGeGm!BO~rAF#04-WJNqu z7N(hr2fnlOs@Q=gtYVZ^CHII9 zcgU2WuV#_sttbxxyWcIh;k2sm&anJWTh#KU=6#^GKZz)oSe6wECUWG`8SDDvY#qCD zgnZ-M&$*hfPmajp;4zEP105*Yf8b_(`tdj_Pz)Cy8D48dbIIFq{h2c^yqs!)m=U9a z<_HS-s#w-{SUxH8gjj^b*u#1t!s0?hU#eM(|LdzYxX)`CJdDPpi^nx%s$C6?PU0S* z0%O^jnkl{no&c$jHTYhA!2L1KNQ^QAgdo#oGT%&LJJEp0e}{k!PgifOJc&bzslz{= zcHsMIbx0MHK?)8QnD3#93~njIZBfo3y5EX301 z!JA_ZaHG(({PPuT@B@0&5mVFwVt;?^tb*S> z68Z`>;V1*dctI0tRCCe)evn1QL}niNHYjV#C`QRH|Li>#_|~TR^qoB-`}>WqO?NnE5IIZOqHSN>!uzzplt<09W8vKHUWG?l%gJnrV4ek$JXj}Rc^K)}YVpPy~@bhe(WwY-V6k@|O^Kqv6EZ;por$nc;9YYZuuSz7|u zsSU_OGX`mmOTt$}o!Ul5``_H4bPojHxU+!hswV{sx^*B)M1LVy3cI-~66EB|!7*3X$*g_{EPnOCd0`gMYrko;3_MD*rkEZ4dj-&C zANAQ&BK~$jCo!&0tH)=sB!2^v`iTv9vS;gVVD_hf`c1}VHbgAceJ|*utDC%IVgO7l z%0Thpz9Co}S;H6%wC0}`ne7RBr8EmjTfuq^sEXK`r#VU+q%;)30)hBLJtT-Na&!3n z8a&HFCP;84Wkk&aGdP7@94KI#2MTjI8Jhr7`sQ0An|t~j5b!(UUX(BLWyY(E))Xe_6#@2a^#pMUu)@!O}$ zW>XY+t)JGT$^XVV=3OUHLiqXI>35|N(1O|p7M~+|9$#8jQQ-XmE%O}o^BgEy*aG9x z0ui0`(y?9=dmAVRy%Y8*Gu-Us_`U2+7>=OJme_Z8^q!qqXjOJftbL|z0YvJ%6pMi9 z(>Z`$uB}T>Nm4ohPZ&2~nl}UL&?%>+Q-=P&?l=NKuwvzxMYGHHYY-hdyJ}P#{EXt? zAS40e-Dq@lZ91lZXVCt#xU zb4%u4Z@=T-Z~U^4uKnWc`$G{jFeKXyACdlh7Ysa>LxJrn;CNdA!sfScHa6A*m_-jZ z`#;j`WrvYh1I<7B<D<{GR93%@a>u+m8Je5+=tcLmV-_j;V1r{BAwFax{ z@})%}HMfd6!T1?~b2kv4SOs6 zNh=th#=Z4oP+XKf`8f54QpLBFnEMC_;x?-P;8X|td0c1dzoTK^i~jd*Bvg&S4+AMs z<-Qf@YwXkm)er_k;UZt?pg;ynPJX<8)GD0N`mmvffB%j_tbhjwOrxx=%j>iZl!`bX z20{@uiNXD(wqcX;I(Yq@l@lzu4WDfnltxkc?@8?W14jxQ00ToeM>DY2SPCUDuqe?k z2A0zMmWh-P+5Sy*h5*pbuq?HFoIgN##|D&Grn1Bzj{6Uue9FN^o=~59$z}@pJX1gr z$4J8{M=Z;}^FqWhD03Sb6Ins#ozQ*c~OJ7 z;c}EJfg^x&GgFRLE>>vP_6$hvkV%z@WpN(0RdV`UzrWUjhecdp{qXv?zaI#?i(imE-^ogGJ+ zsx(~W1~eaH9w+?C3%C2_HXNmAT@V*MZ6^-~p9A6|b~)`_)P{8+IgU0pJnl2Hjoxtw zBuRe8O*L;@cz6R$F$7cr>siX|oOR_MH+ZpZpT9+StYmBdv$7DW6~Sxh_-I^ zCW9gkZIiJFGOcLg-6^!w0s6Y0VPe(F^+bwgzy51TLT(s-<*jLb8QwS8V4`gU67`G8&m%j+S*F7kd!Fwo#SN~ryCsx)8 zC?UpN<|8htd_YU2c4}*COd9A)xYuY}AaW0@6dWvG-5Hc>v1linReui`qCG1t@#it{ z0&Xn3KqIUU$XMurWzH6~EIN^;+%}BV=>@y`-2KhyedEC|OFV^-vWu&?b#NHKKqMN#n(>9Nb^bc?(FNoImni@cx$pv(arKbCL-7z;H0&VaH;Zm{o`i^Sh&zyYX+ipR+U5=z zDej)w;FXGb9?VTywkT04gD@n5B(t_wh_oUtQ5%q7fkjHivmkE!QVx> z3nH*U$9FS2YoMVKH?Rb`lkrFJPd%m@>=(06`bF;rTz@ACya$$g`}R)C#z1{=?q_2y zhbkreO;6qNPoU&fP$-X@&fT_Y97eYBIF}?xAR?AlAS8CX>fd{~2z4NfoNv2Wb6_Vh z&>3{a1*ncbw%^kCkl^q+5U`#D5z&I%a9I{o5BJ^`v>DXXqQc`JdoMO^W>`ZBrJcy{ zqdol$TUyG!^j@`ugikzm_b>L_;)i5#3tx}f(hkO8V@Rnv9<~UTd!Fh z9SnGI$H0fj6VKheFqIg=qYI5GU5@FJ%U-U~3O{%TfT0acs-pI-PTMv#m`PFCp6_+R zZ8;3vu&uno_XAS!W)cyDd^ae_OK!p6i}uGO z>ei@;r=B3Zu?2R6j%RqsY_1xRsS=rl^_(6M*_OqSp=4*o5d1sJ$IM{JN3%2tkn?bm zHTr@DaJXHYW823+fKmozVp|Fnw=6qgp^&)#PoQjT_jKg&q8*x4z5tf3IR+?K-~?{y z(4OKck^V#u9`+F5VC}!S0`{*%o>Ioxf#3Sl?Os1^BMRN}Vet~QTI<0Cs$U}p&TE&~==XK0}OX&sH7#ivJqWZXd_qa zs7LDED?Ba+&$m7q_?~IHt1G%O!vY6fX2PHdH3rDt2VUamix^VgQ2dcp4}L31bsCT` zh5O@F^eDD~b_DGW3BsJkpijb#M71U}XZp}N8U*42{SmLiGPiq=C zA%Z~p31ItPgCjLhxna@t%ir5zV{=#>sPhGqs8!G=$31K=@J`G~KyHoE3_SH$pEJ3l zy={0{cP<>>+R5~pd=F-YI`pVGpV-#U!AtwAqG^NJJ=|q8T?;AE&PFc9&I$kzoGLG& zb0BoU2m3p7$WvE2N=-`kdYlyy%&{wOCo_lcXh7rr#`R5&vbFGz>^4ZYv}{9m;2Km$ z$%>RQASt5vp+x(wn9*d*MjFSz?Q0gAPw1lI(@<>D?M94{#K1^d*qN3YivYV7YPy+- zr1WA}5uIdxv;}GImIKX~b#mlL;kQ$_<0&C2noo35*_QLp`pzh+Q3BPV#DSc4P53A+ zY3(>tW02o+-s5brJIn%A>UCb_v}ZruKve0FfLd8+mNjMeqsleE=>K8wE5oW>w`g?< zh#(3|D2Sja9ZD)n87SSIf^@1h0xl4fQa~D((kpS%$ni^uuk5gO$`RPy* zuVruRP^EcS%J}dq)z2@w359>Cjl#?-z9K&AlP`@4;xE?_y+D1IIxKPV*6tc6n2a!z z$HdPbN;;vWZWys#0*CjG68kz&1d>75ldUkKA@{_)U@88OG8a~C9%VuIsA{{HGx!MG z7YTkTYip!+IU$?eimtRBc|SslB@1D6VYsLW($>~RaD1aEd+y5_v-nTQ3u?Hze}Dc%dB5UNLj7S#lEAs9~Z_d1g=z&{fUI6!wZ3Y zuoItVhaZvLW%xq^A%GQ7*+@RPzE&CCoC&F&b;7H=UaZC~(euU|8{p8Otz*@nn+108 zb@(^=NX(sRmxvA;9zc-+d~jl!SXm`Jgq8G!JNGs+jUI{bW^IVQFqF;wA&xQxD37gq zfsUyg9Ga&!qYoK%LU(YN+%? zT7G*0eAh-+48?{kILr;+IVMwZGLt0SzG^Q+Wl9ti%?!suuEmq`Pv%XNH&_NlF*9FX z_0Fo~OFa^$uQ>So)%b~~i0V7#>M(W~JTb{)wxgGirQkDflf!YkLqfJ?bA0zI7^nfS71{~cU(MvG>_U9#u1slJ<+p&%@U zs%)sVMbNEj|9occ>lfF>MDY&8({RF>YIMQwO`oKk>ls%n$aTpoa*OjaY1g3W_@)B|To@9tt}dycMH%yb}=NS)~1 ztJcfk6J&lxfb+y^{-0}$^clr%3c^n2!Z#dR#RgEa9qRu4GM(vrS-I=%l|n_>Zh}wt zgdRfHlLhTwtq8>g7;;k2(Guqaf3daXl5gpe0mBFhj`?6Y|fICEMkU2$743z7MEE^SpGfY0*d-YZKT5g;gOIb4 z!|?0up_BL*a>~r6B*;lj)D#c4L$^;Kx|Wwp;l}97^DaBrdov^{QzF~VUe(R%~T%Y zP0EQGOm%vYG=-!C6oE`}AV!tLhFa*ob?V;ZA!HaUM{dMaWVPI<)CbaH;>Ug-8{Wv- z&8#s48|`ol-o3_)p9)#JIuw8?`f9dRe%RnB-bxu)6r1d6So}x+w)j(G0m=LhtGHwa z0YL#wk}wA6;|q`h##R7z8b0_tK{wg!-uV3*^aDI zYFUz{37r<;p&?_w2HWeVQ=4SgXZQpz+&7iyla)Ih#(xSuBr z9;}-hiy+f}X_@q7d(qeDg~-xi{VUgrB6GAu+n!ZkStzVQ=6Ln+rYpRYr4*TFnQ)pF zUoC5)`eMQj_xL**1<<%$R1jUcBsk>4+(b7$*+aINNWdZ;eYI~s#RsAxYr9?djA~7F z!$E1N0em0&IC75lP4RZrK{a!li)Mh7Srd6=*J;VrF?eJ_t#qQ0fhfI>t1yijeb-}Ac?9f`ABuaK;76TUvCSP&?l;%*?G4xFJnzcQPx7FHc4uUr*z+H}yX)BrRvT z1$COdSP5i(4a$2^Y@2|+a;V<9*cb?rfsz8U@nAUImTnW9Kf%y;Cg|wRnIDaV+rMDK z24(svQA~LZf@G-Z0Q|5Xv%Pe?c$&c{`stID}eO(2+PKeQBO=vLs#uix%?e%fgi&2QFzE<^<0 z(Dfm{u7nsEIjN7NNqhYBF~IUaCTRe%g4}_POO$c09586 zh_%-~E7}O6MOkPeYnsR`NMmw@N?UmVMi&9I!T3Au&7ws&YWyTDhJqcL=Q^ZR&Kki? z8k)K2CMaGE^$)7^tDhl2C-k^oznr&9{J zo?o`^cjXv~6Yc|dx6jxrM#zrOVG{b+0>#P9-72&dozg`)&R|$1?H{JkuY+o(5W6D| zP?=`AL^70d{19B?o}MEO4SE`No*oiSJWd0a$ZJrdN2LnafdXU#l|y(RA1(3QAOMHB#Lb@z zCny(i4$(8nSM1I)ky{_t;U;hTzz-S(0oMWGKYqn2b|q3r81$@I!ys{2Q!akJghg0b zsshI&=yIi%bz@KEb&5iV{kYM+fkSwV<9AFBA=M%Jr8-e!fCRn#Wa^z694P|ZT7ixD z{we@O=EPUc?4qMj^fY0hDU^_>e+(Z*2d)&e0|l9>hS0aVC+B-EoJ;VMd?XdrIZvnx zjC?CEQ9Y9Ram&sWP+X|VvJxMHkGJ+R>AIMONa}&>Jfa&C`zwXM_tt=I`IqjCZR^)} zZs{TDiQdT8Hh2$O`-%TjZSX*uYcdnkM=I3x_KR%9Oq#V2#8JZmJpfoz-`T!))r z5GjT}J~~Zd^Z`^9d9d@m9apJ;!UCnp$##W>;%va1eIr}#24@2y4++pa@GB(~r58bk zAHhPU;Sg*_Sqz@L=S3)#h*4zFOFi+5Sd54C_BqVkX+#>)6eBWX)E2M>0~R zf)!{_Uf}Xk_7oLIJzQ*fmRfJZNUA>Wfxqu}SN0UX`wmvE!^I2HSf@&K#FT@4vKt10 zow7){gldEI;zataf^zya^n7R>qO4-EcfBk8r1I^9?iWEG)(Qnc-~9*Lvy5v<=M7K| z_4>r-q954t4N-Ujc%0X6gfGF_rvbR)ee)(zC(L$F*CoF`#@V=DeyqF@|0*A_06xT< z|GeYw_mw)1L*w0L&G{!arL<}t>vuTzuLmpoC$kK^2h16yqxB$8P4-oXiG##Cl$>u{p zNH}TE@ZBwTsc*#NS8T7m>MZ=^(3AHDIF(PX>vOy2?8;z%h>9@ z{@7do`5;0*Gn-;}9g2UI?s2Iy%#%2%uon|(+CW&?6tJdPF&aq+Sr6$&xHqyAdW-j$ zAsIAj?sy#ofJJ_ns#bbc&a>}t0jr;%J>Jz#M(8sW{1zcJK(g?S^8%b2O7B?*I$<8i z6`0nY!=bw}p37N)%ctSDG=*4~kIX1DhqJc@>-`TVe*QkNB9J`pkXbK6 zXSi_ z-!=aCuKu^K{{Pz_BBX_V@dZqcHAjA=Mtn@~?|(1(KG5N)(ZtaFzF((V_W{XR-CuSx zJ*gQ4hgaoSd5`=!yxE-!=1fbe9+pO^q zo{j{5Io(6e_MN#Ol%;1+DvO)G-@T#F%ZZ=<*GTgki8Rg{rsTgP%|CfQfBUy0sBIdX z{M-L}r+@o_pa0{AA`;EGh<*P-Ci<1n{H}_Ar#AxdkVTscKM&~N5BirI`vtDvhGN3! zo6%c^|8m`L2uv*?BKeQU|MSn2N+9pHl%1F8KVI_3|3D8yEio~1%j|cC@GrOj`#;Yj z+^W|h-r|4x7Jqmv^Z^lYJPmF$`ywCfPe1VU&qU9`XB1z_Ze{*2*S!yfn$QTk_+L%V z-?#Ix@A?@+*t@MuNsVy7{%_Z{hE?!jHJ11P`cwN*uYeeK;&a2b*nhpyzkIklqzPf| z9`p+$|4;9l{(p<_Pp{^Gi|>!i@PCW%k6ZYEk?&uE&yWB7e;4_ZuA)!!827^DsmUX~ zKr0!z8z{rNIC|=5Rr~MznOO`C@JS=m&1z1A(!Co7P93`{C7XN#ju^@s71l9+PC&w- z?PUaDMUH*9M&jcZ-gTud0LH99ub^7t?q)GqcyEDXx8Mm3zv{|)R@O5ZkC7NZwH)g&oDKB7A(;Jc1SL^JgV*CWW3xYXHSoY{$ZT~;xA zB{(0$Uc}dlI4)?rg0^lB=3L$1AAyv_H=n1JxFXQ#)Nk9kvh9_<3T zb1O8YLkbc(B;^{?U}!x*5J?@)Vd`2o;?>QSc+y)GBQ7}e`~?2fV5Fn1A7r2_`&#l( z$KVS^QMYu&_#Bzp@EuHq4^A!tw4@HRPQBJknYrZQSypbb_&P#;dxRhvscm=4$GbP%=9fYyffdErLBjf?hDULwsp(7t! zPN0D)Tu6qdPRO9?fGg4kGW6R39&EK0v$shHqoZHa!Y||7q-2)8o2fy_a9SXf4{};*fulowk%7NJ}07#Sng1YN`p3c6dSGP`QK_i2^ zxB2A?%6mqN-6N>FRIB`9QIzvU7)(1V2@_AI5Hz!uLpm~d$jRqm_?_+%jWBd23`Pwl zU^5D@cFP8*@B*MC2>}eRhxg+#Um-B3D>N;1WN@~~2#Ud{%BNE}H(7au_JA_--jDW5 zxHvwgQhRALk*+QbOLu^+Kv_BseU6ZbT^PMfkPoea$$2LWR?hv|9U*$DE|bRi!IxfJu4Ra9$;yF%1Y z&U?TGwJ&7+f>G-)#c3@_S>Vlt;&d8rr8J7_^Urq?4nRwAV6Eg`TON>?8wQF@I!@P< z%R*A*m+#(sjUfVX2_ppDhKcC{pEOx?52N6vhPVNFFPM^$J?L{dkQ$bCgt~H|Md7HK zT?*K>^z~i}`g5e}NvSer|9%jNE)&Ac?M`xOg?8@C)Z^l;Zs^~=CC~f86hMkG?>vA8 zeSZNE6uP2t!D_l@Gfa%Z36LP3%1n)xybKIBZ4PSpt=8*D$JH5XUy6xZV9f-T;_Io& z)R{x-kKi=}a)eRmw8o`RLr}}z{=$qVPn-r6$KL8{s%2WLvxnUZp??k+5;5u9p&0yJs^dm z9+cW5aQX#~Z-=Z6X_?6S9W5K}7uyNKnLzW%g&r{7v;+2mIC-6 zI(11t*>tCc@!1Ry&h%v3K)fV2@!!(i9}~u7QtU=!m8;NiF`PUIOhN-{m4xJ*e3lxY zy6L(C&Dxuc#;Uy+uG(?J3yG!aDgqoy11y5mz}sa!C1~vZotnA$5Z(I&&_#1X*yHu% zZ4n?-&_L!XTediO?YX{PDVfWDX;r%XktG$OoDMDexZA8jDr*pd({MOwt1Y1+{mEb9`!ZY3kwY05!yJlxsszerbp z*9$2bk8l^d_7c|s6&t^LT&qw78TUtmJJzKKE=qbu=Y2Z;6Wj%`vD4s{X0NFG$hItN z$6=mO&d6VACWM&U zahwwwx>tsqNktIs5+Fe61TdC5C3?`Orzhe+;HziVZ~?l8SFH+GEJO4wXclI=&5(g) zMej68RfuChGScq7(X!40gt(~4%W!?R3}xD*=TTNmKx4Sdib+rik_>;j@tG;cr%7>P z2O3gCxR=!hI}&6FTEWcbLrkYk`osy@jn~Pu8y#gZh$L)xbPq{E7nnF zZJb`Ey-B8{c7koQf+}SZ=*Br9Ugf&egi*d(;q#P2)c5llJ zI01vRSXfQwa>^r>(zwb-;8@Jz6u-{*V z7G8IS$6g$EirND6498;#3}$z_Jk-OPSQQ{sDvNA^>(%56GjocVC^CW7RWGR`ml4y5 zy;1>)b|IGR!A^lnQof>%JAwgBsn>~Ogn4*Y zH}D?hs+cROg!3P+tv!o=ap)ic2xL8|zDa&ZC$|M7ladkA)Ohnv8@uZy2XVZf3lI(* z>8gvLCq^K=o(eWtdd05hbvCKZW{{~l#M17tT(;M-t5Lk5E+7~0gccoYUArN*@iBp> zFnaj2iDC(y%2(9RqbncQEB>Or{PiG#j}82mlo3TSQmp@`#Eua)NfP?xST69Li`#UF zzSK&Mxyy2(WA}Z9^)`F@v42x$SS@es*~m^RXApN4<(ppcj5(HfE5~j6jEAqVbWl49 zUW%OTP8=jdqVmBbA5}nX3 zfHS<2csSU(<4UoQZfAL;t01P)HRWtws)JKa!d~XPP_^Nw&H+8d8$r$;9>wd!BzcX* z$KE){;_2)RKeY)H5Hc=mAAaf(Cg8%xoSB_cLtKqNzx*UM1WEmjhC4B0!ixtow1vh5 zhL3ZKmG5m&ij3)u>&|KeCuW2`lgfu}HF_Uwhr{_rW99GQJ&ZTWaF9!1Bg3y(VEEZ5 zOgTi$1Y{H`+v=04l2z3*gn%AKwT=81%WCwE=N!5dLrb130>e&*-aFpCq`PHKkT`uk zT}|8_?2K;3SPjecMLiX`nbeTEGt3)f1l%{~)$+>1hxK3gj<_nZe@IuGa7S88OxDrb z0yB<{BI4j+{2<+L<*)1FH(Yg-bF}Fh#Tu3K0sQ;I5w;$21;UzPIQ+6?dL6wm0Z)!8 zo6fA#lezV!$zon#XY&N!pS7l`#=0C}uP-&ar+wMxV*xjo*2PPxz7zw$C)XuF6;b-i zuI5n-X0*PAIsO>8eqEP&Qa79Na9`*YATq?{O`aCE=*@8%C-kDI-jiB+r;v z#V-&{PLq_|TB(kt$K2}quoyyegwkba(pH)DWPAi*_jw_*E{4thTr0uKfR84_HqIBR3TtQtGNMt-nApT_~Dql znvJqq0M~Xk&CtnCmQ2JFzVymsX4%QTdMur*m&S_wVOF2$N8-Y-?vo;PzP$~(%i}?# z*F|)d%FHf#9VH$LC~dP|&JOk#Y2A+Kg&DpI6TXB#5hA5+uGQx*JrUlp|0)?&s^D5B zqbMe3^Fd=UZH(qF5LqC5q&YP}gAH90kJS&cR^{%H(H3ZMk`TKw-bQDmYejX#Cxojn zA2in*OMDu%VGB}|6Z10o)R7V8jqK|0>BsIQ$V8}enzH%BHi045Ah*F3eG58U>a$G(2}ttRfbrzx)~% zKb#~HBDa&XqBzPDNPYwl#BY3o?=&V!)+3mR@LY1n@!gV#>*})ay2TCqSd9~OO*wM3 zE&AbXjM(;WIA;rIUBWLjGxM6AYN9;BbTHzFtlUox3+Mcy-7)R^pU+?J{$5dAL)VU@ z_gfFTJ%>gnQRmjsXr3+^C_CzbnXZ|9bl`}s+?@|ir}~p<9_^8P30K-1N(GmmX%ur^ z6Qktvwg~`M0+BgR;9B09u0WCD_e-ON&!bNq5~+GUl|YeMHfE)87;olK)RJi>jJm!$ z_^mLrro!Sg2tSA?of&>;FKPeqUcaGST6Nr1aXHY!k8EKaq)QfrLu)X|9z;to#b|h| z*@o$TdO^)^Q%`;gxV;mcd#B3G&M8s0F^g4HD7)oRuaR>MWu_0kUcI>U$x<^5FAHAa z8``}HNW?=y8xL^|y#TZpS=a`D~_g^7NsEeR`$jTVsJ!1f*KuGfEbSgin>` zO&U0Ua?7MK09mBh{pD!)LnHLZK_O$5?6JB;Iq&P5w)7FyviO^2_7l}5gBC*LUwRUE zo5}o)k4uZ{$N-K*>`!jxy^l$4WW|!agl55$#Q!vUJU(}u zMSKBRb94_%-Sx3OIQzH~Y5$c?qc3>~A)v|~t707Z?gU}yzQew#wH7zfbFs)ZY014G z%=5hleAiCgWGlprph?ju?a=!Vt;y?Dq7Bzn+;igf(Wcwjyghc*tcfK`w*B~tT@eGD zJ6(l0tI?wAMIqMhf*$Te(>~m*vm}{%NlYdNN*e@W%%qo`mPSW=TduB3TTvRet@*H+XeaDULDGuzD<9DgP;3P{RDFLQ8)~Uam6m! znc$FE?=1$t<67By3)Kft2|sjdedEOA<2|dg7uo$niph+Tzd}S#>3Tv0FE&nZ0oa8; zTI_?LPH~Z*h(5bgP0Zz^b!$$XRfS9Qh7YF#7>sG9RuJ05)N`4wU2* zO`jtjgg$e-$ldGRSpKR*$wg{9+!_8k``}iog8l@_E5}8XmT0R8%WR4Fa$Kct_7fbu zv-!>fgwXEa8k|-3nBD+=Q%VEB_28vd;Wsd|cl1`Py#=10ID=GyR zuz7366xER)EnwkA!0hu1wrM%qk%*MGafO&voNkB2aJX9rU6X6w2>+n%^)1jZvXM)5 zg-nsyy+_W#`!j629(#*>DoG3uH6NZI_nQ5Jf3%6lleQo+SS?}y+ zwL&Sv+*8Oq(g;TErDRdmCyaso%4hQ-p({y&p{e~Yn+tmC!?~BS=Mm96DPK?B6<^i} zVK*0D8aj7P!P-3g|i15ZJ<`e^}!P`PW?5KpOtMz@{C7z&=;GVpcbTm)sdC9u*t)i}EXNyfRK4qHOSWc@9c zzm~@AM7`!hym$z9s;$Oq)%wvyI-k0=$FKL5tkzW0S90G)@>VPtj|89ztdogM4xoYh zmeN`$w)iAQ!d`5c*^hAT$;1HQxIxQB&eyA(v<~+M8{W{jeeV1Z^NqjYJMzy_)Hf5! zq}GICu^;_nu>{##kz|P5(a<%hK8RHyxlrz)|hi~jejuUOK z%Qz|PmcDwjT)#2UX)@=J*Xd&(eupix8s4fg74dptcZSYDH_()9mxD6l9hieyoOmTU z(;lFWg|dt=Dm>!vMk{BLckEUb7OCarP|SDvtnKobT2A-3ui{>ql|qS;4~D%)_ciLY z=1};DxZc>t>(Zx5%k6XO5PM^G1M_Z5GnYR`VQr~{dibebfB4uq3j5CvI@^u5Gr_ClvM4yM8ALHj*qRO2HWFb9(3j({%4GgZp z?JFWCy0$4T;8fLyDR&Z|?xw0GLyxuj=|18cQer6qiPnL@haZo&TUUDUJn0!&d$UxZ zdudZjRP;gh>uhrM_xfUp7s2T6MbJZz4BgI7OVQ3+db)-TF|*do7659~5n=Vx%Xw^f zoA^mL7CrW^Bnbp2OY-d`dGIVxv}LqL+gS$;7e5lC9X2f>vcFp__Hq+vRSWk7?kyT*1p!%A>=Y1+od*TE`;y{QwuQxQ zhH9i=ylJ4R6&(exo7aPeZ(tTbAi#{6Z#2B&ASU1irFbUN@nD5SW5&*gjR}BVe(thb}HUQkU9D!Dd1Xfz$nO&fOw4iARSeLMpOHC47ez>uO@dKna z?;35Gb!#|!mxQGw(X#r}3j>h*-mQm9p3d63y$9F+H3FnYlC`pbIw>TNwK5A-v`Bhg zTzOT!^D1Qv#A>ps{lacIJSzn{3rnJ&2noy-pjGxcP01Xf%Y4uWJsw&u`@wa<+U~VR z*BrURZXJyzL!y`hWqJ8qKo0!U{p#~aC?wA(*#Oihv!!j|Plg=%`fDCk>+m{z8JQk> zR3Bo(8%IEfSxcN%OT5U{F^TM0<{wF87_Vjj-cviU>-eTVut#~+{?*B|SJMANH06+q^RhrO_&aMd6EXd|*^@e9Lw&5q?7g69ZD z{bOViCA}c8Tiw!)fjXGT{?h=d?(Xf(ukp%m&u1!tqG&ag)#absw|HL$tS$(fYqdNs zrq1N@1~0x!in)^dB9L6N%O+#j*27pdZyv{s9uhNRs?HE34f$Oa_so~1KOIobr?$wAI9Ckgg2U=4Gk;AFCJ>lexue%1}jT~axd z7tKqzKi?3Dg?%OH;1mVPbOT@1{dyL3aDl0nYS-u9y?sJJt=9Or<9a?f4m;UFB982}=^~}e z0K_w|nryVU+qZ2!W)syz1&NorngXMpEt&B3;=2GfM1!gPgRGKN( zwy2+k0)wctF5O9j&c}tjdhd~pLk{6yP0L-9%d~28u^XRS0}nq(Db%|{@>itrs6LbF z{4qDtI9IQS;GN)UI6IMmQz8je(`SAa<~QrF+Ns0^fJ$t5)P)_OhEsfpR)c_PVDm*f zxpOL)ZZ|%$vmS=$=IG&U;)!M!0=%=T^T2MN45HHZq84K*0OBlT3U}gs9{~!ogx%3d zd&u!9|I{7EY~T}t1}i3%fcIRu_gt7s^gTBN_mMtu`26xNVW8z?=6k;(NZl|VQnP2w zc{NJoutP_#E>+SmLigq*cqY7&)q98Ijo`DO>;&J2MQ*GBlT`TTJRtYJ5lEZYXlpJ< zPCf=@tl4rwL9_g!bC`H~ZNk!RL98RCV0?#7hS^;}CtV$_2P|`B!n%E>gP;MXkT71d zJwmf14NtVW*)tky=qI6U^l_leqa3nx0;|vqcdmW3PZD*yF$P`V>=dtS7P^@5aQ(P6 z{AiaMmQ~?M9cLR(qgBsy8a?AwSK$^A;l@JxdZ$+zbmsEm2#P3}h=#1Wz4Yj*Rciw4 zEhM3V+VX*OkER93s^^snU(9MME408%Z#oR|FJ2$QtuN|Xd!z^m%0*==B1Gd4$K`Sn zMty19vk70xTyR#2aOBAaq~oB9GsA**i5JORs$t$J#P*@U2y7qtxss^+wRYnRCZZ4} zLhqEXd@jHbVN{QEKu%p>svia6!f`_A@}1#lH&?A+ENt6FFTZy560j+&(GPL-%I;3r zif|0ff>kGwP+Tt5_|4rmhoR9HJ6lMR{76tlzOhTE>X>xili=N_oB&G@8fj z$5$AC6%^|?nXT=i=alALrBsj!+HVKw=7dv8^XGjct`A?Y{eW1KtXlVi!jQwU8HNcZ zG%WfG+gBK7QOvH(ACZJ%8(GdB0pT;vCM)I4p;S}$D)q~-OJq}BY$SD&>PcHy=hM=n zgeFD6pH>_Yu7(xGz9V{&d_;1r3b1)(|H%b^WxX&QY1z2Fw3{!IXF4~`7nY0LkO;35 zTq`VBt=Q7uF@!dP-Qd@!voc+(JXd*?tgXV8E7Qs4m{Bonz6td(>~bAm`Pprw9gp9LTBP4 zm+3f8qHJGavIn>B3QE>tBFuyU%Ln2>LC1wT9DTvyeW_J(hwzzjeyeaERXuB@xvF9h zjDd*trHX-sT@~zj%7~m>yDojZU2~REy-L7XgxyvX0Cz4W6X6z~{bdUN8UDS*Z^8;n zLuMV_05-P-ljeo(GEDj`m)ia)CFmk~W$zN(wVg*&Z;MmF)>#nAAP;nU{M=pm`fM3+nBa6@RR--T6?pJi9XZ82gc&=DX zXZpO}^?H#ETFB;^<2&}M?@jyzjfgJ{?!8nHcahkPc$~ifdXSXub!p|y3LSLw4G7|s zGErvGuXRLUsgN#>fwxoS24RrGVY)#ygj2^eLeugIm9A5j-SIj#$@PhJ`Ycp=GRgpV z?Cr>*r~y!NkA|P*B29`2Ma30Qv#~IzbDbtSJHcZF%9JO01F%$P!@0pS4Uti;_OZ|W zi9@1({RbSV*FuvuarzxtQrv0hQ4VO1xYNYntM65~$vr*kqlGSLix_JxJ@2a>z^-uG zqXbt|n#^hy>&w3an(i=by>~?B@@U*aXpGDfVLuFD_7efZ=I%z_`xc{<(?HtL}FZIld`+`scX_yfc?%h zXX5z;OE2+HEKYG`*3=wS5xh7>xe?GTU(PBSboK3Cn`n2C8-L8htd97p6(>Hc9(dp! z^|?vwQ=827D%s0yp_5Gb`>`#bjRZ|kNN|G&0v}1r?4%C|`CESoGj1eW7cl2f zgKDr)qfHTCp&DzoyQYzZrAvU|tf&k+WlSPhE{-l+85XV)uyaDL#jD_^oyP5kx9rPfV7 zK#3@fNtEa?o|y0`E@{o;Ijs8z}WQFaz3(jL77PMu9e*>jL}9=sRSq^+F2PoC2wd*!pwBO>E$3C zg0&u!Yc(H($&=NV&i9b-26Vq4g}yt!3M(cyS(J|?;Yms&(Jnqd@zOPh4{K*K-VVB) z6%}}Q<9gdyTHzj=IKRv?!GVB%`&jrSZip%0S*DiF_-gSj8l@GMduA{L$Tyd?Y=+IL zL_6iNc3zU^UIn%((*%hTp$U|A6E%E;(GSa1N7a==XSR8xL{s)zm40=35L|L+&gDx@ zM9$U44$qHQj0FcK8pFQ!$CeW9+fwRDP7P0pJ=02_DHvlX9?E1LP7 z4pW{?M^B0l;=(gUy*Y`gd{;_wqG_Goa`$5PrZWs<3^guOa)BnZ4BA=o9wGu=E@oMZ zjqrSJO&UIMsmFfo{$@b)vK?!l)5gb$hCuG%e$ykAEc@|?v7G_0qvhLpNzVPL3~DEB z^-&Ffp&%i(&x{45t*A2NpT_FeShOuH&tD`8h1)!2obMr=7GcluQ3onV{@@V}`3cT2 zM_e>~k}47VnpegI@{62|qLhcX)#7Pvx+@NoOS59`e0O;#A-CTwN>t{vRjlc zxt0s2&10`4CvPM()5r6UYo1~V25!vO1#dzmLfexDZmEO z6rgf$i?lm0psaMs^o1u-H~N6r#K{sgzkuZ6ql=6O8v;wnsyl1+PGAo(STi=w zIs26=LlT;!qruSb8RxaFU4Pjw=S$k9`J|6Aeaq&NH2b;-9=!ZvCdpA-pFxUtHda%25U>wr_W7 zvRw$_y;F@>P-)3&A7tJKq!$LlT(;42#-0Xt6~pGAo;-h}`hlzqG}8q`0NPq>ghG{i z(X<(onmb^kcz8H*^<4@ciceIGr#oG@tUs#}GH*qTmiPzhisRF*Z@rpehM7wK<1N18 zHSi;oEUZXb1f~Pi9Eja=Kp^Yg_UQal0~GBoRLf9YUc6a{<*kO6w}neKeTOo%Avi9S z0Ljp?rj5k3K8OWzoGiq*8Gis(KzOtwOZ*zt7yTf~yAP=`Pz<@fqPSjmcQw}4H zPsi97qvIHf-_YgX$r|z~R6I4|)y;2#LsRMC71NI|(X}_jB$HZC9$HQyLY9P32pOD) zq%M=5Xh6i4MR#^U!f!aoIsBgl6VAt($AS8x`B({%=`?`rt-sv`&(-P@C(tmcAfBjr zT!j;*(U%`2SZKg>bW8AbdZy3DW6}PCf^E35G2u? zyjA%%a4zkinhq9bAvV|nPg8S?cg9mDT4ENB4LgeF;Rr@(vyv7E4qn@boBGS3GGXC7dfBMw_{4;bKl<&qex5WMsr2hF+`|;i( z@|@zHCvX1K1OK}1-(D-v{{Aihar?h+QPd96gsk_sa{rg>W+UE4e6;xgO%svHh%F{q;B7Ks$V5$l`j#-w>F;zL1~)qfQgnOt&5RA82TQ{Z0B} zxNNMemFda@rC>8oVlj2WXsQ(&E5}Q2US?;;ClxPk*<6zulx_ z6dWx%EJ_KN9zpWe557xE_7^Wbz&i`ZOc%aTC9(1?{u`@0dE}Q9v04w*SeD>!-Y8Yp zr<`rx#j0fzWuMI=dGbGeM0z$f_!8CNEootLdE_sUwY!bGhVnsY53!rDH z5y&W$27WCG3NN0wLr_ONgbQ%kS;V)|1i%rUcWIV?am4;j68!OXSP9v6iaRy)EzJ;{ zV#JDR0qoL=oU{AnfzgXhzeK#lEW=L*T?W?DJmSRUnyK*(JO}1+Iy3^-mb8L)@2UCB z@tncAC>hEn_B=MtxJe$QKg!ry?&j(`iaxk(LP)%I@@?I`R7!k#P!U8w2m+aOlvQ|E*@F0s-zYQKTu=Bv+o1^+cICN)d&Lk$V zG53PJxHR&n5dkU&&<@8M^(=#%tqwv8?a<;92$zf9U$Hqs;|ea4G6Iq!X1j9;PmO$z zIPoQCaotCMI-78t0XYc0vC#g1kPk)CR>a1in0H7N_&}kaefK#H*#;29N?zGe>xB3# z!^;K_pne#}%47Wn)TDjpy!Uq<|PDrh&v2e50Ey0w7`3T@HE@>uF2AeiNZVY@c?~{1!)U+Tw!DSuMRXbi6tQI|4=Fp)UkLoT1Mq!5z@iaP z#w{-PBW`9$m+G;KDN&m@F;(#n;7zA3@EL;)4*ofWkt@>Aphabtp_ykRh~miW%ra}dh*yvW$&<8xqEBO4k*OGu8`y&II8pYNRjbO#8kb3Bg5h>MWLMjpxxXdBP9 zY~*SN@=lL{-5F>|_;Mf{8tCFfDrfGy&s-5Xg%*GsL$gbInqD>lc38h1L^KdGvnPl3 z>UzQjl_xWJ-EeDhleFc|LSR~J<}1j4cOaSO-$Np@o!)U^;-4EgM@~~0L1(QG7$V`> zRn&zSAk=iQ8zB_mh_})_n0X*7ARv~S?iToBeba^Ez0KInkEt8J0>kf-Ede0B0R*}{ zppRbF%`dg?;7vkG=2YN;ujc}>QP6CM=mgH~WQAEeS;wq0 zg|+kaQxzA7%hEmeb|qSr_m{&^uwbpmE-nl`W(Kf=oI#S?v$HHU=59&qi_5YG1{63V+9}(z5 zBJ!~e$zbP!fwSgVyOW%^)(qzCTG@9cymtV0&4J4dcE%JtEgK9#wyP5ja1O~g`Mt^d zU^X3LnX1cnQ>{eU3D@hOjIaV9x{Q9rr5hlw$Td>Uh3TYNzx&QG%_82wr&D@JmZ5(o>B5XcOE~xbhmdm-6^4g`E*mB6>o~3Yy37PvQu$Q`G`(QI zHEMI8Cz$0#F9hoXj-TGIC&8lhRs>jp%FCV61>#vHzA!kp(OLAqe~b7ok?h|7zcTcPYT%EhEI(Q?XFv_d)I#_}k1sh<>t7Wgj zZ}^orSUziE5Vw#4{sGJ5rCc9gg6(R1o>s?eR^&rKaQPJX^z08in?HRu@OfbPr+sUX zFwi&B!8jV(!zH4KgX@^B6j4wh zVyN*kLcD}?XRp5knGyR6u{vv$9203Fs5Q0_Pd4jQ;k!y5UWjMKy+f3o+NPgq9U~#K z0B)66jzK*Q4_A6w^-=3qYbHZa4E2#r(FxcGmVkkkr7j@QHrRH@rG<;?OP=Na!y<%7 z6uphuGKsh3Sq*e!{ZppERmf!bzSP^4L8+$Rg!5t53|nw5l~H(Q1rW_!d`$DQv}fp&nF2f3eBjxKMMo?2LlK$|Q|KJv>`t^N$7e~D4*RkqjO|p)@6mOQSMihn z^Jf9sIvC(Sxpe?+eJXQhN0CE`)N*%wlhby}mdXmc4tk?KFh65|m z*XlzIlKCy@>mmQ5MvPC%5!b?Z)3b2ShDQeRsyRZ} z^!0=Z(;ou@p|Ta?Zxx=cWHHS`^3xAB`dIpJH`IsVPPz*p0TG%Mj=zJc1hj~%E)5Ki zSz4~2bl+aSRj}|@_s@Q(h@9g4-~&0wCoZf;(62O$N*6yebBHn?#5nn;ZPo73TXeMa zIBmH;QQ={xjspt9qIHH~qVhEKhc3!6q{Mk!!})s?#_Oo27|i`SwL`PA2FTLe0)aaZ z@svLFqela2LSkp}*b^G$9CFx1C}8AqKWw(;1am&uMvv~&Gr%2>nvCR*e1p|CKWAl~!Gy*Mc)F~P>(k6XRjbBS*U7`3IIt_8{ItC!L>auS@1i(H8p zc2B!AwkqP|p*iw+&X;7Ei|G$mU4(FYEgp`6X(Z=^YLE@1bBajmDtH zF{#JkHOtMR{vMNk3o*TaVI(`75Yt0fu=N!eG4%0CX;#`4g!4#9lT{i+2X`Kd9H$q3 z1fz5C2uc6>FY>x*xMbRgAL~4{4#v($Ya zK&;`CZ~($(reU>x@4!^CX~>GXWCudTMi+WEf%QS*m<0GpffI}I_gZCKsEh8rda<3^ z3;PnaG<5|HR(r61HG?(N^~5FWU!MY=3w`X6GBIj4^FuyUgF&}mnWf%AbXMXBAU-cM z7Mk)tobyA@U~p)=1kS6;D;3|s#7qWK_@wQ*{pfB+dO}Mp+J-fkRDAS35$=Sz)A8p?wngl0&>JYJl94*daU z*$5F2_bgf^B|~agj%#fu(awyB z%OrqjUe@O<-E;rGL_{&#s4maSP<*5#iyDWNBXcfLO~wrJ0y7}4)S7K^6Q=F$n1eZA z`^tDjs*a0S=BMFjz{Zli;xNaoD+0ZIa5wU52XnwM85ke}G;uu1I}BfwVCOvI!S(?0>0=oSt?=_B|B- zJ2(GrCn9V330?|5`r-tXEpkYhySNQj*AftDEw9^PGbc}j8=oE2VN@;isq`06m4v9T z&vr;gAYBMIUg+9eC<2s?<&BU%X`O^9X{eHb);$jRZiPJO-&BG_nu)^ryPGfDHB6$q z?$!dmPU~JXR822dH4R8l8hp1$}*vcm_}!WxvUR9v;R0zgx$eS9O8#cO)Xb#=&Qr)vsQ z%E(;(D$fMTb!xOK6Kpwqj)qlF*m4S3pf7bm60f-LgLp1%K(k{E{0>pvMv~)^3BrfL z>(W0L4(3kSGxeK$Jx4((nP|YTKQzP-R@OGuuuo$v_&uwk?kjN;dUFV|Kc*4tA^uyW z`+duByBnZhjflbSt337v13V1^3VpqrmsIi5FrC`642|O@O}VTW({y(}U2oPlgJ9 z`rS)T$%C|Z@`2Y4i#LHj!Rpw5%42)EHrfLjgAw}`5AECTg#J?;B)|(lj`#6B&UL=_ zoKI*#TdQLvTug>qz*<`~$5>{(fR6$xAXwAYv)&O-8yu~8$yHv+ZEbT}I`Yy*q+F`i z@}a%LFB2nNHc@aKuUpzgpN)(ZFaNdpxO-UBAyf_ho92g5|FWF|W&o@3RhRE`VL&_x z{vsPdxZjYgtdQp1wIcJ58p9M<_B;(o09kk;DNbGZWW1+U@a8+rrqR|`VmG4RI{7h% zaHAYDR)g+4gHgvi8VnB%U;5$~45(3JpsZl>=aKV-majj({L@#QV{9Fyw?!h*#?sg{ zuu?dO$3R9eg-n3TV%2EOeYvgyE(0zAroWhvINJ&;Zs%oMOG7dJMm(Q*{#n1!o0n{c zON;3&b{&yJEnfnmHJL-$hf2Ia5!%t_?jmCPO?CwN$M%cqvzaL`g!B#4UpO_<92J33 zO7J{1s;pM2>Y{5o+xv2Q{O4pFT zzc4PTmpXZ26PU}1(5LI%QD3dds#U~$eUI0KIN7}7HmSNy-E6v!C~0s1mC(=FMG4Xq z=K;5n4{cw)7*>`0KzI;d|bHoCpJ+5srNZs{!; z_tODG!IWU&5!+(l;KAkno4}}}pfkRAP^MAda>^72w7j@tZlKWtxh21yq*n{{J=klv zKHl-KBzS&R;tx?yR0u6}2xX|=m>&WAJ8PyNq7dsM`PNpH%S`e#f)XI2u4w;HS@Vj9 zJgBd68~tpx!q<);6UGrV4-InQl z*QEzyTEK#3VQ*pNS>cYAuRt5jZtW;cegzD!S3sX^tWWst_W%1D4zb71g}|G;jvCGT zU%PahJ8(8Xd!v0~O~gN7UF50(+F82%hj3!DuDj3T{+C}0K`H(y+wQG<`VFzAM}ZY; z8-N8=k|pS_+~qgeR!%!9e0zJo|3=Z^o_@(j-H#o)i<5q@uviCNkzSwcdsS%tbyL9` z!HkX%=5<-lKVT=&F~R8Fn$8ECff1ewjELV4wEh5Z3P5hDLDR|;Re{qBffErcG_=AN z0`EgBiDO;0>c6K2iEc{rbx*+t1zLvLBU|U-@9fjHa?k% zHG;9P*Uz&m&62XOt66(^vwZmWn|UI)fGt)NV0+ml^U{(M;2P!B_}xrcve=Z+2f&dX zFVMdGvrmEBcUv>>?Wr{FKVSO*ST_APbzBPU-()^I(g|wO?3})C-y|*$ChuE6{`YPI z4nxic4h-*}bzjSF0?@JHpMTt8KQ`qH@aiSYqwInA_tpA(p5OcMl`^KUftObU3m0#} zu&Y%i@9)|2%G>R^_V8vu=s=9%n(ei~Oa7MT-QBemc)sKkU?xb52X6G#R^ZUde;?|H zCF4M2aKc7lpgex2)r&Po!AWMp9$&sZ literal 0 HcmV?d00001 diff --git a/design/media/mongodb-sharding-prev-relation.png b/design/media/mongodb-sharding-prev-relation.png new file mode 100644 index 0000000000000000000000000000000000000000..8dc50d5b12e603961801960d9848db64ca5d557a GIT binary patch literal 329269 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%0DG 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 z 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 literal 0 HcmV?d00001 diff --git a/design/media/mongodb-sharding-ref-key-changes.png b/design/media/mongodb-sharding-ref-key-changes.png new file mode 100644 index 0000000000000000000000000000000000000000..80b19e9497391a5f84ad29d9330000affd1a50b1 GIT binary patch literal 139346 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

    j$a}W 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 + + +**Sharding Goals** + +Shard Project-wide and Document-wide collections due to the large number of data count in each collection + +- Cluster-wide: less than `10,000` +- Project-wide: more than `1` million +- Document-wide: more than `100` million + +**Unique Constraint Requirements** + +1. `Documents`: `(project_id, key)` with `removed_at: null` +2. `Clients`: `(project_id, key)` +3. `Changes`: `(doc_id, server_seq)` +4. `Snapshots`: `(doc_id, server_seq)` +5. `Syncedseqs`: `(doc_id, client_id)` + +**Main Query Patterns** + +Project-wide collections contain range queries with a `project_id` filter. + +```go +// Clients +cursor, err := c.collection(ColClients).Find(ctx, bson.M{ + "project_id": project.ID, + "status": database.ClientActivated, + "updated_at": bson.M{ + "$lte": gotime.Now().Add(-clientDeactivateThreshold), + }, +}, options.Find().SetLimit(int64(candidatesLimit))) +``` +```go +// Documents +filter := bson.M{ + "project_id": bson.M{ + "$eq": projectID, + }, + "removed_at": bson.M{ + "$exists": false, + }, +} +if paging.Offset != "" { + k := "$lt" + if paging.IsForward { + k = "$gt" + } + filter["_id"] = bson.M{ + k: paging.Offset, + } +} + +opts := options.Find().SetLimit(int64(paging.PageSize)) +if paging.IsForward { + opts = opts.SetSort(map[string]int{"_id": 1}) +} else { + opts = opts.SetSort(map[string]int{"_id": -1}) +} + +cursor, err := c.collection(ColDocuments).Find(ctx, filter, opts) +``` + +Document-wide collections mostly contain range queries with a `doc_id` filter. + +```go +// Changes +cursor, err := c.collection(colChanges).Find(ctx, bson.M{ + "doc_id": encodedDocID, + "server_seq": bson.M{ + "$gte": from, + "$lte": to, + }, +}, options.Find()) +``` +```go +// Snapshots +result := c.collection(colSnapshots).FindOne(ctx, bson.M{ + "doc_id": encodedDocID, + "server_seq": bson.M{ + "$lte": serverSeq, + }, +}, option) +``` + +### Sharding Strategy + +**Selected Shard Keys and Methods** + +The shard keys are selected based on the query patterns and properties (cardinality, frequency) of keys. + +1. Project-wide: `project_id`, ranged +2. Document-wide: `doc_id`, ranged + +Every unique constraint can be satisfied because each has the shard key as a prefix. + +1. `Documents`: `(project_id, key)` with `removed_at: null` +2. `Clients`: `(project_id, key)` +3. `Changes`: `(doc_id, server_seq)` +4. `Snapshots`: `(doc_id, server_seq)` +5. `Syncedseqs`: `(doc_id, client_id)` + +**Changes of Reference Keys** + +Since the uniqueness of `_id` isn't guaranteed across shards, reference keys to indicate a single data in collections should be changed. + +1. `Documents`: `_id` -> `(project_id, _id)` +2. `Clients`: `_id` -> `(project_id, _id)` +3. `Changes`: `_id` -> `(project_id, doc_id, server_seq)` +4. `Snapshots`: `_id` -> `(project_id, doc_id, server_seq)` +5. `Syncedseqs`: `_id` -> `(project_id, doc_id, client_id)` + +Considering that MongoDB ensures the uniqueness of `_id` per shard, `Documents` and `Clients` can be identified with the combination of `project_id` and `_id`. Note that the reference keys of document-wide collections are also subsequently changed. + + + +**Relations between Collections** + +![Current collection relations](media/mongodb-sharding-current-relation.png) + +### MongoDB Cluster Architecture + +For a production deployment, consider the following to ensure data redundancy and system availability. + +* Config Server (3 member replica set): `config1`,`config2`,`config3` +* 3 Shards (each a 3 member replica set): + * `shard1-1`,`shard1-2`, `shard1-3` + * `shard2-1`,`shard2-2`, `shard2-3` + * `shard3-1`,`shard3-2`, `shard3-3` +* 2 Mongos: `mongos1`, `mongos2` + +![Cluster architecture](media/mongodb-sharding-cluster-arch.png) + +### Risks and Mitigation + +**Limited Scalability due to High Value Frequency of `project_id`** + +When there are a limited number of projects, it's likely for the data to be concentrated on a small number of chunks and shards. +This may limit the scalability of MongoDB clusters, which means adding more shards becomes ineffective. + +Using a composite shard key like `(project_id, key)` can resolve this issue. After that, it's possible to split large chunks by `key` values, and migrate the splitted chunks to newly added shards. + + + +However, this change of shard keys can lead to the value duplication of either `actor_id` or `owner`, which uses `client_id` as a value. Now the values of `client_id` can be duplicated, contrary to the current sharding strategy where locating every client in the same project into the same shard prevents this kind of duplications. + +The duplication of `client_id` values can devastate the consistency of documents. There are three expected approaches to resolve this issue: +1. Use `client_key + client_id` as a value. + * this may increase the size of CRDT metadata and the size of document snapshots. +2. Introduce a cluster-level GUID generator. +3. Depend on the low possibility of duplication of MongoDB ObjectID. + * see details in the following contents. + +**Duplicate MongoDB ObjectID** + +Both `client_id` and `doc_id` are currently using MongoDB ObjectID as a value. When duplication of ObjectIDs occurs, it works well due to the changed reference keys, until the MongoDB balancer migrates a chunk with a duplicate ObjectID. This unexpected action may not harm the consistency of documents, but may bring out a temporary failure of the cluster. The conflict should be handled manually by administrators. + + + +However, the possibility of duplicate ObjectIDs is **extremely low in practical use cases** due to its mechanism. +ObjectID uses the following format: +``` +TimeStamp(4 bytes) + MachineId(3 bytes) + ProcessId(2 bytes) + Counter(3 bytes) +``` + +The condition for duplicate ObjectIDs is that more than `16,777,216` documents/clients are created every single second in a single machine and process. Considering Google processes over `99,000` searches every single second, it is unlikely to occur. + +When we have to meet that amount of traffic in the future, consider the following options: +1. Introduce a cluster-level GUID generator. +2. Disable auto-balancing chunks of documents and clients. + * Just isolate each shard for a single project. + +## References +* [Implementation of ObjectID generator in golang driver](https://github.com/mongodb/mongo-go-driver/blob/v0.0.18/bson/objectid/objectid.go#L40) +* [Generating globally unique identifiers for use with MongoDB](https://www.mongodb.com/blog/post/generating-globally-unique-identifiers-for-use-with-mongodb) diff --git a/design/template.md b/design/template.md index c5dee2a7d..97a944316 100644 --- a/design/template.md +++ b/design/template.md @@ -3,6 +3,8 @@ title: feature-name target-version: X.X.X --- + + # Feature Name ## Summary diff --git a/design/tree.md b/design/tree.md index ab7071acc..d10310785 100644 --- a/design/tree.md +++ b/design/tree.md @@ -108,7 +108,7 @@ In the case of local editing, the given `index`es are converted to `CRDTTree.Tre 3-1. Traverse the range and identify nodes to be removed. If a node is an element node and doesn't include both opening and closing tags, it is excluded from removal. -3-2. Update the `latestCreatedAtMapByActor` information for each node and mark nodes with tombstones in the `IndexTree` to indicate removal. +3-2. Update the `maxCreatedAtMapByActor` information for each node and mark nodes with tombstones in the `IndexTree` to indicate removal. **[[STEP 4]](https://github.com/yorkie-team/yorkie/blob/fd3b15c7d2c482464b6c8470339bcc497204114e/pkg/document/crdt/tree.go#L642-L681)** Insert the given nodes at the appropriate positions (insert operation only) @@ -137,7 +137,7 @@ Eventual consistency is guaranteed for these [27 cases](https://github.com/yorki https://github.com/yorkie-team/yorkie/blob/81137b32d0d1d3d36be5b63652e5ab0273f536de/pkg/document/operations/tree_edit.go#L36-L38 -`latestCreatedAtMapByActor` is a map that stores the latest creation time by actor for the nodes included in the editing range. However, relying solely on the typical `lamport` clocks that represent local clock of clients, it's not possible to determine if two events are causally related or concurrent. For instance: +`maxCreatedAtMapByActor` is a map that stores the latest creation time by actor for the nodes included in the editing range. However, relying solely on the typical `lamport` clocks that represent local clock of clients, it's not possible to determine if two events are causally related or concurrent. For instance: diff --git a/go.mod b/go.mod index 1b71cea9b..3174eb884 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.21 require ( connectrpc.com/connect v1.12.0 connectrpc.com/grpchealth v1.3.0 + github.com/go-co-op/gocron/v2 v2.10.1 github.com/go-playground/locales v0.14.0 github.com/go-playground/universal-translator v0.18.0 github.com/go-playground/validator/v10 v10.11.1 @@ -16,7 +17,7 @@ require ( github.com/rs/xid v1.5.0 github.com/spf13/cobra v1.5.0 github.com/spf13/viper v1.17.0 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 github.com/undefinedlabs/go-mpatch v1.0.6 go.mongodb.org/mongo-driver v1.11.7 go.uber.org/zap v1.23.0 @@ -35,10 +36,12 @@ require ( github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/jonboulle/clockwork v0.4.0 // indirect github.com/klauspost/compress v1.17.0 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/magiconair/properties v1.8.7 // indirect @@ -53,6 +56,7 @@ require ( github.com/prometheus/common v0.37.0 // indirect github.com/prometheus/procfs v0.8.0 // indirect github.com/rivo/uniseg v0.4.2 // indirect + github.com/robfig/cron/v3 v3.0.1 // indirect github.com/sagikazarmark/locafero v0.3.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect @@ -66,8 +70,8 @@ require ( github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.9.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/sync v0.3.0 // indirect + golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 // indirect + golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index b8ca1bca3..daf71193d 100644 --- a/go.sum +++ b/go.sum @@ -81,6 +81,8 @@ github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0X github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/go-co-op/gocron/v2 v2.10.1 h1:rlDqSrn+lcMCO4H2d/o+WxpeSTPNkcpW5oaJdeg1pnQ= +github.com/go-co-op/gocron/v2 v2.10.1/go.mod h1:xY7bJxGazKam1cz04EebrlP4S9q4iWdiAylMGP3jY9w= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -148,8 +150,8 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -166,11 +168,11 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/hackerwins/go-memdb v1.3.3-0.20211225080334-513a74641622 h1:7UYuTq6zV83XV4zqn14gUuTtcywzbxGhUnj+hr/MUrE= github.com/hackerwins/go-memdb v1.3.3-0.20211225080334-513a74641622/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -191,6 +193,8 @@ github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7P github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jedib0t/go-pretty/v6 v6.4.9 h1:vZ6bjGg2eBSrJn365qlxGcaWu09Id+LHtrfDWlB2Usc= github.com/jedib0t/go-pretty/v6 v6.4.9/go.mod h1:Ndk3ase2CkQbXLLNf5QDHoYb6J9WtVfmHZu9n8rk2xs= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -279,6 +283,8 @@ github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0ua github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.2 h1:YwD0ulJSJytLpiaWua0sBDusfsCZohxjxzVTYjwxfV8= github.com/rivo/uniseg v0.4.2/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= @@ -321,8 +327,9 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.4/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= @@ -352,8 +359,8 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= @@ -381,8 +388,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY= +golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -467,8 +474,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/pkg/document/change/context.go b/pkg/document/change/context.go index c494644fb..90464c2b5 100644 --- a/pkg/document/change/context.go +++ b/pkg/document/change/context.go @@ -80,9 +80,9 @@ func (c *Context) RegisterRemovedElementPair(parent crdt.Container, deleted crdt c.root.RegisterRemovedElementPair(parent, deleted) } -// RegisterElementHasRemovedNodes register the given text element with garbage to hash table. -func (c *Context) RegisterElementHasRemovedNodes(element crdt.GCElement) { - c.root.RegisterElementHasRemovedNodes(element) +// RegisterGCPair registers the given GC pair to the root. +func (c *Context) RegisterGCPair(pair crdt.GCPair) { + c.root.RegisterGCPair(pair) } // LastTimeTicket returns the last time ticket issued by this context. diff --git a/pkg/document/change/pack.go b/pkg/document/change/pack.go index 55f6409ab..355a79a18 100644 --- a/pkg/document/change/pack.go +++ b/pkg/document/change/pack.go @@ -76,3 +76,8 @@ func (p *Pack) OperationsLen() int { } return operations } + +// IsAttached returns whether the document is attached or not. +func (p *Pack) IsAttached() bool { + return p.Checkpoint.ServerSeq != 0 +} diff --git a/pkg/document/crdt/element.go b/pkg/document/crdt/element.go index 5330ced41..2230b62cf 100644 --- a/pkg/document/crdt/element.go +++ b/pkg/document/crdt/element.go @@ -39,13 +39,6 @@ type Container interface { DeleteByCreatedAt(createdAt *time.Ticket, deletedAt *time.Ticket) (Element, error) } -// GCElement represents Element which has GC. -type GCElement interface { - Element - removedNodesLen() int - purgeRemovedNodesBefore(ticket *time.Ticket) (int, error) -} - // Element represents JSON element. type Element interface { // Marshal returns the JSON encoding of this element. diff --git a/pkg/document/crdt/gc.go b/pkg/document/crdt/gc.go new file mode 100644 index 000000000..142eeb21b --- /dev/null +++ b/pkg/document/crdt/gc.go @@ -0,0 +1,37 @@ +/* + * Copyright 2024 The Yorkie Authors. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package crdt + +import "github.com/yorkie-team/yorkie/pkg/document/time" + +// GCPair is a structure that represents a pair of parent and child for garbage +// collection. +type GCPair struct { + Parent GCParent + Child GCChild +} + +// GCParent is an interface for the parent of the garbage collection target. +type GCParent interface { + Purge(node GCChild) error +} + +// GCChild is an interface for the child of the garbage collection target. +type GCChild interface { + IDString() string + RemovedAt() *time.Ticket +} diff --git a/pkg/document/crdt/rga_tree_split.go b/pkg/document/crdt/rga_tree_split.go index b1f497d2f..b2e9448b3 100644 --- a/pkg/document/crdt/rga_tree_split.go +++ b/pkg/document/crdt/rga_tree_split.go @@ -136,7 +136,7 @@ func (pos *RGATreeSplitNodePos) RelativeOffset() int { return pos.relativeOffset } -// Equal returns the whether the given pos equals or not. +// Equal returns whether the given pos equals or not. func (pos *RGATreeSplitNodePos) Equal(other *RGATreeSplitNodePos) bool { if !pos.id.Equal(other.id) { return false @@ -173,6 +173,11 @@ func (s *RGATreeSplitNode[V]) ID() *RGATreeSplitNodeID { return s.id } +// IDString returns the string representation of the ID. +func (s *RGATreeSplitNode[V]) IDString() string { + return s.id.key() +} + // InsPrevID returns previous node ID at the time of this node insertion. func (s *RGATreeSplitNode[V]) InsPrevID() *RGATreeSplitNodeID { if s.insPrev == nil { @@ -253,18 +258,21 @@ func (s *RGATreeSplitNode[V]) toTestString() string { // Remove removes this node if it created before the time of deletion are // deleted. It only marks the deleted time (tombstone). -func (s *RGATreeSplitNode[V]) Remove(removedAt *time.Ticket, latestCreatedAt *time.Ticket) bool { - if !s.createdAt().After(latestCreatedAt) && +func (s *RGATreeSplitNode[V]) Remove(removedAt *time.Ticket, maxCreatedAt *time.Ticket) bool { + justRemoved := s.removedAt == nil + + if !s.createdAt().After(maxCreatedAt) && (s.removedAt == nil || removedAt.After(s.removedAt)) { s.removedAt = removedAt - return true + return justRemoved } + return false } // canStyle checks if node is able to set style. -func (s *RGATreeSplitNode[V]) canStyle(editedAt *time.Ticket, latestCreatedAt *time.Ticket) bool { - return !s.createdAt().After(latestCreatedAt) && +func (s *RGATreeSplitNode[V]) canStyle(editedAt *time.Ticket, maxCreatedAt *time.Ticket) bool { + return !s.createdAt().After(maxCreatedAt) && (s.removedAt == nil || editedAt.After(s.removedAt)) } @@ -281,10 +289,6 @@ type RGATreeSplit[V RGATreeSplitValue] struct { initialHead *RGATreeSplitNode[V] treeByIndex *splay.Tree[*RGATreeSplitNode[V]] treeByID *llrb.Tree[*RGATreeSplitNodeID, *RGATreeSplitNode[V]] - - // removedNodeMap is a map to store removed nodes. It is used to - // delete the node physically when the garbage collection is executed. - removedNodeMap map[string]*RGATreeSplitNode[V] } // NewRGATreeSplit creates a new instance of RGATreeSplit. @@ -294,10 +298,9 @@ func NewRGATreeSplit[V RGATreeSplitValue](initialHead *RGATreeSplitNode[V]) *RGA treeByID.Put(initialHead.ID(), initialHead) return &RGATreeSplit[V]{ - initialHead: initialHead, - treeByIndex: treeByIndex, - treeByID: treeByID, - removedNodeMap: make(map[string]*RGATreeSplitNode[V]), + initialHead: initialHead, + treeByIndex: treeByIndex, + treeByID: treeByID, } } @@ -445,23 +448,23 @@ func (s *RGATreeSplit[V]) findFloorNode(id *RGATreeSplitNodeID) *RGATreeSplitNod func (s *RGATreeSplit[V]) edit( from *RGATreeSplitNodePos, to *RGATreeSplitNodePos, - latestCreatedAtMapByActor map[string]*time.Ticket, + maxCreatedAtMapByActor map[string]*time.Ticket, content V, editedAt *time.Ticket, -) (*RGATreeSplitNodePos, map[string]*time.Ticket, error) { +) (*RGATreeSplitNodePos, map[string]*time.Ticket, []GCPair, error) { // 01. Split nodes with from and to toLeft, toRight, err := s.findNodeWithSplit(to, editedAt) if err != nil { - return nil, nil, err + return nil, nil, nil, err } fromLeft, fromRight, err := s.findNodeWithSplit(from, editedAt) if err != nil { - return nil, nil, err + return nil, nil, nil, err } // 02. delete between from and to nodesToDelete := s.findBetween(fromRight, toRight) - latestCreatedAtMap, removedNodeMapByNodeKey := s.deleteNodes(nodesToDelete, latestCreatedAtMapByActor, editedAt) + maxCreatedAtMap, removedNodes := s.deleteNodes(nodesToDelete, maxCreatedAtMapByActor, editedAt) var caretID *RGATreeSplitNodeID if toRight == nil { @@ -478,11 +481,15 @@ func (s *RGATreeSplit[V]) edit( } // 04. add removed node - for key, removedNode := range removedNodeMapByNodeKey { - s.removedNodeMap[key] = removedNode + var pairs []GCPair + for _, removedNode := range removedNodes { + pairs = append(pairs, GCPair{ + Parent: s, + Child: removedNode, + }) } - return caretPos, latestCreatedAtMap, nil + return caretPos, maxCreatedAtMap, pairs, nil } func (s *RGATreeSplit[V]) findBetween(from, to *RGATreeSplitNode[V]) []*RGATreeSplitNode[V] { @@ -497,7 +504,7 @@ func (s *RGATreeSplit[V]) findBetween(from, to *RGATreeSplitNode[V]) []*RGATreeS func (s *RGATreeSplit[V]) deleteNodes( candidates []*RGATreeSplitNode[V], - latestCreatedAtMapByActor map[string]*time.Ticket, + maxCreatedAtMapByActor map[string]*time.Ticket, editedAt *time.Ticket, ) (map[string]*time.Ticket, map[string]*RGATreeSplitNode[V]) { createdAtMapByActor := make(map[string]*time.Ticket) @@ -517,22 +524,22 @@ func (s *RGATreeSplit[V]) deleteNodes( for _, node := range candidates { actorIDHex := node.createdAt().ActorIDHex() - var latestCreatedAt *time.Ticket - if latestCreatedAtMapByActor == nil { - latestCreatedAt = time.MaxTicket + var maxCreatedAt *time.Ticket + if maxCreatedAtMapByActor == nil { + maxCreatedAt = time.MaxTicket } else { - createdAt, ok := latestCreatedAtMapByActor[actorIDHex] + createdAt, ok := maxCreatedAtMapByActor[actorIDHex] if ok { - latestCreatedAt = createdAt + maxCreatedAt = createdAt } else { - latestCreatedAt = time.InitialTicket + maxCreatedAt = time.InitialTicket } } - if node.Remove(editedAt, latestCreatedAt) { - latestCreatedAt := createdAtMapByActor[actorIDHex] + if node.Remove(editedAt, maxCreatedAt) { + maxCreatedAt := createdAtMapByActor[actorIDHex] createdAt := node.id.createdAt - if latestCreatedAt == nil || createdAt.After(latestCreatedAt) { + if maxCreatedAt == nil || createdAt.After(maxCreatedAt) { createdAtMapByActor[actorIDHex] = createdAt } @@ -617,29 +624,13 @@ func (s *RGATreeSplit[V]) ToTestString() string { return builder.String() } -// removedNodesLen returns length of removed nodes -func (s *RGATreeSplit[V]) removedNodesLen() int { - return len(s.removedNodeMap) -} - -// purgeRemovedNodesBefore physically purges nodes that have been removed. -func (s *RGATreeSplit[V]) purgeRemovedNodesBefore(ticket *time.Ticket) (int, error) { - count := 0 - for _, node := range s.removedNodeMap { - if node.removedAt != nil && ticket.Compare(node.removedAt) >= 0 { - s.treeByIndex.Delete(node.indexNode) - s.purge(node) - s.treeByID.Remove(node.id) - delete(s.removedNodeMap, node.id.key()) - count++ - } - } +// Purge physically purge the given node from RGATreeSplit. +func (s *RGATreeSplit[V]) Purge(child GCChild) error { + node := child.(*RGATreeSplitNode[V]) - return count, nil -} + s.treeByIndex.Delete(node.indexNode) + s.treeByID.Remove(node.id) -// purge physically purge the given node from RGATreeSplit. -func (s *RGATreeSplit[V]) purge(node *RGATreeSplitNode[V]) { node.prev.next = node.next if node.next != nil { node.next.prev = node.prev @@ -653,4 +644,6 @@ func (s *RGATreeSplit[V]) purge(node *RGATreeSplitNode[V]) { node.insNext.insPrev = node.insPrev } node.insPrev, node.insNext = nil, nil + + return nil } diff --git a/pkg/document/crdt/rht.go b/pkg/document/crdt/rht.go index bc424e18e..761d0441a 100644 --- a/pkg/document/crdt/rht.go +++ b/pkg/document/crdt/rht.go @@ -41,6 +41,11 @@ func newRHTNode(key, val string, updatedAt *time.Ticket, isRemoved bool) *RHTNod } } +// IDString returns the string representation of this node. +func (n *RHTNode) IDString() string { + return n.updatedAt.Key() + ":" + n.key +} + // Key returns the key of this node. func (n *RHTNode) Key() string { return n.key @@ -56,6 +61,20 @@ func (n *RHTNode) UpdatedAt() *time.Ticket { return n.updatedAt } +// RemovedAt returns the time when this node was removed. +func (n *RHTNode) RemovedAt() *time.Ticket { + if n.isRemoved { + return n.updatedAt + } + + return nil +} + +// IsRemoved returns whether this node is removed or not. +func (n *RHTNode) IsRemoved() bool { + return n.isRemoved +} + // RHT is a hashtable with logical clock(Replicated hashtable). // For more details about RHT: http://csl.skku.edu/papers/jpdc11.pdf // NOTE(justiceHui): RHT and ElementRHT has duplicated functions. @@ -94,41 +113,67 @@ 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 || executedAt.After(node.updatedAt) { - if node != nil && node.isRemoved { - rht.numberOfRemovedElement-- - } +func (rht *RHT) Set(k, v string, executedAt *time.Ticket) *RHTNode { + node := rht.nodeMapByKey[k] + + if node != nil && node.isRemoved && executedAt.After(node.updatedAt) { + rht.numberOfRemovedElement-- + } + + if node == nil || executedAt.After(node.updatedAt) { newNode := newRHTNode(k, v, executedAt, false) rht.nodeMapByKey[k] = newNode } + + if node != nil && node.isRemoved { + return node + } + + return nil } -// 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.updatedAt) { - // NOTE(justiceHui): Even if key is not existed, we must set flag `isRemoved` for concurrency - if node == nil { - rht.numberOfRemovedElement++ - newNode := newRHTNode(k, ``, executedAt, true) - rht.nodeMapByKey[k] = newNode - return "" - } +// SetInternal sets the value of the given key internally. +func (rht *RHT) SetInternal(k string, v string, updatedAt *time.Ticket, removed bool) { + newNode := newRHTNode(k, v, updatedAt, removed) + rht.nodeMapByKey[k] = newNode - alreadyRemoved := node.isRemoved - if !alreadyRemoved { - rht.numberOfRemovedElement++ - } - newNode := newRHTNode(k, node.val, executedAt, true) + if removed { + rht.numberOfRemovedElement++ + } +} + +// Remove removes the value of the given key. +func (rht *RHT) Remove(k string, executedAt *time.Ticket) []*RHTNode { + // NOTE(hackerwins): We need to consider the logic and the policy of removing the element. + // A. RHT always overrides the value of the same key in a immutable way. + // B. Even if the key is not existed, RHT sets the flag `isRemoved` for concurrency. + node, ok := rht.nodeMapByKey[k] + if !ok { + rht.numberOfRemovedElement++ + newNode := newRHTNode(k, "", executedAt, true) rht.nodeMapByKey[k] = newNode + return []*RHTNode{newNode} + } - if alreadyRemoved { - return "" - } - return node.val + if !executedAt.After(node.updatedAt) { + return nil } - return "" + alreadyRemoved := node.isRemoved + if !alreadyRemoved { + rht.numberOfRemovedElement++ + } + + var gcNodes []*RHTNode + if alreadyRemoved { + gcNodes = append(gcNodes, node) + } + + newNode := newRHTNode(k, node.val, executedAt, true) + rht.nodeMapByKey[k] = newNode + gcNodes = append(gcNodes, newNode) + + return gcNodes } // Elements returns a map of elements because the map easy to use for loop. @@ -149,9 +194,7 @@ func (rht *RHT) Elements() map[string]string { func (rht *RHT) Nodes() []*RHTNode { var nodes []*RHTNode for _, node := range rht.nodeMapByKey { - if !node.isRemoved { - nodes = append(nodes, node) - } + nodes = append(nodes, node) } return nodes @@ -167,8 +210,9 @@ func (rht *RHT) DeepCopy() *RHT { instance := NewRHT() for _, node := range rht.Nodes() { - instance.Set(node.key, node.val, node.updatedAt) + instance.SetInternal(node.key, node.val, node.updatedAt, node.isRemoved) } + return instance } @@ -199,27 +243,14 @@ func (rht *RHT) Marshal() string { return sb.String() } -// ToXML returns the XML representation of this hashtable. -func (rht *RHT) ToXML() string { - members := rht.Elements() - - size := len(members) - - // Extract and sort the keys - keys := make([]string, 0, size) - for k := range members { - keys = append(keys, k) - } - sort.Strings(keys) - - sb := strings.Builder{} - for idx, k := range keys { - if idx > 0 { - sb.WriteString(" ") - } - value := members[k] - sb.WriteString(fmt.Sprintf(`%s="%s"`, k, EscapeString(value))) +// Purge purges the given child node. +func (rht *RHT) Purge(child *RHTNode) error { + if node, ok := rht.nodeMapByKey[child.key]; !ok || node.IDString() != child.IDString() { + // TODO(hackerwins): Should we return an error when the child is not found? + return nil } - return sb.String() + delete(rht.nodeMapByKey, child.key) + rht.numberOfRemovedElement-- + return nil } diff --git a/pkg/document/crdt/rht_test.go b/pkg/document/crdt/rht_test.go index f7c90f88c..34239f4bd 100644 --- a/pkg/document/crdt/rht_test.go +++ b/pkg/document/crdt/rht_test.go @@ -9,49 +9,20 @@ import ( "github.com/yorkie-team/yorkie/test/helper" ) -func TestRHT_Marshal(t *testing.T) { - tests := []struct { - desc string - insertKey string - insertVal string - expectStr string - }{ - { - desc: `1. empty hash table`, - insertKey: ``, - insertVal: ``, - expectStr: `{}`, - }, - { - desc: `2. only one element`, - insertKey: "hello\\\\\\t", - insertVal: "world\"\f\b", - expectStr: `{"hello\\\\\\t":"world\"\f\b"}`, - }, - { - desc: `3. non-empty hash table`, - insertKey: "hi", - insertVal: `test\r`, - expectStr: `{"hello\\\\\\t":"world\"\f\b","hi":"test\\r"}`, - }, - } - +func TestRHT_DeepCopy(t *testing.T) { root := helper.TestRoot() ctx := helper.TextChangeContext(root) rht := crdt.NewRHT() + rht.Set("key1", "value1", ctx.IssueTimeTicket()) + rht.Remove("key2", ctx.IssueTimeTicket()) - for _, tt := range tests { - t.Run(tt.desc, func(t *testing.T) { - if len(tt.insertKey) > 0 { - rht.Set(tt.insertKey, tt.insertVal, ctx.IssueTimeTicket()) - } - assert.Equal(t, tt.expectStr, rht.Marshal()) - }) - } + rht2 := rht.DeepCopy() + assert.Equal(t, rht.Marshal(), rht2.Marshal()) + assert.Equal(t, len(rht.Nodes()), len(rht2.Nodes())) } -func TestRHT_ToXML(t *testing.T) { +func TestRHT_Marshal(t *testing.T) { tests := []struct { desc string insertKey string @@ -62,19 +33,19 @@ func TestRHT_ToXML(t *testing.T) { desc: `1. empty hash table`, insertKey: ``, insertVal: ``, - expectStr: ``, + expectStr: `{}`, }, { desc: `2. only one element`, insertKey: "hello\\\\\\t", insertVal: "world\"\f\b", - expectStr: `hello\\\t="world\"\f\b"`, + expectStr: `{"hello\\\\\\t":"world\"\f\b"}`, }, { desc: `3. non-empty hash table`, insertKey: "hi", insertVal: `test\r`, - expectStr: `hello\\\t="world\"\f\b" hi="test\\r"`, + expectStr: `{"hello\\\\\\t":"world\"\f\b","hi":"test\\r"}`, }, } @@ -88,7 +59,7 @@ func TestRHT_ToXML(t *testing.T) { if len(tt.insertKey) > 0 { rht.Set(tt.insertKey, tt.insertVal, ctx.IssueTimeTicket()) } - assert.Equal(t, tt.expectStr, rht.ToXML()) + assert.Equal(t, tt.expectStr, rht.Marshal()) }) } } @@ -141,84 +112,92 @@ func TestRHT_Remove(t *testing.T) { key2, val2, val22 := `key2`, `value2`, `value22` tests := []struct { - desc string - insertKey []string - insertVal []string - deleteKey []string - deleteVal []string - expectXML string - expectJSON string - expectSize int + desc string + insertKey []string + insertVal []string + deleteKey []string + deleteVal []string + expectXML string + expectJSON string + expectTotalSize int + expectSize int }{ { - desc: `1. set elements`, - insertKey: []string{key1, key2}, - insertVal: []string{val1, val2}, - deleteKey: []string{}, - deleteVal: []string{}, - expectXML: `key1="value1" key2="value2"`, - expectJSON: `{"key1":"value1","key2":"value2"}`, - expectSize: 2, + desc: `1. set elements`, + insertKey: []string{key1, key2}, + insertVal: []string{val1, val2}, + deleteKey: []string{}, + deleteVal: []string{}, + expectXML: `key1="value1" key2="value2"`, + expectJSON: `{"key1":"value1","key2":"value2"}`, + expectTotalSize: 2, + expectSize: 2, }, { - desc: `2. remove element`, - insertKey: []string{}, - insertVal: []string{}, - deleteKey: []string{key1}, - deleteVal: []string{val1}, - expectXML: `key2="value2"`, - expectJSON: `{"key2":"value2"}`, - expectSize: 1, + desc: `2. remove element`, + insertKey: []string{}, + insertVal: []string{}, + deleteKey: []string{key1}, + deleteVal: []string{val1}, + expectXML: `key2="value2"`, + expectJSON: `{"key2":"value2"}`, + expectTotalSize: 2, + expectSize: 1, }, { - desc: `3. set after remove`, - insertKey: []string{key1}, - insertVal: []string{val11}, - deleteKey: []string{}, - deleteVal: []string{}, - expectXML: `key1="value11" key2="value2"`, - expectJSON: `{"key1":"value11","key2":"value2"}`, - expectSize: 2, + desc: `3. set after remove`, + insertKey: []string{key1}, + insertVal: []string{val11}, + deleteKey: []string{}, + deleteVal: []string{}, + expectXML: `key1="value11" key2="value2"`, + expectJSON: `{"key1":"value11","key2":"value2"}`, + expectTotalSize: 2, + expectSize: 2, }, { - desc: `4. remove element`, - insertKey: []string{key2}, - insertVal: []string{val22}, - deleteKey: []string{key1}, - deleteVal: []string{val11}, - expectXML: `key2="value22"`, - expectJSON: `{"key2":"value22"}`, - expectSize: 1, + desc: `4. remove element`, + insertKey: []string{key2}, + insertVal: []string{val22}, + deleteKey: []string{key1}, + deleteVal: []string{val11}, + expectXML: `key2="value22"`, + expectJSON: `{"key2":"value22"}`, + expectTotalSize: 2, + expectSize: 1, }, { - desc: `5. remove element again`, - insertKey: []string{}, - insertVal: []string{}, - deleteKey: []string{key1}, - deleteVal: []string{``}, - expectXML: `key2="value22"`, - expectJSON: `{"key2":"value22"}`, - expectSize: 1, + desc: `5. remove element again`, + insertKey: []string{}, + insertVal: []string{}, + deleteKey: []string{key1}, + deleteVal: []string{val11}, + expectXML: `key2="value22"`, + expectJSON: `{"key2":"value22"}`, + expectTotalSize: 2, + expectSize: 1, }, { - desc: `6. remove element(cleared)`, - insertKey: []string{}, - insertVal: []string{}, - deleteKey: []string{key2}, - deleteVal: []string{val22}, - expectXML: ``, - expectJSON: `{}`, - expectSize: 0, + desc: `6. remove element(cleared)`, + insertKey: []string{}, + insertVal: []string{}, + deleteKey: []string{key2}, + deleteVal: []string{val22}, + expectXML: ``, + expectJSON: `{}`, + expectTotalSize: 2, + expectSize: 0, }, { - desc: `7. remove not exist key`, - insertKey: []string{}, - insertVal: []string{}, - deleteKey: []string{`not-exist-key`}, - deleteVal: []string{``}, - expectXML: ``, - expectJSON: `{}`, - expectSize: 0, + desc: `7. remove not exist key`, + insertKey: []string{}, + insertVal: []string{}, + deleteKey: []string{`not-exist-key`}, + deleteVal: []string{``}, + expectXML: ``, + expectJSON: `{}`, + expectTotalSize: 3, + expectSize: 0, }, } @@ -233,13 +212,12 @@ func TestRHT_Remove(t *testing.T) { rht.Set(key, tt.insertVal[i], ctx.IssueTimeTicket()) } for i, key := range tt.deleteKey { - removedElement := rht.Remove(key, ctx.IssueTimeTicket()) - assert.Equal(t, tt.deleteVal[i], removedElement) + nodes := rht.Remove(key, ctx.IssueTimeTicket()) + assert.Equal(t, tt.deleteVal[i], nodes[len(nodes)-1].Value()) } - assert.Equal(t, tt.expectXML, rht.ToXML()) assert.Equal(t, tt.expectJSON, rht.Marshal()) assert.Equal(t, tt.expectSize, rht.Len()) - assert.Equal(t, tt.expectSize, len(rht.Nodes())) + assert.Equal(t, tt.expectTotalSize, len(rht.Nodes())) assert.Equal(t, tt.expectSize, len(rht.Elements())) }) } diff --git a/pkg/document/crdt/root.go b/pkg/document/crdt/root.go index 73db7de88..488e1b91c 100644 --- a/pkg/document/crdt/root.go +++ b/pkg/document/crdt/root.go @@ -36,18 +36,18 @@ type ElementPair struct { // Every element has a unique time ticket at creation, which allows us to find // a particular element. type Root struct { - object *Object - elementMapByCreatedAt map[string]Element - removedElementPairMapByCreatedAt map[string]ElementPair - elementHasRemovedNodesSetByCreatedAt map[string]GCElement + object *Object + elementMap map[string]Element + gcElementPairMap map[string]ElementPair + gcNodePairMap map[string]GCPair } // NewRoot creates a new instance of Root. func NewRoot(root *Object) *Root { r := &Root{ - elementMapByCreatedAt: make(map[string]Element), - removedElementPairMapByCreatedAt: make(map[string]ElementPair), - elementHasRemovedNodesSetByCreatedAt: make(map[string]GCElement), + elementMap: make(map[string]Element), + gcElementPairMap: make(map[string]ElementPair), + gcNodePairMap: make(map[string]GCPair), } r.object = root @@ -57,7 +57,17 @@ func NewRoot(root *Object) *Root { if elem.RemovedAt() != nil { r.RegisterRemovedElementPair(parent, elem) } - // TODO(hackerwins): Register text elements with garbage + + switch e := elem.(type) { + case *Text: + for _, pair := range e.GCPairs() { + r.RegisterGCPair(pair) + } + case *Tree: + for _, pair := range e.GCPairs() { + r.RegisterGCPair(pair) + } + } return false }) @@ -71,18 +81,18 @@ func (r *Root) Object() *Object { // FindByCreatedAt returns the element of given creation time. func (r *Root) FindByCreatedAt(createdAt *time.Ticket) Element { - return r.elementMapByCreatedAt[createdAt.Key()] + return r.elementMap[createdAt.Key()] } // RegisterElement registers the given element to hash table. func (r *Root) RegisterElement(element Element) { - r.elementMapByCreatedAt[element.CreatedAt().Key()] = element + r.elementMap[element.CreatedAt().Key()] = element switch element := element.(type) { case Container: { element.Descendants(func(elem Element, parent Container) bool { - r.elementMapByCreatedAt[elem.CreatedAt().Key()] = elem + r.elementMap[elem.CreatedAt().Key()] = elem return false }) } @@ -95,8 +105,8 @@ func (r *Root) deregisterElement(element Element) int { deregisterElementInternal := func(elem Element) { createdAt := elem.CreatedAt().Key() - delete(r.elementMapByCreatedAt, createdAt) - delete(r.removedElementPairMapByCreatedAt, createdAt) + delete(r.elementMap, createdAt) + delete(r.gcElementPairMap, createdAt) count++ } @@ -117,17 +127,12 @@ func (r *Root) deregisterElement(element Element) int { // RegisterRemovedElementPair register the given element pair to hash table. func (r *Root) RegisterRemovedElementPair(parent Container, elem Element) { - r.removedElementPairMapByCreatedAt[elem.CreatedAt().Key()] = ElementPair{ + r.gcElementPairMap[elem.CreatedAt().Key()] = ElementPair{ parent, elem, } } -// RegisterElementHasRemovedNodes register the given element with garbage to hash table. -func (r *Root) RegisterElementHasRemovedNodes(element GCElement) { - r.elementHasRemovedNodesSetByCreatedAt[element.CreatedAt().Key()] = element -} - // DeepCopy copies itself deeply. func (r *Root) DeepCopy() (*Root, error) { copiedObject, err := r.object.DeepCopy() @@ -141,8 +146,8 @@ func (r *Root) DeepCopy() (*Root, error) { func (r *Root) GarbageCollect(ticket *time.Ticket) (int, error) { count := 0 - for _, pair := range r.removedElementPairMapByCreatedAt { - if pair.elem.RemovedAt() != nil && ticket.Compare(pair.elem.RemovedAt()) >= 0 { + for _, pair := range r.gcElementPairMap { + if ticket.Compare(pair.elem.RemovedAt()) >= 0 { if err := pair.parent.Purge(pair.elem); err != nil { return 0, err } @@ -151,16 +156,15 @@ func (r *Root) GarbageCollect(ticket *time.Ticket) (int, error) { } } - for _, node := range r.elementHasRemovedNodesSetByCreatedAt { - purgedNodes, err := node.purgeRemovedNodesBefore(ticket) - if err != nil { - return 0, err - } + for _, pair := range r.gcNodePairMap { + if ticket.Compare(pair.Child.RemovedAt()) >= 0 { + if err := pair.Parent.Purge(pair.Child); err != nil { + return 0, err + } - if purgedNodes > 0 { - delete(r.elementHasRemovedNodesSetByCreatedAt, node.CreatedAt().Key()) + delete(r.gcNodePairMap, pair.Child.IDString()) + count++ } - count += purgedNodes } return count, nil @@ -168,20 +172,14 @@ func (r *Root) GarbageCollect(ticket *time.Ticket) (int, error) { // ElementMapLen returns the size of element map. func (r *Root) ElementMapLen() int { - return len(r.elementMapByCreatedAt) + return len(r.elementMap) } -// RemovedElementLen returns the size of removed element map. -func (r *Root) RemovedElementLen() int { - return len(r.removedElementPairMapByCreatedAt) -} - -// GarbageLen returns the count of removed elements. -func (r *Root) GarbageLen() int { - count := 0 +// GarbageElementLen return the count of removed elements. +func (r *Root) GarbageElementLen() int { seen := make(map[string]bool) - for _, pair := range r.removedElementPairMapByCreatedAt { + for _, pair := range r.gcElementPairMap { seen[pair.elem.CreatedAt().Key()] = true switch elem := pair.elem.(type) { @@ -193,11 +191,22 @@ func (r *Root) GarbageLen() int { } } - count += len(seen) + return len(seen) +} - for _, element := range r.elementHasRemovedNodesSetByCreatedAt { - count += element.removedNodesLen() +// GarbageLen returns the count of removed elements and internal nodes. +func (r *Root) GarbageLen() int { + return r.GarbageElementLen() + len(r.gcNodePairMap) +} + +// RegisterGCPair registers the given pair to hash table. +func (r *Root) RegisterGCPair(pair GCPair) { + // NOTE(hackerwins): If the child is already registered, it means that the + // child should be removed from the cache. + if _, ok := r.gcNodePairMap[pair.Child.IDString()]; ok { + delete(r.gcNodePairMap, pair.Child.IDString()) + return } - return count + r.gcNodePairMap[pair.Child.IDString()] = pair } diff --git a/pkg/document/crdt/root_test.go b/pkg/document/crdt/root_test.go index e6c6a8b2e..138f4574c 100644 --- a/pkg/document/crdt/root_test.go +++ b/pkg/document/crdt/root_test.go @@ -26,9 +26,9 @@ import ( "github.com/yorkie-team/yorkie/test/helper" ) -func registerElementHasRemovedNodes(fromPos, toPos *crdt.RGATreeSplitNodePos, root *crdt.Root, text crdt.GCElement) { - if !fromPos.Equal(toPos) { - root.RegisterElementHasRemovedNodes(text) +func registerGCPairs(root *crdt.Root, pairs []crdt.GCPair) { + for _, pair := range pairs { + root.RegisterGCPair(pair) } } @@ -61,76 +61,66 @@ func TestRoot(t *testing.T) { }) t.Run("garbage collection for text test", func(t *testing.T) { + steps := []struct { + from int + to int + content string + want string + garbage int + }{ + {0, 0, "Hi World", `[0:0:00:0 {} ""][0:2:00:0 {} "Hi World"]`, 0}, + {2, 7, "Earth", `[0:0:00:0 {} ""][0:2:00:0 {} "Hi"][0:3:00:0 {} "Earth"]{0:2:00:2 {} " Worl"}[0:2:00:7 {} "d"]`, 1}, + {0, 2, "", `[0:0:00:0 {} ""]{0:2:00:0 {} "Hi"}[0:3:00:0 {} "Earth"]{0:2:00:2 {} " Worl"}[0:2:00:7 {} "d"]`, 2}, + {5, 6, "", `[0:0:00:0 {} ""]{0:2:00:0 {} "Hi"}[0:3:00:0 {} "Earth"]{0:2:00:2 {} " Worl"}{0:2:00:7 {} "d"}`, 3}, + } + root := helper.TestRoot() ctx := helper.TextChangeContext(root) text := crdt.NewText(crdt.NewRGATreeSplit(crdt.InitialTextNode()), ctx.IssueTimeTicket()) - fromPos, toPos, _ := text.CreateRange(0, 0) - _, _, err := text.Edit(fromPos, toPos, nil, "Hello World", nil, ctx.IssueTimeTicket()) - assert.NoError(t, err) - registerElementHasRemovedNodes(fromPos, toPos, root, text) - assert.Equal(t, "Hello World", text.String()) - assert.Equal(t, 0, root.GarbageLen()) - - fromPos, toPos, _ = text.CreateRange(5, 10) - _, _, err = text.Edit(fromPos, toPos, nil, "Yorkie", nil, ctx.IssueTimeTicket()) - assert.NoError(t, err) - registerElementHasRemovedNodes(fromPos, toPos, root, text) - assert.Equal(t, "HelloYorkied", text.String()) - assert.Equal(t, 1, root.GarbageLen()) - - fromPos, toPos, _ = text.CreateRange(0, 5) - _, _, err = text.Edit(fromPos, toPos, nil, "", nil, ctx.IssueTimeTicket()) - assert.NoError(t, err) - registerElementHasRemovedNodes(fromPos, toPos, root, text) - assert.Equal(t, "Yorkied", text.String()) - assert.Equal(t, 2, root.GarbageLen()) - - fromPos, toPos, _ = text.CreateRange(6, 7) - _, _, err = text.Edit(fromPos, toPos, nil, "", nil, ctx.IssueTimeTicket()) - assert.NoError(t, err) - registerElementHasRemovedNodes(fromPos, toPos, root, text) - assert.Equal(t, "Yorkie", text.String()) - assert.Equal(t, 3, root.GarbageLen()) + for _, step := range steps { + fromPos, toPos, _ := text.CreateRange(step.from, step.to) + _, _, pairs, err := text.Edit(fromPos, toPos, nil, step.content, nil, ctx.IssueTimeTicket()) + assert.NoError(t, err) + registerGCPairs(root, pairs) + assert.Equal(t, step.want, text.ToTestString()) + assert.Equal(t, step.garbage, root.GarbageLen()) + } // It contains code marked tombstone. // After calling the garbage collector, the node will be removed. - nodeLen := len(text.Nodes()) - assert.Equal(t, 4, nodeLen) + assert.Equal(t, 4, len(text.Nodes())) n, err := root.GarbageCollect(time.MaxTicket) assert.NoError(t, err) assert.Equal(t, 3, n) assert.Equal(t, 0, root.GarbageLen()) - nodeLen = len(text.Nodes()) - assert.Equal(t, 1, nodeLen) + assert.Equal(t, 1, len(text.Nodes())) }) t.Run("garbage collection for fragments of text", func(t *testing.T) { - type test struct { + steps := []struct { from int to int content string want string garbage int - } - - root := helper.TestRoot() - ctx := helper.TextChangeContext(root) - text := crdt.NewText(crdt.NewRGATreeSplit(crdt.InitialTextNode()), ctx.IssueTimeTicket()) - - tests := []test{ + }{ {from: 0, to: 0, content: "Yorkie", want: "Yorkie", garbage: 0}, {from: 4, to: 5, content: "", want: "Yorke", garbage: 1}, {from: 2, to: 3, content: "", want: "Yoke", garbage: 2}, {from: 0, to: 1, content: "", want: "oke", garbage: 3}, } - for _, tc := range tests { + root := helper.TestRoot() + ctx := helper.TextChangeContext(root) + text := crdt.NewText(crdt.NewRGATreeSplit(crdt.InitialTextNode()), ctx.IssueTimeTicket()) + + for _, tc := range steps { fromPos, toPos, _ := text.CreateRange(tc.from, tc.to) - _, _, err := text.Edit(fromPos, toPos, nil, tc.content, nil, ctx.IssueTimeTicket()) + _, _, pairs, err := text.Edit(fromPos, toPos, nil, tc.content, nil, ctx.IssueTimeTicket()) assert.NoError(t, err) - registerElementHasRemovedNodes(fromPos, toPos, root, text) + registerGCPairs(root, pairs) assert.Equal(t, tc.want, text.String()) assert.Equal(t, tc.garbage, root.GarbageLen()) } @@ -147,23 +137,23 @@ func TestRoot(t *testing.T) { text := crdt.NewText(crdt.NewRGATreeSplit(crdt.InitialTextNode()), ctx.IssueTimeTicket()) fromPos, toPos, _ := text.CreateRange(0, 0) - _, _, err := text.Edit(fromPos, toPos, nil, "Hello World", nil, ctx.IssueTimeTicket()) + _, _, pairs, err := text.Edit(fromPos, toPos, nil, "Hello World", nil, ctx.IssueTimeTicket()) assert.NoError(t, err) - registerElementHasRemovedNodes(fromPos, toPos, root, text) + registerGCPairs(root, pairs) assert.Equal(t, `[{"val":"Hello World"}]`, text.Marshal()) assert.Equal(t, 0, root.GarbageLen()) fromPos, toPos, _ = text.CreateRange(6, 11) - _, _, err = text.Edit(fromPos, toPos, nil, "Yorkie", nil, ctx.IssueTimeTicket()) + _, _, pairs, err = text.Edit(fromPos, toPos, nil, "Yorkie", nil, ctx.IssueTimeTicket()) assert.NoError(t, err) - registerElementHasRemovedNodes(fromPos, toPos, root, text) + registerGCPairs(root, pairs) assert.Equal(t, `[{"val":"Hello "},{"val":"Yorkie"}]`, text.Marshal()) assert.Equal(t, 1, root.GarbageLen()) fromPos, toPos, _ = text.CreateRange(0, 6) - _, _, err = text.Edit(fromPos, toPos, nil, "", nil, ctx.IssueTimeTicket()) + _, _, pairs, err = text.Edit(fromPos, toPos, nil, "", nil, ctx.IssueTimeTicket()) assert.NoError(t, err) - registerElementHasRemovedNodes(fromPos, toPos, root, text) + registerGCPairs(root, pairs) assert.Equal(t, `[{"val":"Yorkie"}]`, text.Marshal()) assert.Equal(t, 2, root.GarbageLen()) diff --git a/pkg/document/crdt/text.go b/pkg/document/crdt/text.go index a5e81ad1d..09f3520f3 100644 --- a/pkg/document/crdt/text.go +++ b/pkg/document/crdt/text.go @@ -22,6 +22,8 @@ import ( "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 @@ -104,6 +106,31 @@ func (t *TextValue) DeepCopy() RGATreeSplitValue { } } +// Purge removes the given ticket from this value. +func (t *TextValue) Purge(child GCChild) error { + rhtNode := child.(*RHTNode) + return t.attrs.Purge(rhtNode) +} + +// GCPairs returns the pairs of GC. +func (t *TextValue) GCPairs() []GCPair { + if t.attrs == nil { + return nil + } + + var pairs []GCPair + for _, node := range t.attrs.Nodes() { + if node.isRemoved { + pairs = append(pairs, GCPair{ + Parent: t, + Child: node, + }) + } + } + + return pairs +} + // InitialTextNode creates an initial node of Text. The text is edited // as this node is split into multiple nodes. func InitialTextNode() *RGATreeSplitNode[*TextValue] { @@ -179,6 +206,25 @@ func (t *Text) DeepCopy() (Element, error) { return NewText(rgaTreeSplit, t.createdAt), nil } +// GCPairs returns the pairs of GC. +func (t *Text) GCPairs() []GCPair { + var pairs []GCPair + for _, node := range t.Nodes() { + if node.removedAt != nil { + pairs = append(pairs, GCPair{ + Parent: t.rgaTreeSplit, + Child: node, + }) + } + + for _, p := range node.Value().GCPairs() { + pairs = append(pairs, p) + } + } + + return pairs +} + // CreatedAt returns the creation time of this Text. func (t *Text) CreatedAt() *time.Ticket { return t.createdAt @@ -223,11 +269,11 @@ func (t *Text) CreateRange(from, to int) (*RGATreeSplitNodePos, *RGATreeSplitNod func (t *Text) Edit( from, to *RGATreeSplitNodePos, - latestCreatedAtMapByActor map[string]*time.Ticket, + maxCreatedAtMapByActor map[string]*time.Ticket, content string, attributes map[string]string, executedAt *time.Ticket, -) (*RGATreeSplitNodePos, map[string]*time.Ticket, error) { +) (*RGATreeSplitNodePos, map[string]*time.Ticket, []GCPair, error) { val := NewTextValue(content, NewRHT()) for key, value := range attributes { val.attrs.Set(key, value, executedAt) @@ -236,7 +282,7 @@ func (t *Text) Edit( return t.rgaTreeSplit.edit( from, to, - latestCreatedAtMapByActor, + maxCreatedAtMapByActor, val, executedAt, ) @@ -246,18 +292,18 @@ func (t *Text) Edit( func (t *Text) Style( from, to *RGATreeSplitNodePos, - latestCreatedAtMapByActor map[string]*time.Ticket, + maxCreatedAtMapByActor map[string]*time.Ticket, attributes map[string]string, executedAt *time.Ticket, -) (map[string]*time.Ticket, error) { +) (map[string]*time.Ticket, []GCPair, error) { // 01. Split nodes with from and to _, toRight, err := t.rgaTreeSplit.findNodeWithSplit(to, executedAt) if err != nil { - return nil, err + return nil, nil, err } _, fromRight, err := t.rgaTreeSplit.findNodeWithSplit(from, executedAt) if err != nil { - return nil, err + return nil, nil, err } // 02. style nodes between from and to @@ -268,36 +314,42 @@ func (t *Text) Style( for _, node := range nodes { actorIDHex := node.id.createdAt.ActorIDHex() - var latestCreatedAt *time.Ticket - if len(latestCreatedAtMapByActor) == 0 { - latestCreatedAt = time.MaxTicket + var maxCreatedAt *time.Ticket + if len(maxCreatedAtMapByActor) == 0 { + maxCreatedAt = time.MaxTicket } else { - createdAt, ok := latestCreatedAtMapByActor[actorIDHex] + createdAt, ok := maxCreatedAtMapByActor[actorIDHex] if ok { - latestCreatedAt = createdAt + maxCreatedAt = createdAt } else { - latestCreatedAt = time.InitialTicket + maxCreatedAt = time.InitialTicket } } - if node.canStyle(executedAt, latestCreatedAt) { - latestCreatedAt = createdAtMapByActor[actorIDHex] + if node.canStyle(executedAt, maxCreatedAt) { + maxCreatedAt = createdAtMapByActor[actorIDHex] createdAt := node.id.createdAt - if latestCreatedAt == nil || createdAt.After(latestCreatedAt) { + if maxCreatedAt == nil || createdAt.After(maxCreatedAt) { createdAtMapByActor[actorIDHex] = createdAt } toBeStyled = append(toBeStyled, node) } } + var pairs []GCPair for _, node := range toBeStyled { val := node.value for key, value := range attributes { - val.attrs.Set(key, value, executedAt) + if rhtNode := val.attrs.Set(key, value, executedAt); rhtNode != nil { + pairs = append(pairs, GCPair{ + Parent: node.Value(), + Child: rhtNode, + }) + } } } - return createdAtMapByActor, nil + return createdAtMapByActor, pairs, nil } // Nodes returns the internal nodes of this Text. @@ -317,12 +369,12 @@ func (t *Text) CheckWeight() bool { return t.rgaTreeSplit.CheckWeight() } -// removedNodesLen returns length of removed nodes -func (t *Text) removedNodesLen() int { - return t.rgaTreeSplit.removedNodesLen() +// TreeByIndex returns IndexTree of the text for debugging purpose. +func (t *Text) TreeByIndex() *splay.Tree[*RGATreeSplitNode[*TextValue]] { + return t.rgaTreeSplit.treeByIndex } -// purgeRemovedNodesBefore physically purges nodes that have been removed. -func (t *Text) purgeRemovedNodesBefore(ticket *time.Ticket) (int, error) { - return t.rgaTreeSplit.purgeRemovedNodesBefore(ticket) +// 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/crdt/text_test.go b/pkg/document/crdt/text_test.go index 0b2ee5ed1..474cf819b 100644 --- a/pkg/document/crdt/text_test.go +++ b/pkg/document/crdt/text_test.go @@ -32,12 +32,12 @@ func TestText(t *testing.T) { text := crdt.NewText(crdt.NewRGATreeSplit(crdt.InitialTextNode()), ctx.IssueTimeTicket()) fromPos, toPos, _ := text.CreateRange(0, 0) - _, _, err := text.Edit(fromPos, toPos, nil, "Hello World", nil, ctx.IssueTimeTicket()) + _, _, _, err := text.Edit(fromPos, toPos, nil, "Hello World", nil, ctx.IssueTimeTicket()) assert.NoError(t, err) assert.Equal(t, `[{"val":"Hello World"}]`, text.Marshal()) fromPos, toPos, _ = text.CreateRange(6, 11) - _, _, err = text.Edit(fromPos, toPos, nil, "Yorkie", nil, ctx.IssueTimeTicket()) + _, _, _, err = text.Edit(fromPos, toPos, nil, "Yorkie", nil, ctx.IssueTimeTicket()) assert.NoError(t, err) assert.Equal(t, `[{"val":"Hello "},{"val":"Yorkie"}]`, text.Marshal()) }) @@ -70,17 +70,17 @@ func TestText(t *testing.T) { text := crdt.NewText(crdt.NewRGATreeSplit(crdt.InitialTextNode()), ctx.IssueTimeTicket()) fromPos, toPos, _ := text.CreateRange(0, 0) - _, _, err := text.Edit(fromPos, toPos, nil, "Hello World", nil, ctx.IssueTimeTicket()) + _, _, _, err := text.Edit(fromPos, toPos, nil, "Hello World", nil, ctx.IssueTimeTicket()) assert.NoError(t, err) assert.Equal(t, `[{"val":"Hello World"}]`, text.Marshal()) fromPos, toPos, _ = text.CreateRange(6, 11) - _, _, err = text.Edit(fromPos, toPos, nil, "Yorkie", nil, ctx.IssueTimeTicket()) + _, _, _, err = text.Edit(fromPos, toPos, nil, "Yorkie", nil, ctx.IssueTimeTicket()) assert.NoError(t, err) assert.Equal(t, `[{"val":"Hello "},{"val":"Yorkie"}]`, text.Marshal()) fromPos, toPos, _ = text.CreateRange(0, 1) - _, err = text.Style(fromPos, toPos, nil, map[string]string{"b": "1"}, ctx.IssueTimeTicket()) + _, _, err = text.Style(fromPos, toPos, nil, map[string]string{"b": "1"}, ctx.IssueTimeTicket()) assert.NoError(t, err) assert.Equal( t, diff --git a/pkg/document/crdt/tree.go b/pkg/document/crdt/tree.go index ad160a420..42454818b 100644 --- a/pkg/document/crdt/tree.go +++ b/pkg/document/crdt/tree.go @@ -20,6 +20,7 @@ import ( "errors" "fmt" "slices" + "sort" "strconv" "strings" "unicode/utf16" @@ -43,25 +44,6 @@ type TreeNodeForTest struct { IsRemoved bool } -// TreeNode is a node of Tree. -type TreeNode struct { - Index *index.Node[*TreeNode] - - ID *TreeNodeID - RemovedAt *time.Ticket - - InsPrevID *TreeNodeID - InsNextID *TreeNodeID - - // Value is optional. If the value is not empty, it means that the node is a - // text node. - Value string - - // Attrs is optional. If the value is not empty, - //it means that the node is an element node. - Attrs *RHT -} - // TreePos represents a position in the tree. It is used to determine the // position of insertion, deletion, and style change. type TreePos struct { @@ -110,7 +92,7 @@ func NewTreeNodeID(createdAt *time.Ticket, offset int) *TreeNodeID { // NewTreeNode creates a new instance of TreeNode. func NewTreeNode(id *TreeNodeID, nodeType string, attributes *RHT, value ...string) *TreeNode { - node := &TreeNode{ID: id} + node := &TreeNode{id: id} // NOTE(hackerwins): The value of TreeNode is optional. If the value is // empty, it means that the node is an element node. @@ -148,6 +130,25 @@ func (t *TreeNodeID) Equals(id *TreeNodeID) bool { return t.CreatedAt.Compare(id.CreatedAt) == 0 && t.Offset == id.Offset } +// TreeNode is a node of Tree. +type TreeNode struct { + Index *index.Node[*TreeNode] + + id *TreeNodeID + removedAt *time.Ticket + + InsPrevID *TreeNodeID + InsNextID *TreeNodeID + + // Value is optional. If the value is not empty, it means that the node is a + // text node. + Value string + + // Attrs is optional. If the value is not empty, + //it means that the node is an element node. + Attrs *RHT +} + // Type returns the type of the Node. func (n *TreeNode) Type() string { return n.Index.Type @@ -163,9 +164,29 @@ func (n *TreeNode) IsText() bool { return n.Index.IsText() } +// ID returns the ID of this Node. +func (n *TreeNode) ID() *TreeNodeID { + return n.id +} + +// IDString returns the IDString of this Node. +func (n *TreeNode) IDString() string { + return n.id.toIDString() +} + +// RemovedAt returns the removal time of this Node. +func (n *TreeNode) RemovedAt() *time.Ticket { + return n.removedAt +} + +// SetRemovedAt sets the removal time of this node. +func (n *TreeNode) SetRemovedAt(ticket *time.Ticket) { + n.removedAt = ticket +} + // IsRemoved returns whether the Node is removed or not. func (n *TreeNode) IsRemoved() bool { - return n.RemovedAt != nil + return n.removedAt != nil } // Length returns the length of this node. @@ -184,8 +205,27 @@ func (n *TreeNode) Attributes() string { if n.Attrs == nil || n.Attrs.Len() == 0 { return "" } + members := n.Attrs.Elements() + + size := len(members) + + // Extract and sort the keys + keys := make([]string, 0, size) + for k := range members { + keys = append(keys, k) + } + sort.Strings(keys) - return " " + n.Attrs.ToXML() + sb := strings.Builder{} + for idx, k := range keys { + if idx > 0 { + sb.WriteString(" ") + } + value := members[k] + sb.WriteString(fmt.Sprintf(`%s="%s"`, k, EscapeString(value))) + } + + return " " + sb.String() } // Append appends the given node to the end of the children. @@ -218,12 +258,18 @@ func (n *TreeNode) Child(offset int) (*TreeNode, error) { return child.Value, nil } +// Purge removes the given child from the children. +func (n *TreeNode) Purge(child GCChild) error { + rhtNode := child.(*RHTNode) + return n.Attrs.Purge(rhtNode) +} + // Split splits the node at the given offset. func (n *TreeNode) Split(tree *Tree, offset int, issueTimeTicket func() *time.Ticket) error { var split *TreeNode var err error if n.IsText() { - split, err = n.SplitText(offset, n.ID.Offset) + split, err = n.SplitText(offset, n.id.Offset) if err != nil { return err } @@ -235,14 +281,14 @@ func (n *TreeNode) Split(tree *Tree, offset int, issueTimeTicket func() *time.Ti } if split != nil { - split.InsPrevID = n.ID + split.InsPrevID = n.id if n.InsNextID != nil { insNext := tree.findFloorNode(n.InsNextID) - insNext.InsPrevID = split.ID + insNext.InsPrevID = split.id split.InsNextID = n.InsNextID } - n.InsNextID = split.ID - tree.NodeMapByID.Put(split.ID, split) + n.InsNextID = split.id + tree.NodeMapByID.Put(split.id, split) } return nil @@ -266,10 +312,10 @@ func (n *TreeNode) SplitText(offset, absOffset int) (*TreeNode, error) { n.Index.Length = len(leftRune) rightNode := NewTreeNode(&TreeNodeID{ - CreatedAt: n.ID.CreatedAt, + CreatedAt: n.id.CreatedAt, Offset: offset + absOffset, }, n.Type(), nil, string(rightRune)) - rightNode.RemovedAt = n.RemovedAt + rightNode.removedAt = n.removedAt if err := n.Index.Parent.InsertAfterInternal( rightNode.Index, @@ -283,14 +329,14 @@ func (n *TreeNode) SplitText(offset, absOffset int) (*TreeNode, error) { // SplitElement splits the given element at the given offset. func (n *TreeNode) SplitElement(offset int, issueTimeTicket func() *time.Ticket) (*TreeNode, error) { - // TODO(hackerwins): Define ID of split node for concurrent editing. + // TODO(hackerwins): Define IDString of split node for concurrent editing. // Text has fixed content and its split nodes could have limited offset // range. But element node could have arbitrary children and its split // nodes could have arbitrary offset range. So, id could be duplicated // and its order could be broken when concurrent editing happens. - // Currently, we use the similar ID of split element with the split text. + // Currently, we use the similar IDString of split element with the split text. split := NewTreeNode(&TreeNodeID{CreatedAt: issueTimeTicket(), Offset: 0}, n.Type(), nil) - split.RemovedAt = n.RemovedAt + split.removedAt = n.removedAt if err := n.Index.Parent.InsertAfterInternal(split.Index, n.Index); err != nil { return nil, err } @@ -298,10 +344,10 @@ func (n *TreeNode) SplitElement(offset int, issueTimeTicket func() *time.Ticket) leftChildren := n.Index.Children(true)[0:offset] rightChildren := n.Index.Children(true)[offset:] - if err := n.Index.SetChildrenInternal(leftChildren); err != nil { + if err := n.Index.SetChildren(leftChildren); err != nil { return nil, err } - if err := split.Index.SetChildrenInternal(rightChildren); err != nil { + if err := split.Index.SetChildren(rightChildren); err != nil { return nil, err } @@ -322,30 +368,36 @@ func (n *TreeNode) SplitElement(offset int, issueTimeTicket func() *time.Ticket) // remove marks the node as removed. func (n *TreeNode) remove(removedAt *time.Ticket) bool { - justRemoved := n.RemovedAt == nil - if n.RemovedAt == nil || n.RemovedAt.Compare(removedAt) > 0 { - n.RemovedAt = removedAt + justRemoved := n.removedAt == nil + + if n.removedAt == nil || n.removedAt.Compare(removedAt) > 0 { + n.removedAt = removedAt if justRemoved { - if n.Index.Parent.Value.RemovedAt == nil { - n.Index.UpdateAncestorsSize() - } else { - n.Index.Parent.Length -= n.Index.PaddedLength() - } + n.Index.UpdateAncestorsSize() } - return true + return justRemoved } return false } -func (n *TreeNode) canDelete(removedAt *time.Ticket, latestCreatedAt *time.Ticket) bool { - if !n.ID.CreatedAt.After(latestCreatedAt) && - (n.RemovedAt == nil || n.RemovedAt.Compare(removedAt) > 0) { +func (n *TreeNode) canDelete(removedAt *time.Ticket, maxCreatedAt *time.Ticket) bool { + if !n.id.CreatedAt.After(maxCreatedAt) && + (n.removedAt == nil || n.removedAt.Compare(removedAt) > 0) { return true } return false } +func (n *TreeNode) canStyle(editedAt *time.Ticket, maxCreatedAt *time.Ticket) bool { + if n.IsText() { + return false + } + + return !n.id.CreatedAt.After(maxCreatedAt) && + (n.removedAt == nil || editedAt.After(n.removedAt)) +} + // InsertAt inserts the given node at the given offset. func (n *TreeNode) InsertAt(newNode *TreeNode, offset int) error { return n.Index.InsertAt(newNode.Index, offset) @@ -353,13 +405,16 @@ func (n *TreeNode) InsertAt(newNode *TreeNode, offset int) error { // DeepCopy copies itself deeply. func (n *TreeNode) DeepCopy() (*TreeNode, error) { - var clone *TreeNode + var attrs *RHT if n.Attrs != nil { - clone = NewTreeNode(n.ID, n.Type(), n.Attrs.DeepCopy(), n.Value) - } else { - clone = NewTreeNode(n.ID, n.Type(), nil, n.Value) + attrs = n.Attrs.DeepCopy() } - clone.RemovedAt = n.RemovedAt + + clone := NewTreeNode(n.id, n.Type(), attrs, n.Value) + clone.Index.Length = n.Index.Length + clone.removedAt = n.removedAt + clone.InsPrevID = n.InsPrevID + clone.InsNextID = n.InsNextID if n.IsText() { return clone, nil @@ -374,6 +429,7 @@ func (n *TreeNode) DeepCopy() (*TreeNode, error) { children = append(children, node.Index) } + if err := clone.Index.SetChildren(children); err != nil { return nil, err } @@ -386,12 +442,48 @@ func (n *TreeNode) InsertAfter(content *TreeNode, children *TreeNode) error { return n.Index.InsertAfter(content.Index, children.Index) } +// SetAttr sets the given attribute of the element. +func (n *TreeNode) SetAttr(k string, v string, ticket *time.Ticket) *RHTNode { + if n.Attrs == nil { + n.Attrs = NewRHT() + } + + return n.Attrs.Set(k, v, ticket) +} + +// RemoveAttr removes the given attribute of the element. +func (n *TreeNode) RemoveAttr(k string, ticket *time.Ticket) []*RHTNode { + if n.Attrs == nil { + n.Attrs = NewRHT() + } + + return n.Attrs.Remove(k, ticket) +} + +// GCPairs returns the pairs of GC. +func (n *TreeNode) GCPairs() []GCPair { + if n.Attrs == nil { + return nil + } + + var pairs []GCPair + for _, node := range n.Attrs.Nodes() { + if node.isRemoved { + pairs = append(pairs, GCPair{ + Parent: n, + Child: node, + }) + } + } + + return pairs +} + // Tree represents the tree of CRDT. It has doubly linked list structure and // index tree structure. type Tree struct { - IndexTree *index.Tree[*TreeNode] - NodeMapByID *llrb.Tree[*TreeNodeID, *TreeNode] - removedNodeMap map[string]*TreeNode + IndexTree *index.Tree[*TreeNode] + NodeMapByID *llrb.Tree[*TreeNodeID, *TreeNode] createdAt *time.Ticket movedAt *time.Ticket @@ -401,14 +493,13 @@ type Tree struct { // NewTree creates a new instance of Tree. func NewTree(root *TreeNode, createdAt *time.Ticket) *Tree { tree := &Tree{ - IndexTree: index.NewTree[*TreeNode](root.Index), - NodeMapByID: llrb.NewTree[*TreeNodeID, *TreeNode](), - removedNodeMap: make(map[string]*TreeNode), - createdAt: createdAt, + IndexTree: index.NewTree[*TreeNode](root.Index), + NodeMapByID: llrb.NewTree[*TreeNodeID, *TreeNode](), + createdAt: createdAt, } index.Traverse(tree.IndexTree, func(node *index.Node[*TreeNode], depth int) { - tree.NodeMapByID.Put(node.Value.ID, node.Value) + tree.NodeMapByID.Put(node.Value.id, node.Value) }) return tree @@ -421,38 +512,14 @@ func (t *Tree) Marshal() string { return builder.String() } -// removedNodesLen returns the length of removed nodes. -func (t *Tree) removedNodesLen() int { - return len(t.removedNodeMap) -} - -// purgeRemovedNodesBefore physically purges nodes that have been removed. -func (t *Tree) purgeRemovedNodesBefore(ticket *time.Ticket) (int, error) { - count := 0 - nodesToBeRemoved := make(map[*TreeNode]bool) - - for _, node := range t.removedNodeMap { - if node.RemovedAt != nil && ticket.Compare(node.RemovedAt) >= 0 { - count++ - nodesToBeRemoved[node] = true - } - } - - for node := range nodesToBeRemoved { - if err := t.purgeNode(node); err != nil { - return 0, err - } - } - - return count, nil -} +// Purge physically purges the given node. +func (t *Tree) Purge(child GCChild) error { + node := child.(*TreeNode) -// purgeNode physically purges the given node. -func (t *Tree) purgeNode(node *TreeNode) error { if err := node.Index.Parent.RemoveChild(node.Index); err != nil { return err } - t.NodeMapByID.Remove(node.ID) + t.NodeMapByID.Remove(node.id) insPrevID := node.InsPrevID insNextID := node.InsNextID @@ -467,14 +534,13 @@ func (t *Tree) purgeNode(node *TreeNode) error { node.InsPrevID = nil node.InsNextID = nil - delete(t.removedNodeMap, node.ID.toIDString()) return nil } // marshal returns the JSON encoding of this Tree. func marshal(builder *strings.Builder, node *TreeNode) { if node.IsText() { - builder.WriteString(fmt.Sprintf(`{"type":"%s","value":"%s"}`, node.Type(), node.Value)) + builder.WriteString(fmt.Sprintf(`{"type":"%s","value":"%s"}`, node.Type(), EscapeString(node.Value))) return } @@ -505,6 +571,26 @@ func (t *Tree) DeepCopy() (Element, error) { return NewTree(node, t.createdAt), nil } +// GCPairs returns the pairs of GC. +func (t *Tree) GCPairs() []GCPair { + var pairs []GCPair + + for _, node := range t.Nodes() { + if node.removedAt != nil { + pairs = append(pairs, GCPair{ + Parent: t, + Child: node, + }) + } + + for _, p := range node.GCPairs() { + pairs = append(pairs, p) + } + } + + return pairs +} + // CreatedAt returns the creation time of this Tree. func (t *Tree) CreatedAt() *time.Ticket { return t.createdAt @@ -555,6 +641,11 @@ func (t *Tree) Root() *TreeNode { return t.IndexTree.Root().Value } +// NodeLen returns the size of the LLRBTree. +func (t *Tree) NodeLen() int { + return t.NodeMapByID.Len() +} + // ToXML returns the XML encoding of this tree. func (t *Tree) ToXML() string { return ToXML(t.Root()) @@ -568,17 +659,18 @@ func (t *Tree) EditT( splitLevel int, editedAt *time.Ticket, issueTimeTicket func() *time.Ticket, -) (map[string]*time.Ticket, error) { +) error { fromPos, err := t.FindPos(start) if err != nil { - return nil, err + return err } toPos, err := t.FindPos(end) if err != nil { - return nil, err + return err } - return t.Edit(fromPos, toPos, contents, splitLevel, editedAt, issueTimeTicket, nil) + _, _, err = t.Edit(fromPos, toPos, contents, splitLevel, editedAt, issueTimeTicket, nil) + return err } // FindPos finds the position of the given index in the tree. @@ -608,10 +700,10 @@ func (t *Tree) FindPos(offset int) (*TreePos, error) { } return &TreePos{ - ParentID: node.Value.ID, + ParentID: node.Value.id, LeftSiblingID: &TreeNodeID{ - CreatedAt: leftNode.ID.CreatedAt, - Offset: leftNode.ID.Offset + offset, + CreatedAt: leftNode.id.CreatedAt, + Offset: leftNode.id.Offset + offset, }, }, nil } @@ -624,45 +716,49 @@ func (t *Tree) Edit( splitLevel int, editedAt *time.Ticket, issueTimeTicket func() *time.Ticket, - latestCreatedAtMapByActor map[string]*time.Ticket, -) (map[string]*time.Ticket, error) { + maxCreatedAtMapByActor map[string]*time.Ticket, +) (map[string]*time.Ticket, []GCPair, error) { // 01. find nodes from the given range and split nodes. fromParent, fromLeft, err := t.FindTreeNodesWithSplitText(from, editedAt) if err != nil { - return nil, err + return nil, nil, err } toParent, toLeft, err := t.FindTreeNodesWithSplitText(to, editedAt) if err != nil { - return nil, err + return nil, nil, err } - toBeRemoveds, toBeMovedToFromParents, createdAtMapByActor, err := t.collectBetween( + toBeRemoveds, toBeMovedToFromParents, maxCreatedAtMap, err := t.collectBetween( fromParent, fromLeft, toParent, toLeft, - latestCreatedAtMapByActor, editedAt, + maxCreatedAtMapByActor, editedAt, ) if err != nil { - return nil, err + return nil, nil, err } // 02. Delete: delete the nodes that are marked as removed. + var pairs []GCPair for _, node := range toBeRemoveds { if node.remove(editedAt) { - t.removedNodeMap[node.ID.toIDString()] = node + pairs = append(pairs, GCPair{ + Parent: t, + Child: node, + }) } } // 03. Merge: move the nodes that are marked as moved. for _, node := range toBeMovedToFromParents { - if node.RemovedAt == nil { + if node.removedAt == nil { if err := fromParent.Append(node); err != nil { - return nil, err + return nil, nil, err } } } // 04. Split: split the element nodes for the given splitLevel. if err := t.split(fromParent, fromLeft, splitLevel, issueTimeTicket); err != nil { - return nil, err + return nil, nil, err } // 05. Insert: insert the given node at the given position. @@ -675,13 +771,13 @@ func (t *Tree) Edit( // 05-1-1. when there's no leftSibling, then insert content into very front of parent's children List err := fromParent.InsertAt(content, 0) if err != nil { - return nil, err + return nil, nil, err } } else { // 05-1-2. insert after leftSibling err := fromParent.InsertAfter(content, leftInChildren) if err != nil { - return nil, err + return nil, nil, err } } @@ -690,32 +786,36 @@ func (t *Tree) Edit( // if insertion happens during concurrent editing and parent node has been removed, // make new nodes as tombstone immediately if fromParent.IsRemoved() { - actorIDHex := node.Value.ID.CreatedAt.ActorIDHex() + actorIDHex := node.Value.id.CreatedAt.ActorIDHex() if node.Value.remove(editedAt) { - latestCreatedAt := createdAtMapByActor[actorIDHex] - createdAt := node.Value.ID.CreatedAt - if latestCreatedAt == nil || createdAt.After(latestCreatedAt) { - createdAtMapByActor[actorIDHex] = createdAt + maxCreatedAt := maxCreatedAtMap[actorIDHex] + createdAt := node.Value.id.CreatedAt + if maxCreatedAt == nil || createdAt.After(maxCreatedAt) { + maxCreatedAtMap[actorIDHex] = createdAt } } - t.removedNodeMap[node.Value.ID.toIDString()] = node.Value + + pairs = append(pairs, GCPair{ + Parent: t, + Child: node.Value, + }) } - t.NodeMapByID.Put(node.Value.ID, node.Value) + t.NodeMapByID.Put(node.Value.id, node.Value) }) } } - return createdAtMapByActor, nil + return maxCreatedAtMap, pairs, nil } // collectBetween collects nodes that are marked as removed or moved. It also -// returns the latestCreatedAtMapByActor that is used to determine whether the +// returns the maxCreatedAtMapByActor that is used to determine whether the // node can be deleted or not. func (t *Tree) collectBetween( fromParent *TreeNode, fromLeft *TreeNode, toParent *TreeNode, toLeft *TreeNode, - latestCreatedAtMapByActor map[string]*time.Ticket, editedAt *time.Ticket, + maxCreatedAtMapByActor map[string]*time.Ticket, editedAt *time.Ticket, ) ([]*TreeNode, []*TreeNode, map[string]*time.Ticket, error) { var toBeRemoveds []*TreeNode var toBeMovedToFromParents []*TreeNode @@ -742,26 +842,26 @@ func (t *Tree) collectBetween( } } - actorIDHex := node.ID.CreatedAt.ActorIDHex() + actorIDHex := node.id.CreatedAt.ActorIDHex() - var latestCreatedAt *time.Ticket - if latestCreatedAtMapByActor == nil { - latestCreatedAt = time.MaxTicket + var maxCreatedAt *time.Ticket + if maxCreatedAtMapByActor == nil { + maxCreatedAt = time.MaxTicket } else { - createdAt, ok := latestCreatedAtMapByActor[actorIDHex] + createdAt, ok := maxCreatedAtMapByActor[actorIDHex] if ok { - latestCreatedAt = createdAt + maxCreatedAt = createdAt } else { - latestCreatedAt = time.InitialTicket + maxCreatedAt = time.InitialTicket } } // NOTE(sejongk): If the node is removable or its parent is going to // be removed, then this node should be removed. - if node.canDelete(editedAt, latestCreatedAt) || slices.Contains(toBeRemoveds, node.Index.Parent.Value) { - latestCreatedAt = createdAtMapByActor[actorIDHex] - createdAt := node.ID.CreatedAt - if latestCreatedAt == nil || createdAt.After(latestCreatedAt) { + if node.canDelete(editedAt, maxCreatedAt) || slices.Contains(toBeRemoveds, node.Index.Parent.Value) { + maxCreatedAt = createdAtMapByActor[actorIDHex] + createdAt := node.id.CreatedAt + if maxCreatedAt == nil || createdAt.After(maxCreatedAt) { createdAtMapByActor[actorIDHex] = createdAt } // NOTE(hackerwins): If the node overlaps as an end token with the @@ -830,82 +930,137 @@ func (t *Tree) traverseInPosRange(fromParent, fromLeft, toParent, toLeft *TreeNo // StyleByIndex applies the given attributes of the given range. // This method uses indexes instead of a pair of TreePos for testing. -func (t *Tree) StyleByIndex(start, end int, attributes map[string]string, editedAt *time.Ticket) error { +func (t *Tree) StyleByIndex( + start, end int, + attributes map[string]string, + editedAt *time.Ticket, + maxCreatedAtMapByActor map[string]*time.Ticket, +) (map[string]*time.Ticket, []GCPair, error) { fromPos, err := t.FindPos(start) if err != nil { - return err + return nil, nil, err } toPos, err := t.FindPos(end) if err != nil { - return err + return nil, nil, err } - return t.Style(fromPos, toPos, attributes, editedAt) + return t.Style(fromPos, toPos, attributes, editedAt, maxCreatedAtMapByActor) } // Style applies the given attributes of the given range. -func (t *Tree) Style(from, to *TreePos, attributes map[string]string, editedAt *time.Ticket) error { - // 01. split text nodes at the given range if needed. +func (t *Tree) Style( + from, to *TreePos, + attrs map[string]string, + editedAt *time.Ticket, + maxCreatedAtMapByActor map[string]*time.Ticket, +) (map[string]*time.Ticket, []GCPair, error) { fromParent, fromLeft, err := t.FindTreeNodesWithSplitText(from, editedAt) if err != nil { - return err + return nil, nil, err } toParent, toLeft, err := t.FindTreeNodesWithSplitText(to, editedAt) if err != nil { - return err + return nil, nil, err } - err = t.traverseInPosRange(fromParent, fromLeft, toParent, toLeft, - func(token index.TreeToken[*TreeNode], _ bool) { - node := token.Node - if !node.IsRemoved() && !node.IsText() && len(attributes) > 0 { - if node.Attrs == nil { - node.Attrs = NewRHT() - } + var pairs []GCPair + createdAtMapByActor := make(map[string]*time.Ticket) + if err = t.traverseInPosRange(fromParent, fromLeft, toParent, toLeft, func(token index.TreeToken[*TreeNode], _ bool) { + node := token.Node + actorIDHex := node.id.CreatedAt.ActorIDHex() + + var maxCreatedAt *time.Ticket + if maxCreatedAtMapByActor == nil { + maxCreatedAt = time.MaxTicket + } else { + if createdAt, ok := maxCreatedAtMapByActor[actorIDHex]; ok { + maxCreatedAt = createdAt + } else { + maxCreatedAt = time.InitialTicket + } + } - for key, value := range attributes { - node.Attrs.Set(key, value, editedAt) + if node.canStyle(editedAt, maxCreatedAt) && len(attrs) > 0 { + maxCreatedAt = createdAtMapByActor[actorIDHex] + createdAt := node.id.CreatedAt + if maxCreatedAt == nil || createdAt.After(maxCreatedAt) { + createdAtMapByActor[actorIDHex] = createdAt + } + + for key, value := range attrs { + if rhtNode := node.SetAttr(key, value, editedAt); rhtNode != nil { + pairs = append(pairs, GCPair{ + Parent: node, + Child: rhtNode, + }) } } - }) - if err != nil { - return err + } + }); err != nil { + return nil, nil, err } - return nil + return createdAtMapByActor, pairs, nil } // RemoveStyle removes the given attributes of the given range. -func (t *Tree) RemoveStyle(from, to *TreePos, attributesToRemove []string, editedAt *time.Ticket) error { - // 01. split text nodes at the given range if needed. +func (t *Tree) RemoveStyle( + from *TreePos, + to *TreePos, + attrs []string, + editedAt *time.Ticket, + maxCreatedAtMapByActor map[string]*time.Ticket, +) (map[string]*time.Ticket, []GCPair, error) { fromParent, fromLeft, err := t.FindTreeNodesWithSplitText(from, editedAt) if err != nil { - return err + return nil, nil, err } toParent, toLeft, err := t.FindTreeNodesWithSplitText(to, editedAt) if err != nil { - return err + return nil, nil, err } - err = t.traverseInPosRange(fromParent, fromLeft, toParent, toLeft, - func(token index.TreeToken[*TreeNode], _ bool) { - node := token.Node - // NOTE(justiceHui): Even if key is not existed, we must set flag `isRemoved` for concurrency - if !node.IsRemoved() && !node.IsText() { - if node.Attrs == nil { - node.Attrs = NewRHT() - } - for _, value := range attributesToRemove { - node.Attrs.Remove(value, editedAt) + var pairs []GCPair + createdAtMapByActor := make(map[string]*time.Ticket) + if err = t.traverseInPosRange(fromParent, fromLeft, toParent, toLeft, func(token index.TreeToken[*TreeNode], _ bool) { + node := token.Node + actorIDHex := node.id.CreatedAt.ActorIDHex() + + var maxCreatedAt *time.Ticket + if maxCreatedAtMapByActor == nil { + maxCreatedAt = time.MaxTicket + } else { + if createdAt, ok := maxCreatedAtMapByActor[actorIDHex]; ok { + maxCreatedAt = createdAt + } else { + maxCreatedAt = time.InitialTicket + } + } + + if node.canStyle(editedAt, maxCreatedAt) && len(attrs) > 0 { + maxCreatedAt = createdAtMapByActor[actorIDHex] + createdAt := node.id.CreatedAt + if maxCreatedAt == nil || createdAt.After(maxCreatedAt) { + createdAtMapByActor[actorIDHex] = createdAt + } + + for _, attr := range attrs { + rhtNodes := node.RemoveAttr(attr, editedAt) + for _, rhtNode := range rhtNodes { + pairs = append(pairs, GCPair{ + Parent: node, + Child: rhtNode, + }) } } - }) - if err != nil { - return err + } + }); err != nil { + return nil, nil, err } - return nil + return createdAtMapByActor, pairs, nil } // FindTreeNodesWithSplitText finds TreeNode of the given crdt.TreePos and @@ -917,7 +1072,7 @@ func (t *Tree) FindTreeNodesWithSplitText(pos *TreePos, editedAt *time.Ticket) ( *TreeNode, *TreeNode, error, ) { // 01. Find the parent and left sibling nodes of the given position. - parentNode, leftNode := t.toTreeNodes(pos) + parentNode, leftNode := t.ToTreeNodes(pos) if parentNode == nil || leftNode == nil { return nil, nil, fmt.Errorf("%p: %w", pos, ErrNodeNotFound) } @@ -932,7 +1087,7 @@ func (t *Tree) FindTreeNodesWithSplitText(pos *TreePos, editedAt *time.Ticket) ( // 03. Split text node if the left node is text node. if leftNode.IsText() { - err := leftNode.Split(t, pos.LeftSiblingID.Offset-leftNode.ID.Offset, nil) + err := leftNode.Split(t, pos.LeftSiblingID.Offset-leftNode.id.Offset, nil) if err != nil { return nil, nil, err } @@ -949,7 +1104,7 @@ func (t *Tree) FindTreeNodesWithSplitText(pos *TreePos, editedAt *time.Ticket) ( parentChildren := realParentNode.Index.Children(true) for i := idx; i < len(parentChildren); i++ { next := parentChildren[i].Value - if !next.ID.CreatedAt.After(editedAt) { + if !next.id.CreatedAt.After(editedAt) { break } leftNode = next @@ -1030,6 +1185,19 @@ func (t *Tree) ToIndex(parentNode, leftSiblingNode *TreeNode) (int, error) { return idx, nil } +// ToPath returns path from given CRDTTreePos +func (t *Tree) ToPath(parentNode, leftSiblingNode *TreeNode) ([]int, error) { + treePos, err := t.toTreePos(parentNode, leftSiblingNode) + if err != nil { + return nil, err + } + if treePos == nil { + return nil, nil + } + + return t.IndexTree.TreePosToPath(treePos) +} + // findFloorNode returns node from given id. func (t *Tree) findFloorNode(id *TreeNodeID) *TreeNode { key, node := t.NodeMapByID.Floor(id) @@ -1041,11 +1209,11 @@ func (t *Tree) findFloorNode(id *TreeNodeID) *TreeNode { return node } -// toTreeNodes converts the pos to parent and left sibling nodes. +// ToTreeNodes converts the pos to parent and left sibling nodes. // If the position points to the middle of a node, then the left sibling node // is the node that contains the position. Otherwise, the left sibling node is // the node that is the left of the position. -func (t *Tree) toTreeNodes(pos *TreePos) (*TreeNode, *TreeNode) { +func (t *Tree) ToTreeNodes(pos *TreePos) (*TreeNode, *TreeNode) { parentNode := t.findFloorNode(pos.ParentID) leftNode := t.findFloorNode(pos.LeftSiblingID) @@ -1056,9 +1224,9 @@ func (t *Tree) toTreeNodes(pos *TreePos) (*TreeNode, *TreeNode) { // NOTE(hackerwins): If the left node and the parent node are the same, // it means that the position is the left-most of the parent node. // We need to skip finding the left of the position. - if !pos.LeftSiblingID.Equals(parentNode.ID) && + if !pos.LeftSiblingID.Equals(parentNode.id) && pos.LeftSiblingID.Offset > 0 && - pos.LeftSiblingID.Offset == leftNode.ID.Offset && + pos.LeftSiblingID.Offset == leftNode.id.Offset && leftNode.InsPrevID != nil { return parentNode, t.findFloorNode(leftNode.InsPrevID) } diff --git a/pkg/document/crdt/tree_test.go b/pkg/document/crdt/tree_test.go index 05f0f5645..3384fe727 100644 --- a/pkg/document/crdt/tree_test.go +++ b/pkg/document/crdt/tree_test.go @@ -34,10 +34,29 @@ var ( } ) +func createHelloTree(t *testing.T, ctx *change.Context) *crdt.Tree { + // TODO(raararaara): This test should be generalized. e.g) createTree(ctx, "

    hello

    ") + // https://pkg.go.dev/encoding/xml#Unmarshal + tree := crdt.NewTree(crdt.NewTreeNode(helper.PosT(ctx), "r", nil), helper.TimeT(ctx)) + err := tree.EditT(0, 0, []*crdt.TreeNode{ + crdt.NewTreeNode(helper.PosT(ctx), "p", nil), + }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + assert.NoError(t, err) + + err = tree.EditT(1, 1, []*crdt.TreeNode{ + crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "hello"), + }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + assert.NoError(t, err) + assert.Equal(t, "

    hello

    ", tree.ToXML()) + assert.Equal(t, 7, tree.Root().Len()) + + return tree +} + func TestTreeNode(t *testing.T) { t.Run("text node test", func(t *testing.T) { node := crdt.NewTreeNode(dummyTreeNodeID, "text", nil, "hello") - assert.Equal(t, dummyTreeNodeID, node.ID) + assert.Equal(t, dummyTreeNodeID, node.ID()) assert.Equal(t, "text", node.Type()) assert.Equal(t, "hello", node.Value) assert.Equal(t, 5, node.Len()) @@ -64,8 +83,8 @@ func TestTreeNode(t *testing.T) { assert.Equal(t, "hello", left.Value) assert.Equal(t, "yorkie", right.Value) - assert.Equal(t, &crdt.TreeNodeID{CreatedAt: time.InitialTicket, Offset: 0}, left.ID) - assert.Equal(t, &crdt.TreeNodeID{CreatedAt: time.InitialTicket, Offset: 5}, right.ID) + assert.Equal(t, &crdt.TreeNodeID{CreatedAt: time.InitialTicket, Offset: 0}, left.ID()) + assert.Equal(t, &crdt.TreeNodeID{CreatedAt: time.InitialTicket, Offset: 5}, right.ID()) split, err := para.SplitElement(1, func() *time.Ticket { return time.InitialTicket @@ -107,6 +126,52 @@ func TestTreeNode(t *testing.T) { assert.Equal(t, test.length-2, right.Len()) } }) + + t.Run("deepcopy test with deletion", func(t *testing.T) { + ctx := helper.TextChangeContext(helper.TestRoot()) + tree := createHelloTree(t, ctx) + + // To make tree have a deletion to check length modification. + err := tree.EditT(4, 5, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + assert.NoError(t, err) + assert.Equal(t, "

    helo

    ", tree.ToXML()) + assert.Equal(t, 6, tree.Root().Len()) + + clone, err := tree.Root().DeepCopy() + assert.NoError(t, err) + helper.AssertEqualTreeNode(t, tree.Root(), clone) + }) + + t.Run("deepcopy test with split", func(t *testing.T) { + ctx := helper.TextChangeContext(helper.TestRoot()) + tree := createHelloTree(t, ctx) + + // To make tree have split text nodes. + err := tree.EditT(3, 3, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + assert.NoError(t, err) + assert.Equal(t, "

    hello

    ", tree.ToXML()) + + clone, err := tree.Root().DeepCopy() + assert.NoError(t, err) + helper.AssertEqualTreeNode(t, tree.Root(), clone) + }) + + t.Run("ToXML test", func(t *testing.T) { + node := crdt.NewTreeNode(dummyTreeNodeID, "text", nil, "hello") + assert.Equal(t, "hello", crdt.ToXML(node)) + + para := crdt.NewTreeNode(dummyTreeNodeID, "p", nil) + assert.NoError(t, para.Append(node)) + assert.Equal(t, "

    hello

    ", crdt.ToXML(para)) + + elemWithAttrs := crdt.NewTreeNode(dummyTreeNodeID, "p", nil) + assert.NoError(t, elemWithAttrs.Append(node)) + elemWithAttrs.SetAttr("e", "\"true\"", time.MaxTicket) + assert.Equal(t, `

    hello

    `, crdt.ToXML(elemWithAttrs)) + + elemWithAttrs.SetAttr("b", "t", time.MaxTicket) + assert.Equal(t, `

    hello

    `, crdt.ToXML(elemWithAttrs)) + }) } func TestTreeEdit(t *testing.T) { @@ -121,7 +186,7 @@ func TestTreeEdit(t *testing.T) { // 1 //

    - _, err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper. + err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper. PosT(ctx), "p", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    ", tree.ToXML()) @@ -129,7 +194,7 @@ func TestTreeEdit(t *testing.T) { // 1 //

    h e l l o

    - _, err = tree.EditT(1, 1, []*crdt.TreeNode{ + err = tree.EditT(1, 1, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "hello"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) @@ -141,14 +206,14 @@ func TestTreeEdit(t *testing.T) { p := crdt.NewTreeNode(helper.PosT(ctx), "p", nil) err = p.InsertAt(crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "world"), 0) assert.NoError(t, err) - _, err = tree.EditT(7, 7, []*crdt.TreeNode{p}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + err = tree.EditT(7, 7, []*crdt.TreeNode{p}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    hello

    world

    ", tree.ToXML()) assert.Equal(t, 14, tree.Root().Len()) // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 //

    h e l l o !

    w o r l d

    - _, err = tree.EditT(6, 6, []*crdt.TreeNode{ + err = tree.EditT(6, 6, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "!"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) @@ -180,7 +245,7 @@ func TestTreeEdit(t *testing.T) { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 //

    h e l l o ~ !

    w o r l d

    - _, err = tree.EditT(6, 6, []*crdt.TreeNode{ + err = tree.EditT(6, 6, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "~"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) @@ -194,19 +259,19 @@ func TestTreeEdit(t *testing.T) { ctx := helper.TextChangeContext(helper.TestRoot()) tree := crdt.NewTree(crdt.NewTreeNode(helper.PosT(ctx), "root", nil), helper.TimeT(ctx)) - _, err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, + err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(1, 1, []*crdt.TreeNode{ + err = tree.EditT(1, 1, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "ab"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(4, 4, []*crdt.TreeNode{ + err = tree.EditT(4, 4, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "p", nil), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(5, 5, []*crdt.TreeNode{ + err = tree.EditT(5, 5, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "cd"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) @@ -220,7 +285,7 @@ func TestTreeEdit(t *testing.T) { // 02. Delete b from the second paragraph. // 0 1 2 3 4 5 6 7 //

    a

    c d

    - _, err = tree.EditT(2, 3, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + err = tree.EditT(2, 3, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    a

    cd

    ", tree.ToXML()) @@ -237,20 +302,20 @@ func TestTreeEdit(t *testing.T) { ctx := helper.TextChangeContext(helper.TestRoot()) tree := crdt.NewTree(crdt.NewTreeNode(helper.PosT(ctx), "root", nil), helper.TimeT(ctx)) - _, err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, + err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(1, 1, []*crdt.TreeNode{ + err = tree.EditT(1, 1, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "ab"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(4, 4, []*crdt.TreeNode{ + err = tree.EditT(4, 4, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "p", nil), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(5, 5, []*crdt.TreeNode{ + err = tree.EditT(5, 5, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "cd"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) @@ -260,7 +325,7 @@ func TestTreeEdit(t *testing.T) { // 02. delete b, c and the second paragraph. // 0 1 2 3 4 //

    a d

    - _, err = tree.EditT(2, 6, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + err = tree.EditT(2, 6, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    ad

    ", tree.ToXML()) @@ -271,7 +336,7 @@ func TestTreeEdit(t *testing.T) { assert.Equal(t, 1, node.Children[0].Children[1].Size) // 03. insert a new text node at the start of the first paragraph. - _, err = tree.EditT(1, 1, []*crdt.TreeNode{ + err = tree.EditT(1, 1, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "@"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) @@ -286,21 +351,21 @@ func TestTreeEdit(t *testing.T) { ctx := helper.TextChangeContext(helper.TestRoot()) tree := crdt.NewTree(crdt.NewTreeNode(helper.PosT(ctx), "root", nil), helper.TimeT(ctx)) - _, err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, + err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(1, 1, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "b", nil)}, 0, + err = tree.EditT(1, 1, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "b", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(2, 2, []*crdt.TreeNode{ + err = tree.EditT(2, 2, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "ab"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(6, 6, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, + err = tree.EditT(6, 6, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(7, 7, []*crdt.TreeNode{ + err = tree.EditT(7, 7, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "cd"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) @@ -310,7 +375,7 @@ func TestTreeEdit(t *testing.T) { // 02. delete b, c and the second paragraph. // 0 1 2 3 4 5 //

    a d - _, err = tree.EditT(3, 8, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + err = tree.EditT(3, 8, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    ad

    ", tree.ToXML()) }) @@ -319,20 +384,20 @@ func TestTreeEdit(t *testing.T) { // 01. style attributes to an element node. ctx := helper.TextChangeContext(helper.TestRoot()) tree := crdt.NewTree(crdt.NewTreeNode(helper.PosT(ctx), "root", nil), helper.TimeT(ctx)) - _, err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, + err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(1, 1, []*crdt.TreeNode{ + err = tree.EditT(1, 1, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "ab"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(4, 4, []*crdt.TreeNode{ + err = tree.EditT(4, 4, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "p", nil), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(5, 5, []*crdt.TreeNode{ + err = tree.EditT(5, 5, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "cd"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) @@ -340,28 +405,28 @@ func TestTreeEdit(t *testing.T) { assert.Equal(t, "

    ab

    cd

    ", tree.ToXML()) // style attributes with opening tag - err = tree.StyleByIndex(0, 1, map[string]string{"weight": "bold"}, helper.TimeT(ctx)) + _, _, err = tree.StyleByIndex(0, 1, map[string]string{"weight": "bold"}, helper.TimeT(ctx), nil) assert.NoError(t, err) assert.Equal(t, `

    ab

    cd

    `, tree.ToXML()) // style attributes with closing tag - err = tree.StyleByIndex(3, 4, map[string]string{"color": "red"}, helper.TimeT(ctx)) + _, _, err = tree.StyleByIndex(3, 4, map[string]string{"color": "red"}, helper.TimeT(ctx), nil) assert.NoError(t, err) assert.Equal(t, `

    ab

    cd

    `, tree.ToXML()) // style attributes with the whole - err = tree.StyleByIndex(0, 4, map[string]string{"size": "small"}, helper.TimeT(ctx)) + _, _, err = tree.StyleByIndex(0, 4, map[string]string{"size": "small"}, helper.TimeT(ctx), nil) assert.NoError(t, err) assert.Equal(t, `

    ab

    cd

    `, tree.ToXML()) // 02. style attributes to elements. - err = tree.StyleByIndex(0, 5, map[string]string{"style": "italic"}, helper.TimeT(ctx)) + _, _, err = tree.StyleByIndex(0, 5, map[string]string{"style": "italic"}, helper.TimeT(ctx), nil) assert.NoError(t, err) assert.Equal(t, `

    ab

    `+ `

    cd

    `, tree.ToXML()) // 03. Ignore styling attributes to text nodes. - err = tree.StyleByIndex(1, 3, map[string]string{"bold": "true"}, helper.TimeT(ctx)) + _, _, err = tree.StyleByIndex(1, 3, map[string]string{"bold": "true"}, helper.TimeT(ctx), nil) assert.NoError(t, err) assert.Equal(t, `

    ab

    `+ `

    cd

    `, tree.ToXML()) @@ -381,20 +446,20 @@ func TestTreeEdit(t *testing.T) { pNode := crdt.NewTreeNode(helper.PosT(ctx), "p", nil) textNode := crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "ab") - _, err := tree.EditT(0, 0, []*crdt.TreeNode{pNode}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + err := tree.EditT(0, 0, []*crdt.TreeNode{pNode}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(1, 1, []*crdt.TreeNode{textNode}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + err = tree.EditT(1, 1, []*crdt.TreeNode{textNode}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    ab

    ", tree.ToXML()) // Find the closest index.TreePos when leftSiblingNode in crdt.TreePos is removed. // 0 1 2 //

    - _, err = tree.EditT(1, 3, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + err = tree.EditT(1, 3, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    ", tree.ToXML()) - treePos := crdt.NewTreePos(pNode.ID, textNode.ID) + treePos := crdt.NewTreePos(pNode.ID(), textNode.ID()) parent, leftSibling, err := tree.FindTreeNodesWithSplitText(treePos, helper.TimeT(ctx)) assert.NoError(t, err) @@ -405,17 +470,37 @@ func TestTreeEdit(t *testing.T) { // Find the closest index.TreePos when parentNode in crdt.TreePos is removed. // 0 // - _, err = tree.EditT(0, 2, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + err = tree.EditT(0, 2, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "", tree.ToXML()) - treePos = crdt.NewTreePos(pNode.ID, textNode.ID) + treePos = crdt.NewTreePos(pNode.ID(), textNode.ID()) parent, leftSibling, err = tree.FindTreeNodesWithSplitText(treePos, helper.TimeT(ctx)) assert.NoError(t, err) idx, err = tree.ToIndex(parent, leftSibling) assert.NoError(t, err) assert.Equal(t, 0, idx) }) + + t.Run("marshal test", func(t *testing.T) { + ctx := helper.TextChangeContext(helper.TestRoot()) + tree := crdt.NewTree(crdt.NewTreeNode(helper.PosT(ctx), "root", nil), helper.TimeT(ctx)) + err := tree.EditT(0, 0, []*crdt.TreeNode{ + crdt.NewTreeNode(helper.PosT(ctx), "p", nil), + }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + assert.NoError(t, err) + err = tree.EditT(1, 1, []*crdt.TreeNode{ + crdt.NewTreeNode(helper.PosT(ctx), "text", nil, `"Hello" \n i'm yorkie!`), + }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + assert.NoError(t, err) + + assert.Equal(t, `

    "Hello" \n i'm yorkie!

    `, tree.ToXML()) + assert.Equal( + t, + `{"type":"root","children":[{"type":"p","children":[{"type":"text","value":"\"Hello\" \\n i'm yorkie!"}]}]}`, + tree.Marshal(), + ) + }) } func TestTreeSplit(t *testing.T) { @@ -434,10 +519,10 @@ func TestTreeSplit(t *testing.T) { } tree := crdt.NewTree(crdt.NewTreeNode(helper.PosT(ctx), "r", nil), helper.TimeT(ctx)) - _, err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, + err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(1, 1, []*crdt.TreeNode{ + err = tree.EditT(1, 1, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "helloworld"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) @@ -446,17 +531,17 @@ func TestTreeSplit(t *testing.T) { assert.Equal(t, tree.ToTreeNodeForTest(), expectedInitial) // 01. Split left side of 'helloworld'. - _, err = tree.EditT(1, 1, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + err = tree.EditT(1, 1, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, tree.ToTreeNodeForTest(), expectedInitial) // 02. Split right side of 'helloworld'. - _, err = tree.EditT(11, 11, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + err = tree.EditT(11, 11, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, tree.ToTreeNodeForTest(), expectedInitial) // 03. Split 'helloworld' into 'hello' and 'world'. - _, err = tree.EditT(6, 6, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + err = tree.EditT(6, 6, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, tree.ToTreeNodeForTest(), crdt.TreeNodeForTest{ Type: "r", @@ -481,50 +566,50 @@ func TestTreeSplit(t *testing.T) { // 01. Split position 1. tree := crdt.NewTree(crdt.NewTreeNode(helper.PosT(ctx), "r", nil), helper.TimeT(ctx)) - _, err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, + err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(1, 1, []*crdt.TreeNode{ + err = tree.EditT(1, 1, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "ab"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    ab

    ", tree.ToXML()) assert.Equal(t, 4, tree.Root().Len()) - _, err = tree.EditT(1, 1, nil, 1, helper.TimeT(ctx), issueTimeTicket(ctx)) + err = tree.EditT(1, 1, nil, 1, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    ab

    ", tree.ToXML()) assert.Equal(t, 6, tree.Root().Len()) // 02. Split position 2. tree = crdt.NewTree(crdt.NewTreeNode(helper.PosT(ctx), "r", nil), helper.TimeT(ctx)) - _, err = tree.EditT(0, 0, []*crdt.TreeNode{ + err = tree.EditT(0, 0, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "p", nil), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(1, 1, []*crdt.TreeNode{ + err = tree.EditT(1, 1, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "ab"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    ab

    ", tree.ToXML()) assert.Equal(t, 4, tree.Root().Len()) - _, err = tree.EditT(2, 2, nil, 1, helper.TimeT(ctx), issueTimeTicket(ctx)) + err = tree.EditT(2, 2, nil, 1, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    a

    b

    ", tree.ToXML()) assert.Equal(t, 6, tree.Root().Len()) // 03. Split position 3. tree = crdt.NewTree(crdt.NewTreeNode(helper.PosT(ctx), "r", nil), helper.TimeT(ctx)) - _, err = tree.EditT(0, 0, []*crdt.TreeNode{ + err = tree.EditT(0, 0, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "p", nil), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(1, 1, []*crdt.TreeNode{ + err = tree.EditT(1, 1, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "ab"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    ab

    ", tree.ToXML()) assert.Equal(t, 4, tree.Root().Len()) - _, err = tree.EditT(3, 3, nil, 1, helper.TimeT(ctx), issueTimeTicket(ctx)) + err = tree.EditT(3, 3, nil, 1, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    ab

    ", tree.ToXML()) assert.Equal(t, 6, tree.Root().Len()) @@ -537,38 +622,38 @@ func TestTreeSplit(t *testing.T) { // 01. Split nodes level 1. tree := crdt.NewTree(crdt.NewTreeNode(helper.PosT(ctx), "r", nil), helper.TimeT(ctx)) - _, err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, + err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(1, 1, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "b", nil)}, 0, + err = tree.EditT(1, 1, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "b", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(2, 2, []*crdt.TreeNode{ + err = tree.EditT(2, 2, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "ab"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    ab

    ", tree.ToXML()) assert.Equal(t, 6, tree.Root().Len()) - _, err = tree.EditT(3, 3, nil, 1, helper.TimeT(ctx), issueTimeTicket(ctx)) + err = tree.EditT(3, 3, nil, 1, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    ab

    ", tree.ToXML()) assert.Equal(t, 8, tree.Root().Len()) // 02. Split nodes level 2. tree = crdt.NewTree(crdt.NewTreeNode(helper.PosT(ctx), "r", nil), helper.TimeT(ctx)) - _, err = tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, + err = tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(1, 1, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "b", nil)}, 0, + err = tree.EditT(1, 1, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "b", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(2, 2, []*crdt.TreeNode{ + err = tree.EditT(2, 2, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "ab"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    ab

    ", tree.ToXML()) assert.Equal(t, 6, tree.Root().Len()) - _, err = tree.EditT(3, 3, nil, 2, helper.TimeT(ctx), issueTimeTicket(ctx)) + err = tree.EditT(3, 3, nil, 2, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    a

    b

    ", tree.ToXML()) assert.Equal(t, 10, tree.Root().Len()) @@ -578,10 +663,10 @@ func TestTreeSplit(t *testing.T) { ctx := helper.TextChangeContext(helper.TestRoot()) tree := crdt.NewTree(crdt.NewTreeNode(helper.PosT(ctx), "r", nil), helper.TimeT(ctx)) - _, err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, + err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(1, 1, []*crdt.TreeNode{ + err = tree.EditT(1, 1, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "abcd"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) @@ -589,12 +674,12 @@ func TestTreeSplit(t *testing.T) { // 0 1 2 3 4 5 6 7 8 //

    a b

    c d

    - _, err = tree.EditT(3, 3, nil, 1, helper.TimeT(ctx), issueTimeTicket(ctx)) + err = tree.EditT(3, 3, nil, 1, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    ab

    cd

    ", tree.ToXML()) assert.Equal(t, 8, tree.Root().Len()) - _, err = tree.EditT(3, 5, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + err = tree.EditT(3, 5, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    abcd

    ", tree.ToXML()) assert.Equal(t, 6, tree.Root().Len()) @@ -605,47 +690,47 @@ func TestTreeMerge(t *testing.T) { t.Run("delete nodes in a multi-level range test", func(t *testing.T) { ctx := helper.TextChangeContext(helper.TestRoot()) tree := crdt.NewTree(crdt.NewTreeNode(helper.PosT(ctx), "root", nil), helper.TimeT(ctx)) - _, err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, + err := tree.EditT(0, 0, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(1, 1, []*crdt.TreeNode{ + err = tree.EditT(1, 1, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "ab"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(3, 3, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, + err = tree.EditT(3, 3, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(4, 4, []*crdt.TreeNode{ + err = tree.EditT(4, 4, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "x"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(7, 7, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, + err = tree.EditT(7, 7, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(8, 8, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, + err = tree.EditT(8, 8, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(9, 9, []*crdt.TreeNode{ + err = tree.EditT(9, 9, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "cd"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(13, 13, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, + err = tree.EditT(13, 13, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(14, 14, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, + err = tree.EditT(14, 14, []*crdt.TreeNode{crdt.NewTreeNode(helper.PosT(ctx), "p", nil)}, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(15, 15, []*crdt.TreeNode{ + err = tree.EditT(15, 15, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "y"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) - _, err = tree.EditT(17, 17, []*crdt.TreeNode{ + err = tree.EditT(17, 17, []*crdt.TreeNode{ crdt.NewTreeNode(helper.PosT(ctx), "text", nil, "ef"), }, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    ab

    x

    cd

    y

    ef

    ", tree.ToXML()) - _, err = tree.EditT(2, 18, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) + err = tree.EditT(2, 18, nil, 0, helper.TimeT(ctx), issueTimeTicket(ctx)) assert.NoError(t, err) assert.Equal(t, "

    af

    ", tree.ToXML()) }) diff --git a/pkg/document/document.go b/pkg/document/document.go index 347b25507..00b0e0411 100644 --- a/pkg/document/document.go +++ b/pkg/document/document.go @@ -65,6 +65,22 @@ type BroadcastRequest struct { Payload []byte } +// Option configures Options. +type Option func(*Options) + +// Options configures how we set up the document. +type Options struct { + // DisableGC disables garbage collection. + DisableGC bool +} + +// WithDisableGC configures the document to disable garbage collection. +func WithDisableGC() Option { + return func(o *Options) { + o.DisableGC = true + } +} + // Document represents a document accessible to the user. // // How document works: @@ -76,6 +92,9 @@ type Document struct { // doc is the original data of the actual document. doc *InternalDocument + // options is the options to configure the document. + options Options + // cloneRoot is a copy of `doc.root` to be exposed to the user and is used to // protect `doc.root`. cloneRoot *crdt.Root @@ -100,9 +119,15 @@ type Document struct { } // New creates a new instance of Document. -func New(key key.Key) *Document { +func New(key key.Key, opts ...Option) *Document { + var options Options + for _, opt := range opts { + opt(&options) + } + return &Document{ doc: NewInternalDocument(key), + options: options, events: make(chan DocEvent, 1), broadcastRequests: make(chan BroadcastRequest, 1), broadcastResponses: make(chan error, 1), @@ -164,24 +189,9 @@ func (d *Document) ApplyChangePack(pack *change.Pack) error { return err } } else { - if err := d.ensureClone(); err != nil { - return err - } - - for _, c := range pack.Changes { - if err := c.Execute(d.cloneRoot, d.clonePresences); err != nil { - return err - } - } - - events, err := d.doc.ApplyChanges(pack.Changes...) - if err != nil { + if err := d.applyChanges(pack.Changes); err != nil { return err } - - for _, e := range events { - d.events <- e - } } // 02. Remove local changes applied to server. @@ -193,11 +203,19 @@ func (d *Document) ApplyChangePack(pack *change.Pack) error { d.doc.localChanges = d.doc.localChanges[1:] } + if len(pack.Snapshot) > 0 { + if err := d.applyChanges(d.doc.localChanges); err != nil { + return err + } + } + // 03. Update the checkpoint. d.doc.checkpoint = d.doc.checkpoint.Forward(pack.Checkpoint) // 04. Do Garbage collection. - d.GarbageCollect(pack.MinSyncedTicket) + if !d.options.DisableGC { + d.GarbageCollect(pack.MinSyncedTicket) + } // 05. Update the status. if pack.IsRemoved { @@ -207,6 +225,28 @@ func (d *Document) ApplyChangePack(pack *change.Pack) error { return nil } +func (d *Document) applyChanges(changes []*change.Change) error { + if err := d.ensureClone(); err != nil { + return err + } + + for _, c := range changes { + if err := c.Execute(d.cloneRoot, d.clonePresences); err != nil { + return err + } + } + + events, err := d.doc.ApplyChanges(changes...) + if err != nil { + return err + } + + for _, e := range events { + d.events <- e + } + return nil +} + // InternalDocument returns the internal document. func (d *Document) InternalDocument() *InternalDocument { return d.doc diff --git a/pkg/document/document_test.go b/pkg/document/document_test.go index 1046efd53..3780b0f1e 100644 --- a/pkg/document/document_test.go +++ b/pkg/document/document_test.go @@ -23,12 +23,14 @@ import ( "github.com/stretchr/testify/assert" + "github.com/yorkie-team/yorkie/api/converter" "github.com/yorkie-team/yorkie/pkg/document" "github.com/yorkie-team/yorkie/pkg/document/change" "github.com/yorkie-team/yorkie/pkg/document/crdt" "github.com/yorkie-team/yorkie/pkg/document/json" "github.com/yorkie-team/yorkie/pkg/document/presence" "github.com/yorkie-team/yorkie/pkg/document/time" + "github.com/yorkie-team/yorkie/test/helper" ) var ( @@ -524,4 +526,59 @@ 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 { + 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 { + root.GetText("k1").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()) + }) + + t.Run("handle local changes correctly when receiving snapshot test", func(t *testing.T) { + // 01. Create a document and a counter. + doc := document.New("d1") + assert.NoError(t, doc.Update(func(root *json.Object, p *presence.Presence) error { + root.SetNewCounter("c", crdt.IntegerCnt, 0) + return nil + })) + + // 02. Increase the counter until the snapshot threshold and create a snapshot. + for i := 0; i < int(helper.SnapshotThreshold); i++ { + assert.NoError(t, doc.Update(func(root *json.Object, p *presence.Presence) error { + root.GetCounter("c").Increase(1) + return nil + })) + } + snapshot, _ := converter.SnapshotToBytes(doc.RootObject(), doc.AllPresences()) + pack := change.NewPack(doc.Key(), doc.CreateChangePack().Checkpoint, nil, snapshot) + + // 03. Make a local change before applying changePack. + assert.NoError(t, doc.Update(func(root *json.Object, p *presence.Presence) error { + root.GetCounter("c").Increase(1) + return nil + })) + expectedCount := doc.Root().GetCounter("c").Value() + + // 04. Apply the changePack and check if the counter value is correct. + assert.NoError(t, doc.ApplyChangePack(pack)) + assert.Equal(t, doc.Root().GetCounter("c").Value(), expectedCount) + }) } diff --git a/pkg/document/gc_test.go b/pkg/document/gc_test.go new file mode 100644 index 000000000..df63796c6 --- /dev/null +++ b/pkg/document/gc_test.go @@ -0,0 +1,222 @@ +/* + * Copyright 2020 The Yorkie Authors. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package document_test + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/yorkie-team/yorkie/pkg/document" + "github.com/yorkie-team/yorkie/pkg/document/json" + "github.com/yorkie-team/yorkie/pkg/document/presence" + "github.com/yorkie-team/yorkie/pkg/document/time" +) + +func TestTreeGC(t *testing.T) { + type opCode int + const ( + NoOp opCode = iota + Style + RemoveStyle + DeleteNode + GC + ) + + type operation struct { + code opCode + key string + val string + } + + type step struct { + op operation + garbageLen int + expectXML string + } + + tests := []struct { + desc string + steps []step + }{ + { + desc: "style-style test", + steps: []step{ + {operation{Style, "b", "t"}, 0, `

    `}, + {operation{Style, "b", "f"}, 0, `

    `}, + }, + }, + { + desc: "style-remove test", + steps: []step{ + {operation{Style, "b", "t"}, 0, `

    `}, + {operation{RemoveStyle, "b", ""}, 1, `

    `}, + }, + }, + { + desc: "remove-style test", + steps: []step{ + {operation{RemoveStyle, "b", ""}, 1, `

    `}, + {operation{Style, "b", "t"}, 0, `

    `}, + }, + }, + { + desc: "remove-remove test", + steps: []step{ + {operation{RemoveStyle, "b", ""}, 1, `

    `}, + {operation{RemoveStyle, "b", ""}, 1, `

    `}, + }, + }, + { + desc: "style-delete test", + steps: []step{ + {operation{Style, "b", "t"}, 0, `

    `}, + {operation{DeleteNode, "", ""}, 1, ``}, + }, + }, + { + desc: "remove-delete test", + steps: []step{ + {operation{RemoveStyle, "b", ""}, 1, `

    `}, + {operation{DeleteNode, "b", "t"}, 2, ``}, + }, + }, + { + desc: "remove-gc-delete test", + steps: []step{ + {operation{RemoveStyle, "b", ""}, 1, `

    `}, + {operation{GC, "", ""}, 0, `

    `}, + {operation{DeleteNode, "b", "t"}, 1, ``}, + }, + }, + } + + for i, tc := range tests { + t.Run(fmt.Sprintf("%d. %s", i+1, tc.desc), func(t *testing.T) { + // 01. Initial:

    + doc := document.New("doc") + err := doc.Update(func(root *json.Object, p *presence.Presence) error { + root.SetNewTree("t", &json.TreeNode{ + Type: "r", + Children: []json.TreeNode{{Type: "p"}}, + }) + return nil + }) + assert.NoError(t, err) + assert.Equal(t, "

    ", doc.Root().GetTree("t").ToXML()) + assert.Equal(t, 0, doc.GarbageLen()) + + // 02. Run test steps + for _, s := range tc.steps { + assert.NoError(t, doc.Update(func(root *json.Object, p *presence.Presence) error { + if s.op.code == RemoveStyle { + root.GetTree("t").RemoveStyle(0, 1, []string{s.op.key}) + } else if s.op.code == Style { + root.GetTree("t").Style(0, 1, map[string]string{s.op.key: s.op.val}) + } else if s.op.code == DeleteNode { + root.GetTree("t").Edit(0, 2, nil, 0) + } else if s.op.code == GC { + doc.GarbageCollect(time.MaxTicket) + } + return nil + })) + assert.Equal(t, s.expectXML, doc.Root().GetTree("t").ToXML()) + assert.Equal(t, s.garbageLen, doc.GarbageLen()) + } + + // 03. Garbage collect + doc.GarbageCollect(time.MaxTicket) + assert.Equal(t, 0, doc.GarbageLen()) + }) + } +} + +func TestTextGC(t *testing.T) { + type opCode int + const ( + NoOp opCode = iota + Style + DeleteNode + GC + ) + + type operation struct { + code opCode + key string + val string + } + + type step struct { + op operation + garbageLen int + expectXML string + } + + tests := []struct { + desc string + steps []step + }{ + { + desc: "style-style test", + steps: []step{ + {operation{Style, "b", "t"}, 0, `[{"attrs":{"b":"t"},"val":"AB"}]`}, + {operation{Style, "b", "f"}, 0, `[{"attrs":{"b":"f"},"val":"AB"}]`}, + }, + }, + { + desc: "style-delete test", + steps: []step{ + {operation{Style, "b", "t"}, 0, `[{"attrs":{"b":"t"},"val":"AB"}]`}, + {operation{DeleteNode, "", ""}, 1, `[]`}, + }, + }, + } + + for i, tc := range tests { + t.Run(fmt.Sprintf("%d. %s", i+1, tc.desc), func(t *testing.T) { + doc := document.New("doc") + err := doc.Update(func(root *json.Object, p *presence.Presence) error { + root.SetNewText("t").Edit(0, 0, "AB") + return nil + }) + assert.NoError(t, err) + assert.Equal(t, `[{"val":"AB"}]`, doc.Root().GetText("t").Marshal()) + assert.Equal(t, 0, doc.GarbageLen()) + + // 02. Run test steps + for _, s := range tc.steps { + assert.NoError(t, doc.Update(func(root *json.Object, p *presence.Presence) error { + if s.op.code == Style { + root.GetText("t").Style(0, 2, map[string]string{s.op.key: s.op.val}) + } else if s.op.code == DeleteNode { + root.GetText("t").Edit(0, 2, "") + } else if s.op.code == GC { + doc.GarbageCollect(time.MaxTicket) + } + return nil + })) + assert.Equal(t, s.expectXML, doc.Root().GetText("t").Marshal()) + assert.Equal(t, s.garbageLen, doc.GarbageLen()) + } + + // 03. Garbage collect + doc.GarbageCollect(time.MaxTicket) + assert.Equal(t, 0, doc.GarbageLen()) + }) + } +} diff --git a/pkg/document/internal_document.go b/pkg/document/internal_document.go index 4f1cdd1ad..40697b809 100644 --- a/pkg/document/internal_document.go +++ b/pkg/document/internal_document.go @@ -142,7 +142,7 @@ func (d *InternalDocument) HasLocalChanges() bool { } // ApplyChangePack applies the given change pack into this document. -func (d *InternalDocument) ApplyChangePack(pack *change.Pack) error { +func (d *InternalDocument) ApplyChangePack(pack *change.Pack, disableGC bool) error { // 01. Apply remote changes to both the cloneRoot and the document. if len(pack.Snapshot) > 0 { if err := d.applySnapshot(pack.Snapshot, pack.Checkpoint.ServerSeq); err != nil { @@ -166,7 +166,7 @@ func (d *InternalDocument) ApplyChangePack(pack *change.Pack) error { // 03. Update the checkpoint. d.checkpoint = d.checkpoint.Forward(pack.Checkpoint) - if pack.MinSyncedTicket != nil { + if !disableGC && pack.MinSyncedTicket != nil { if _, err := d.GarbageCollect(pack.MinSyncedTicket); err != nil { return err } diff --git a/pkg/document/json/text.go b/pkg/document/json/text.go index 29cf0e9fa..2420275ea 100644 --- a/pkg/document/json/text.go +++ b/pkg/document/json/text.go @@ -51,7 +51,12 @@ func (p *Text) CreateRange(from, to int) (*crdt.RGATreeSplitNodePos, *crdt.RGATr } // Edit edits the given range with the given content and attributes. -func (p *Text) Edit(from, to int, content string, attributes ...map[string]string) *Text { +func (p *Text) Edit( + from, + to int, + content string, + attributes ...map[string]string, +) *Text { if from > to { panic("from should be less than or equal to to") } @@ -68,7 +73,7 @@ func (p *Text) Edit(from, to int, content string, attributes ...map[string]strin } ticket := p.context.IssueTimeTicket() - _, maxCreationMapByActor, err := p.Text.Edit( + _, maxCreationMapByActor, pairs, err := p.Text.Edit( fromPos, toPos, nil, @@ -80,6 +85,10 @@ func (p *Text) Edit(from, to int, content string, attributes ...map[string]strin panic(err) } + for _, pair := range pairs { + p.context.RegisterGCPair(pair) + } + p.context.Push(operations.NewEdit( p.CreatedAt(), fromPos, @@ -89,9 +98,6 @@ func (p *Text) Edit(from, to int, content string, attributes ...map[string]strin attrs, ticket, )) - if !fromPos.Equal(toPos) { - p.context.RegisterElementHasRemovedNodes(p) - } return p } @@ -107,7 +113,7 @@ func (p *Text) Style(from, to int, attributes map[string]string) *Text { } ticket := p.context.IssueTimeTicket() - maxCreationMapByActor, err := p.Text.Style( + maxCreationMapByActor, pairs, err := p.Text.Style( fromPos, toPos, nil, @@ -118,6 +124,10 @@ func (p *Text) Style(from, to int, attributes map[string]string) *Text { panic(err) } + for _, pair := range pairs { + p.context.RegisterGCPair(pair) + } + p.context.Push(operations.NewStyle( p.CreatedAt(), fromPos, diff --git a/pkg/document/json/tree.go b/pkg/document/json/tree.go index 2b118acd4..faae3f807 100644 --- a/pkg/document/json/tree.go +++ b/pkg/document/json/tree.go @@ -221,14 +221,20 @@ func (t *Tree) Style(fromIdx, toIdx int, attributes map[string]string) bool { } ticket := t.context.IssueTimeTicket() - if err := t.Tree.Style(fromPos, toPos, attributes, ticket); err != nil { + maxCreationMapByActor, pairs, err := t.Tree.Style(fromPos, toPos, attributes, ticket, nil) + if err != nil { panic(err) } + for _, pair := range pairs { + t.context.RegisterGCPair(pair) + } + t.context.Push(operations.NewTreeStyle( t.CreatedAt(), fromPos, toPos, + maxCreationMapByActor, attributes, ticket, )) @@ -256,14 +262,20 @@ func (t *Tree) RemoveStyle(fromIdx, toIdx int, attributesToRemove []string) bool } ticket := t.context.IssueTimeTicket() - if err := t.Tree.RemoveStyle(fromPos, toPos, attributesToRemove, ticket); err != nil { + maxCreationMapByActor, pairs, err := t.Tree.RemoveStyle(fromPos, toPos, attributesToRemove, ticket, nil) + if err != nil { panic(err) } + for _, pair := range pairs { + t.context.RegisterGCPair(pair) + } + t.context.Push(operations.NewTreeStyleRemove( t.CreatedAt(), fromPos, toPos, + maxCreationMapByActor, attributesToRemove, ticket, )) @@ -334,7 +346,7 @@ func (t *Tree) edit(fromPos, toPos *crdt.TreePos, contents []*TreeNode, splitLev } ticket = t.context.LastTimeTicket() - maxCreationMapByActor, err := t.Tree.Edit( + maxCreationMapByActor, pairs, err := t.Tree.Edit( fromPos, toPos, clones, @@ -347,6 +359,10 @@ func (t *Tree) edit(fromPos, toPos *crdt.TreePos, contents []*TreeNode, splitLev panic(err) } + for _, pair := range pairs { + t.context.RegisterGCPair(pair) + } + t.context.Push(operations.NewTreeEdit( t.CreatedAt(), fromPos, @@ -357,10 +373,6 @@ func (t *Tree) edit(fromPos, toPos *crdt.TreePos, contents []*TreeNode, splitLev ticket, )) - if !fromPos.Equals(toPos) { - t.context.RegisterElementHasRemovedNodes(t.Tree) - } - return true } diff --git a/pkg/document/operations/edit.go b/pkg/document/operations/edit.go index adafeec43..3f8f830f1 100644 --- a/pkg/document/operations/edit.go +++ b/pkg/document/operations/edit.go @@ -34,9 +34,9 @@ type Edit struct { // to represents the end point of the editing range. to *crdt.RGATreeSplitNodePos - // latestCreatedAtMapByActor is a map that stores the latest creation time + // maxCreatedAtMapByActor is a map that stores the latest creation time // by actor for the nodes included in the editing range. - latestCreatedAtMapByActor map[string]*time.Ticket + maxCreatedAtMapByActor map[string]*time.Ticket // content is the content of text added when editing. content string @@ -53,19 +53,19 @@ func NewEdit( parentCreatedAt *time.Ticket, from *crdt.RGATreeSplitNodePos, to *crdt.RGATreeSplitNodePos, - latestCreatedAtMapByActor map[string]*time.Ticket, + maxCreatedAtMapByActor map[string]*time.Ticket, content string, attributes map[string]string, executedAt *time.Ticket, ) *Edit { return &Edit{ - parentCreatedAt: parentCreatedAt, - from: from, - to: to, - latestCreatedAtMapByActor: latestCreatedAtMapByActor, - content: content, - attributes: attributes, - executedAt: executedAt, + parentCreatedAt: parentCreatedAt, + from: from, + to: to, + maxCreatedAtMapByActor: maxCreatedAtMapByActor, + content: content, + attributes: attributes, + executedAt: executedAt, } } @@ -75,12 +75,13 @@ func (e *Edit) Execute(root *crdt.Root) error { switch obj := parent.(type) { case *crdt.Text: - _, _, err := obj.Edit(e.from, e.to, e.latestCreatedAtMapByActor, e.content, e.attributes, e.executedAt) + _, _, pairs, err := obj.Edit(e.from, e.to, e.maxCreatedAtMapByActor, e.content, e.attributes, e.executedAt) if err != nil { return err } - if !e.from.Equal(e.to) { - root.RegisterElementHasRemovedNodes(obj) + + for _, pair := range pairs { + root.RegisterGCPair(pair) } default: return ErrNotApplicableDataType @@ -124,8 +125,8 @@ func (e *Edit) Attributes() map[string]string { return e.attributes } -// CreatedAtMapByActor returns the map that stores the latest creation time +// MaxCreatedAtMapByActor returns the map that stores the latest creation time // by actor for the nodes included in the editing range. -func (e *Edit) CreatedAtMapByActor() map[string]*time.Ticket { - return e.latestCreatedAtMapByActor +func (e *Edit) MaxCreatedAtMapByActor() map[string]*time.Ticket { + return e.maxCreatedAtMapByActor } diff --git a/pkg/document/operations/style.go b/pkg/document/operations/style.go index 5394bc9de..14e9564c8 100644 --- a/pkg/document/operations/style.go +++ b/pkg/document/operations/style.go @@ -32,9 +32,9 @@ type Style struct { // to is the end point of the range to apply the style to. to *crdt.RGATreeSplitNodePos - // latestCreatedAtMapByActor is a map that stores the latest creation time + // maxCreatedAtMapByActor is a map that stores the latest creation time // by actor for the nodes included in the range to apply the style to. - latestCreatedAtMapByActor map[string]*time.Ticket + maxCreatedAtMapByActor map[string]*time.Ticket // attributes represents the text style. attributes map[string]string @@ -48,17 +48,17 @@ func NewStyle( parentCreatedAt *time.Ticket, from *crdt.RGATreeSplitNodePos, to *crdt.RGATreeSplitNodePos, - latestCreatedAtMapByActor map[string]*time.Ticket, + maxCreatedAtMapByActor map[string]*time.Ticket, attributes map[string]string, executedAt *time.Ticket, ) *Style { return &Style{ - parentCreatedAt: parentCreatedAt, - from: from, - to: to, - latestCreatedAtMapByActor: latestCreatedAtMapByActor, - attributes: attributes, - executedAt: executedAt, + parentCreatedAt: parentCreatedAt, + from: from, + to: to, + maxCreatedAtMapByActor: maxCreatedAtMapByActor, + attributes: attributes, + executedAt: executedAt, } } @@ -70,8 +70,16 @@ func (e *Style) Execute(root *crdt.Root) error { return ErrNotApplicableDataType } - _, err := obj.Style(e.from, e.to, e.latestCreatedAtMapByActor, e.attributes, e.executedAt) - return err + _, pairs, err := obj.Style(e.from, e.to, e.maxCreatedAtMapByActor, e.attributes, e.executedAt) + if err != nil { + return err + } + + for _, pair := range pairs { + root.RegisterGCPair(pair) + } + + return nil } // From returns the start point of the editing range. @@ -104,8 +112,8 @@ func (e *Style) Attributes() map[string]string { return e.attributes } -// CreatedAtMapByActor returns the map that stores the latest creation time +// MaxCreatedAtMapByActor returns the map that stores the latest creation time // by actor for the nodes included in the range to apply the style to. -func (e *Style) CreatedAtMapByActor() map[string]*time.Ticket { - return e.latestCreatedAtMapByActor +func (e *Style) MaxCreatedAtMapByActor() map[string]*time.Ticket { + return e.maxCreatedAtMapByActor } diff --git a/pkg/document/operations/tree_edit.go b/pkg/document/operations/tree_edit.go index 9ca1b6cdf..c81b016cf 100644 --- a/pkg/document/operations/tree_edit.go +++ b/pkg/document/operations/tree_edit.go @@ -39,9 +39,9 @@ type TreeEdit struct { // splitLevel is the level of the split. splitLevel int - // latestCreatedAtMapByActor is a map that stores the latest creation time + // maxCreatedAtMapByActor is a map that stores the latest creation time // by actor for the nodes included in the editing range. - latestCreatedAtMapByActor map[string]*time.Ticket + maxCreatedAtMapByActor map[string]*time.Ticket // executedAt is the time the operation was executed. executedAt *time.Ticket @@ -54,17 +54,17 @@ func NewTreeEdit( to *crdt.TreePos, contents []*crdt.TreeNode, splitLevel int, - latestCreatedAtMapByActor map[string]*time.Ticket, + maxCreatedAtMapByActor map[string]*time.Ticket, executedAt *time.Ticket, ) *TreeEdit { return &TreeEdit{ - parentCreatedAt: parentCreatedAt, - from: from, - to: to, - contents: contents, - splitLevel: splitLevel, - latestCreatedAtMapByActor: latestCreatedAtMapByActor, - executedAt: executedAt, + parentCreatedAt: parentCreatedAt, + from: from, + to: to, + contents: contents, + splitLevel: splitLevel, + maxCreatedAtMapByActor: maxCreatedAtMapByActor, + executedAt: executedAt, } } @@ -89,7 +89,7 @@ func (e *TreeEdit) Execute(root *crdt.Root) error { } } - if _, err = obj.Edit( + _, pairs, err := obj.Edit( e.from, e.to, contents, @@ -105,7 +105,7 @@ func (e *TreeEdit) Execute(root *crdt.Root) error { func() func() *time.Ticket { delimiter := e.executedAt.Delimiter() if contents != nil { - delimiter += uint32((len(contents))) + delimiter += uint32(len(contents)) } return func() *time.Ticket { delimiter++ @@ -116,14 +116,17 @@ func (e *TreeEdit) Execute(root *crdt.Root) error { ) } }(), - e.latestCreatedAtMapByActor, - ); err != nil { + e.maxCreatedAtMapByActor, + ) + if err != nil { return err } - if !e.from.Equals(e.to) { - root.RegisterElementHasRemovedNodes(obj) + for _, pair := range pairs { + root.RegisterGCPair(pair) + } + default: return ErrNotApplicableDataType } @@ -161,10 +164,10 @@ func (e *TreeEdit) SplitLevel() int { return e.splitLevel } -// CreatedAtMapByActor returns the map that stores the latest creation time +// MaxCreatedAtMapByActor returns the map that stores the latest creation time // by actor for the nodes included in the editing range. -func (e *TreeEdit) CreatedAtMapByActor() map[string]*time.Ticket { - return e.latestCreatedAtMapByActor +func (e *TreeEdit) MaxCreatedAtMapByActor() map[string]*time.Ticket { + return e.maxCreatedAtMapByActor } // ExecutedAt returns execution time of this operation. diff --git a/pkg/document/operations/tree_style.go b/pkg/document/operations/tree_style.go index dce711c04..d642b2171 100644 --- a/pkg/document/operations/tree_style.go +++ b/pkg/document/operations/tree_style.go @@ -32,6 +32,10 @@ type TreeStyle struct { // toPos represents the end point of the editing range. to *crdt.TreePos + // maxCreatedAtMapByActor is a map that stores the latest creation time + // by actor for the nodes included in the styling range. + maxCreatedAtMapByActor map[string]*time.Ticket + // attributes represents the tree style to be added. attributes map[string]string @@ -47,16 +51,18 @@ func NewTreeStyle( parentCreatedAt *time.Ticket, from *crdt.TreePos, to *crdt.TreePos, + maxCreatedAtMapByActor map[string]*time.Ticket, attributes map[string]string, executedAt *time.Ticket, ) *TreeStyle { return &TreeStyle{ - parentCreatedAt: parentCreatedAt, - from: from, - to: to, - attributes: attributes, - attributesToRemove: []string{}, - executedAt: executedAt, + parentCreatedAt: parentCreatedAt, + from: from, + to: to, + maxCreatedAtMapByActor: maxCreatedAtMapByActor, + attributes: attributes, + attributesToRemove: []string{}, + executedAt: executedAt, } } @@ -65,16 +71,18 @@ func NewTreeStyleRemove( parentCreatedAt *time.Ticket, from *crdt.TreePos, to *crdt.TreePos, + maxCreatedAtMapByActor map[string]*time.Ticket, attributesToRemove []string, executedAt *time.Ticket, ) *TreeStyle { return &TreeStyle{ - parentCreatedAt: parentCreatedAt, - from: from, - to: to, - attributes: map[string]string{}, - attributesToRemove: attributesToRemove, - executedAt: executedAt, + parentCreatedAt: parentCreatedAt, + from: from, + to: to, + maxCreatedAtMapByActor: maxCreatedAtMapByActor, + attributes: map[string]string{}, + attributesToRemove: attributesToRemove, + executedAt: executedAt, } } @@ -86,11 +94,25 @@ func (e *TreeStyle) Execute(root *crdt.Root) error { return ErrNotApplicableDataType } + var pairs []crdt.GCPair + var err error if len(e.attributes) > 0 { - return obj.Style(e.from, e.to, e.attributes, e.executedAt) + _, pairs, err = obj.Style(e.from, e.to, e.attributes, e.executedAt, e.maxCreatedAtMapByActor) + if err != nil { + return err + } + } else { + _, pairs, err = obj.RemoveStyle(e.from, e.to, e.attributesToRemove, e.executedAt, e.maxCreatedAtMapByActor) + if err != nil { + return err + } + } + + for _, pair := range pairs { + root.RegisterGCPair(pair) } - return obj.RemoveStyle(e.from, e.to, e.attributesToRemove, e.executedAt) + return nil } // FromPos returns the start point of the editing range. @@ -127,3 +149,9 @@ func (e *TreeStyle) Attributes() map[string]string { func (e *TreeStyle) AttributesToRemove() []string { return e.attributesToRemove } + +// MaxCreatedAtMapByActor returns the map that stores the latest creation time +// by actor for the nodes included in the styling range. +func (e *TreeStyle) MaxCreatedAtMapByActor() map[string]*time.Ticket { + return e.maxCreatedAtMapByActor +} diff --git a/pkg/index/tree.go b/pkg/index/tree.go index 703c7493c..0d68707f5 100644 --- a/pkg/index/tree.go +++ b/pkg/index/tree.go @@ -311,23 +311,8 @@ func (n *Node[V]) Children(includeRemovedNode ...bool) []*Node[V] { } // SetChildren sets the children of the given node. -func (n *Node[V]) SetChildren(children []*Node[V]) error { - if n.IsText() { - return ErrInvalidMethodCallForTextNode - } - - n.children = children - for _, child := range children { - child.Parent = n - child.UpdateAncestorsSize() - } - - return nil -} - -// SetChildrenInternal sets the children of the given node. // This method does not update the size of the ancestors. -func (n *Node[V]) SetChildrenInternal(children []*Node[V]) error { +func (n *Node[V]) SetChildren(children []*Node[V]) error { if n.IsText() { return ErrInvalidMethodCallForTextNode } @@ -340,7 +325,8 @@ func (n *Node[V]) SetChildrenInternal(children []*Node[V]) error { return nil } -// UpdateAncestorsSize updates the size of ancestors. +// UpdateAncestorsSize updates the size of ancestors. It is used when +// the size of the node is changed. func (n *Node[V]) UpdateAncestorsSize() { parent := n.Parent sign := 1 @@ -350,11 +336,32 @@ func (n *Node[V]) UpdateAncestorsSize() { for parent != nil { parent.Length += n.PaddedLength() * sign + if parent.Value.IsRemoved() { + break + } parent = parent.Parent } } +// UpdateDescendantsSize updates the size of descendants. It is used when +// the tree is newly created and the size of the descendants is not calculated. +func (n *Node[V]) UpdateDescendantsSize() int { + size := 0 + for _, child := range n.Children(true) { + childSize := child.UpdateDescendantsSize() + if child.Value.IsRemoved() { + continue + } + + size += childSize + } + + n.Length += size + + return n.PaddedLength() +} + // PaddedLength returns the length of the node with padding. func (n *Node[V]) PaddedLength() int { length := n.Length @@ -511,7 +518,8 @@ func (n *Node[V]) insertAtInternal(newNode *Node[V], offset int) error { return nil } -// Prepend prepends the given nodes to the children. +// Prepend prepends the given nodes to the children. It is only used +// for creating a new node from shapshot. func (n *Node[V]) Prepend(children ...*Node[V]) error { if n.IsText() { return ErrInvalidMethodCallForTextNode @@ -520,10 +528,6 @@ func (n *Node[V]) Prepend(children ...*Node[V]) error { n.children = append(children, n.children...) for _, node := range children { node.Parent = n - - if !node.Value.IsRemoved() { - node.UpdateAncestorsSize() - } } return nil @@ -593,15 +597,20 @@ func (n *Node[V]) InsertAfter(newNode, referenceNode *Node[V]) error { return nil } -// HasTextChild returns true if the node has a text child. +// HasTextChild returns true if the node's children consist of only text children. func (n *Node[V]) HasTextChild() bool { - for _, child := range n.Children() { - if child.IsText() { - return true + children := n.Children() + if len(children) == 0 { + return false + } + + for _, child := range children { + if !child.IsText() { + return false } } - return false + return true } // OffsetOfChild returns offset of children of the given node. @@ -728,6 +737,15 @@ func (t *Tree[V]) TreePosToPath(treePos *TreePos[V]) ([]int, error) { node = node.Parent path = append(path, leftSiblingsSize+treePos.Offset) + } else if node.HasTextChild() { + // TODO(hackerwins): The function does not consider the situation + // where Element and Text nodes are mixed in the Element's Children. + leftSiblingsSize, err := t.LeftSiblingsSize(node, treePos.Offset) + if err != nil { + return nil, err + } + + path = append(path, leftSiblingsSize) } else { path = append(path, treePos.Offset) } diff --git a/pkg/llrb/llrb.go b/pkg/llrb/llrb.go index 316effac0..8057a4849 100644 --- a/pkg/llrb/llrb.go +++ b/pkg/llrb/llrb.go @@ -136,6 +136,11 @@ func (t *Tree[K, V]) Floor(key K) (K, V) { return zeroK, zeroV } +// Len returns the length of the tree. +func (t *Tree[K, V]) Len() int { + return t.size +} + func (t *Tree[K, V]) put(node *Node[K, V], key K, value V) *Node[K, V] { if node == nil { t.size++ diff --git a/server/backend/backend.go b/server/backend/backend.go index 55eeac5e9..a11e630c2 100644 --- a/server/backend/backend.go +++ b/server/backend/backend.go @@ -43,16 +43,15 @@ import ( // Backend manages Yorkie's backend such as Database and Coordinator. And it // has the server status such as the information of this Server. type Backend struct { - Config *Config - serverInfo *sync.ServerInfo + Config *Config + serverInfo *sync.ServerInfo + AuthWebhookCache *cache.LRUExpireCache[string, *types.AuthWebhookResponse] + Metrics *prometheus.Metrics DB database.Database Coordinator sync.Coordinator - Metrics *prometheus.Metrics Background *background.Background Housekeeping *housekeeping.Housekeeping - - AuthWebhookCache *cache.LRUExpireCache[string, *types.AuthWebhookResponse] } // New creates a new instance of Backend. @@ -62,6 +61,8 @@ func New( housekeepingConf *housekeeping.Config, metrics *prometheus.Metrics, ) (*Backend, error) { + // 01. Build the server info with the given hostname or the hostname of the + // current machine. hostname := conf.Hostname if hostname == "" { hostname, err := os.Hostname() @@ -77,10 +78,21 @@ func New( UpdatedAt: time.Now(), } + // 02. Create the auth webhook cache. The auth webhook cache is used to + // cache the response of the auth webhook. + // TODO(hackerwins): Consider to extend the cache for general purpose. + webhookCache, err := cache.NewLRUExpireCache[string, *types.AuthWebhookResponse](conf.AuthWebhookCacheSize) + if err != nil { + return nil, err + } + + // 03. Create the background instance. The background instance is used to + // manage background tasks. bg := background.New() + // 04. Create the database instance. If the MongoDB configuration is given, + // create a MongoDB instance. Otherwise, create a memory database instance. var db database.Database - var err error if mongoConf != nil { db, err = mongo.Dial(mongoConf) if err != nil { @@ -93,23 +105,32 @@ func New( } } + // 05. Create the coordinator instance. The coordinator is used to manage + // the synchronization between the Yorkie servers. // TODO(hackerwins): Implement the coordinator for a shard. For now, we // distribute workloads to all shards per document. In the future, we // will need to distribute workloads of a document. coordinator := memsync.NewCoordinator(serverInfo) - authWebhookCache, err := cache.NewLRUExpireCache[string, *types.AuthWebhookResponse](conf.AuthWebhookCacheSize) + // 06. Create the housekeeping instance. The housekeeping is used + // to manage keeping tasks such as deactivating inactive clients. + keeping, err := housekeeping.New(housekeepingConf) if err != nil { return nil, err } - keeping, err := housekeeping.Start( - housekeepingConf, - db, - coordinator, - ) - if err != nil { - return nil, err + // 07. Ensure the default user and project. If the default user and project + // do not exist, create them. + if conf.UseDefaultProject { + _, _, err = db.EnsureDefaultUserAndProject( + context.Background(), + conf.AdminUser, + conf.AdminPassword, + conf.ClientDeactivateThreshold, + ) + if err != nil { + return nil, err + } } dbInfo := "memory" @@ -118,43 +139,42 @@ func New( } logging.DefaultLogger().Infof( - "backend created: id: %s, rpc: %s", + "backend created: id: %s, db: %s", serverInfo.ID, dbInfo, ) - _, _, err = db.EnsureDefaultUserAndProject( - context.Background(), - conf.AdminUser, - conf.AdminPassword, - conf.ClientDeactivateThreshold, - ) - if err != nil { - return nil, err - } - return &Backend{ - Config: conf, - serverInfo: serverInfo, + Config: conf, + serverInfo: serverInfo, + AuthWebhookCache: webhookCache, - Background: bg, Metrics: metrics, DB: db, Coordinator: coordinator, + Background: bg, Housekeeping: keeping, - - AuthWebhookCache: authWebhookCache, }, nil } +// Start starts the backend. +func (b *Backend) Start() error { + if err := b.Housekeeping.Start(); err != nil { + return err + } + + logging.DefaultLogger().Infof("backend started: id: %s", b.serverInfo.ID) + return nil +} + // Shutdown closes all resources of this instance. func (b *Backend) Shutdown() error { - b.Background.Close() - if err := b.Housekeeping.Stop(); err != nil { return err } + b.Background.Close() + if err := b.Coordinator.Close(); err != nil { logging.DefaultLogger().Error(err) } diff --git a/server/backend/config.go b/server/backend/config.go index 1201b4faf..38d87b2d3 100644 --- a/server/backend/config.go +++ b/server/backend/config.go @@ -55,6 +55,9 @@ type Config struct { // SnapshotWithPurgingChanges is whether to delete previous changes when the snapshot is created. SnapshotWithPurgingChanges bool `yaml:"SnapshotWithPurgingChages"` + // SnapshotDisableGC is whether to disable garbage collection of snapshots. + SnapshotDisableGC bool + // AuthWebhookMaxRetries is the max count that retries the authorization webhook. AuthWebhookMaxRetries uint64 `yaml:"AuthWebhookMaxRetries"` diff --git a/server/backend/database/client_info.go b/server/backend/database/client_info.go index 0c9e4f3e8..f61c81769 100644 --- a/server/backend/database/client_info.go +++ b/server/backend/database/client_info.go @@ -31,6 +31,8 @@ var ( ErrDocumentNotAttached = errors.New("document not attached") ErrDocumentNeverAttached = errors.New("client has never attached the document") ErrDocumentAlreadyAttached = errors.New("document already attached") + ErrDocumentAlreadyDetached = errors.New("document already detached") + ErrAttachedDocumentExists = errors.New("attached document exits when deactivated") ) // Below are statuses of the client. @@ -104,7 +106,7 @@ func (i *ClientInfo) Deactivate() { } // AttachDocument attaches the given document to this client. -func (i *ClientInfo) AttachDocument(docID types.ID) error { +func (i *ClientInfo) AttachDocument(docID types.ID, alreadyAttached bool) error { if i.Status != ClientActivated { return fmt.Errorf("client(%s) attaches %s: %w", i.ID, docID, ErrClientNotActivated) @@ -114,6 +116,11 @@ func (i *ClientInfo) AttachDocument(docID types.ID) error { i.Documents = make(map[types.ID]*ClientDocInfo) } + if alreadyAttached && i.hasDocument(docID) && i.Documents[docID].Status == DocumentDetached { + return fmt.Errorf("client(%s) attaches %s: %w", + i.ID, docID, ErrDocumentAlreadyDetached) + } + if i.hasDocument(docID) && i.Documents[docID].Status == DocumentAttached { return fmt.Errorf("client(%s) attaches %s: %w", i.ID, docID, ErrDocumentAlreadyAttached) @@ -193,6 +200,15 @@ func (i *ClientInfo) UpdateCheckpoint( return nil } +// EnsureActivated ensures the client is activated. +func (i *ClientInfo) EnsureActivated() error { + if i.Status != ClientActivated { + return fmt.Errorf("ensure activated client(%s): %w", i.ID, ErrClientNotActivated) + } + + return nil +} + // EnsureDocumentAttached ensures the given document is attached. func (i *ClientInfo) EnsureDocumentAttached(docID types.ID) error { if i.Status != ClientActivated { @@ -208,6 +224,27 @@ func (i *ClientInfo) EnsureDocumentAttached(docID types.ID) error { return nil } +// EnsureDocumentsNotAttachedWhenDeactivated ensures that no documents are attached +// when the client is deactivated. +func (i *ClientInfo) EnsureDocumentsNotAttachedWhenDeactivated() error { + if i.Status != ClientDeactivated { + return nil + } + + for docID := range i.Documents { + isAttached, err := i.IsAttached(docID) + if err != nil { + return err + } + + if isAttached { + return ErrAttachedDocumentExists + } + } + + return nil +} + // DeepCopy returns a deep copy of this client info. func (i *ClientInfo) DeepCopy() *ClientInfo { if i == nil { diff --git a/server/backend/database/client_info_test.go b/server/backend/database/client_info_test.go index 83dd3f8a1..0a4645999 100644 --- a/server/backend/database/client_info_test.go +++ b/server/backend/database/client_info_test.go @@ -36,7 +36,7 @@ func TestClientInfo(t *testing.T) { Status: database.ClientActivated, } - err := clientInfo.AttachDocument(dummyDocID) + err := clientInfo.AttachDocument(dummyDocID, false) assert.NoError(t, err) isAttached, err := clientInfo.IsAttached(dummyDocID) assert.NoError(t, err) @@ -54,7 +54,7 @@ func TestClientInfo(t *testing.T) { assert.NoError(t, err) assert.False(t, isAttached) - err = clientInfo.AttachDocument(dummyDocID) + err = clientInfo.AttachDocument(dummyDocID, false) assert.NoError(t, err) isAttached, err = clientInfo.IsAttached(dummyDocID) assert.NoError(t, err) @@ -85,7 +85,7 @@ func TestClientInfo(t *testing.T) { Status: database.ClientActivated, } - err := clientInfo.AttachDocument(dummyDocID) + err := clientInfo.AttachDocument(dummyDocID, false) assert.NoError(t, err) isAttached, err := clientInfo.IsAttached(dummyDocID) assert.NoError(t, err) @@ -102,7 +102,7 @@ func TestClientInfo(t *testing.T) { Status: database.ClientDeactivated, } - err := clientInfo.AttachDocument(dummyDocID) + err := clientInfo.AttachDocument(dummyDocID, false) assert.ErrorIs(t, err, database.ErrClientNotActivated) err = clientInfo.EnsureDocumentAttached(dummyDocID) @@ -136,13 +136,30 @@ func TestClientInfo(t *testing.T) { Status: database.ClientActivated, } - err := clientInfo.AttachDocument(dummyDocID) + err := clientInfo.AttachDocument(dummyDocID, false) assert.NoError(t, err) isAttached, err := clientInfo.IsAttached(dummyDocID) assert.NoError(t, err) assert.True(t, isAttached) - err = clientInfo.AttachDocument(dummyDocID) + err = clientInfo.AttachDocument(dummyDocID, false) assert.ErrorIs(t, err, database.ErrDocumentAlreadyAttached) }) + + t.Run("document detached when client deactivate test", func(t *testing.T) { + clientInfo := database.ClientInfo{ + Status: database.ClientActivated, + } + + err := clientInfo.AttachDocument(dummyDocID, false) + assert.NoError(t, err) + isAttached, err := clientInfo.IsAttached(dummyDocID) + assert.NoError(t, err) + assert.True(t, isAttached) + + clientInfo.Deactivate() + + err = clientInfo.EnsureDocumentsNotAttachedWhenDeactivated() + assert.Equal(t, database.ErrAttachedDocumentExists, err) + }) } diff --git a/server/backend/database/database.go b/server/backend/database/database.go index 7b816b2f8..c6054ee81 100644 --- a/server/backend/database/database.go +++ b/server/backend/database/database.go @@ -179,6 +179,13 @@ type Database interface { docKey key.Key, ) (*DocInfo, error) + // FindDocInfosByKeys finds the documents of the given keys. + FindDocInfosByKeys( + ctx context.Context, + projectID types.ID, + docKeys []key.Key, + ) ([]*DocInfo, error) + // FindDocInfoByKeyAndOwner finds the document of the given key. If the // createDocIfNotExist condition is true, create the document if it does not // exist. diff --git a/server/backend/database/memory/database.go b/server/backend/database/memory/database.go index 3b5210d21..2b71d74cd 100644 --- a/server/backend/database/memory/database.go +++ b/server/backend/database/memory/database.go @@ -523,7 +523,15 @@ func (d *DB) DeactivateClient(_ context.Context, refKey types.ClientRefKey) (*da // the stored objects are returned instead of new objects. This can cause // problems when directly modifying loaded objects. So, we need to DeepCopy. clientInfo = clientInfo.DeepCopy() + for docID := range clientInfo.Documents { + if clientInfo.Documents[docID].Status == database.DocumentAttached { + if err := clientInfo.DetachDocument(docID); err != nil { + return nil, err + } + } + } clientInfo.Deactivate() + if err := txn.Insert(tblClients, clientInfo); err != nil { return nil, fmt.Errorf("update client: %w", err) } @@ -737,48 +745,17 @@ func (d *DB) FindDocInfoByKeyAndOwner( txn := d.db.Txn(true) defer txn.Abort() - // TODO(hackerwins): Removed documents should be filtered out by the query, but - // somehow it does not work. This is a workaround. - // val, err := txn.First(tblDocuments, "project_id_key_removed_at", projectID.String(), key.String(), gotime.Time{}) - iter, err := txn.Get( - tblDocuments, - "project_id_key_removed_at", - clientRefKey.ProjectID.String(), - key.String(), - gotime.Time{}, - ) - if err != nil { - return nil, fmt.Errorf("find document by key: %w", err) - } - var raw interface{} - for val := iter.Next(); val != nil; val = iter.Next() { - if val != nil && val.(*database.DocInfo).RemovedAt.IsZero() { - raw = val - } - } - + info, err := d.findDocInfoByKey(txn, clientRefKey.ProjectID, key) if err != nil { - return nil, fmt.Errorf("find document by key: %w", err) + return info, err } - if !createDocIfNotExist && raw == nil { - raw, err = txn.First( - tblDocuments, - "project_id_key", - clientRefKey.ProjectID.String(), - key.String(), - ) - if err != nil { - return nil, fmt.Errorf("find document by key: %w", err) - } - if raw == nil { - return nil, fmt.Errorf("%s: %w", key, database.ErrDocumentNotFound) - } + if !createDocIfNotExist && info == nil { + return nil, fmt.Errorf("%s: %w", key, database.ErrDocumentNotFound) } - now := gotime.Now() - var docInfo *database.DocInfo - if raw == nil { - docInfo = &database.DocInfo{ + if info == nil { + now := gotime.Now() + info = &database.DocInfo{ ID: newID(), ProjectID: clientRefKey.ProjectID, Key: key, @@ -787,15 +764,38 @@ func (d *DB) FindDocInfoByKeyAndOwner( CreatedAt: now, AccessedAt: now, } - if err := txn.Insert(tblDocuments, docInfo); err != nil { + if err := txn.Insert(tblDocuments, info); err != nil { return nil, fmt.Errorf("create document: %w", err) } txn.Commit() - } else { - docInfo = raw.(*database.DocInfo) } - return docInfo.DeepCopy(), nil + return info.DeepCopy(), nil +} + +// findDocInfoByKey finds the document of the given key. +func (d *DB) findDocInfoByKey(txn *memdb.Txn, projectID types.ID, key key.Key) (*database.DocInfo, error) { + // TODO(hackerwins): Removed documents should be filtered out by the query, but + // somehow it does not work. This is a workaround. + // val, err := txn.First(tblDocuments, "project_id_key_removed_at", projectID.String(), key.String(), gotime.Time{}) + iter, err := txn.Get( + tblDocuments, + "project_id_key_removed_at", + projectID.String(), + key.String(), + gotime.Time{}, + ) + if err != nil { + return nil, fmt.Errorf("find doc info by key: %w", err) + } + var docInfo *database.DocInfo + for val := iter.Next(); val != nil; val = iter.Next() { + if info := val.(*database.DocInfo); info.RemovedAt.IsZero() { + docInfo = info + } + } + + return docInfo, nil } // FindDocInfoByKey finds the document of the given key. @@ -807,15 +807,40 @@ func (d *DB) FindDocInfoByKey( txn := d.db.Txn(false) defer txn.Abort() - raw, err := txn.First(tblDocuments, "project_id_key_removed_at", projectID.String(), key.String(), gotime.Time{}) + info, err := d.findDocInfoByKey(txn, projectID, key) if err != nil { - return nil, fmt.Errorf("find document by key: %w", err) + return nil, fmt.Errorf("find doc info by key: %w", err) } - if raw == nil { + if info == nil { return nil, fmt.Errorf("%s: %w", key, database.ErrDocumentNotFound) } - return raw.(*database.DocInfo).DeepCopy(), nil + return info.DeepCopy(), nil +} + +// FindDocInfosByKeys finds the documents of the given keys. +func (d *DB) FindDocInfosByKeys( + _ context.Context, + projectID types.ID, + keys []key.Key, +) ([]*database.DocInfo, error) { + txn := d.db.Txn(false) + defer txn.Abort() + + var infos []*database.DocInfo + for _, k := range keys { + info, err := d.findDocInfoByKey(txn, projectID, k) + if err != nil { + return nil, fmt.Errorf("find doc info by key: %w", err) + } + if info == nil { + continue + } + + infos = append(infos, info.DeepCopy()) + } + + return infos, nil } // FindDocInfoByRefKey finds a docInfo of the given refKey. @@ -937,7 +962,14 @@ func (d *DB) CreateChangeInfos( now := gotime.Now() loadedDocInfo.ServerSeq = docInfo.ServerSeq - loadedDocInfo.UpdatedAt = now + + for _, cn := range changes { + if len(cn.Operations()) > 0 { + loadedDocInfo.UpdatedAt = now + break + } + } + if isRemoved { loadedDocInfo.RemovedAt = now } @@ -1367,6 +1399,9 @@ func (d *DB) FindDocInfosByQuery( for raw := iterator.Next(); raw != nil; raw = iterator.Next() { if count < pageSize { info := raw.(*database.DocInfo) + if info.IsRemoved() { + continue + } docInfos = append(docInfos, info) } count++ diff --git a/server/backend/database/memory/database_test.go b/server/backend/database/memory/database_test.go index 7f8edf3ee..8e979a619 100644 --- a/server/backend/database/memory/database_test.go +++ b/server/backend/database/memory/database_test.go @@ -48,6 +48,10 @@ func TestDB(t *testing.T) { testcases.RunFindDocInfoTest(t, db, projectID) }) + t.Run("RunFindDocInfosByKeys test", func(t *testing.T) { + testcases.RunFindDocInfosByKeysTest(t, db, projectID) + }) + t.Run("RunFindDocInfosByQuery test", func(t *testing.T) { testcases.RunFindDocInfosByQueryTest(t, db, projectOneID) }) diff --git a/server/backend/database/mongo/client.go b/server/backend/database/mongo/client.go index b68fae2e7..53e9ed6f9 100644 --- a/server/backend/database/mongo/client.go +++ b/server/backend/database/mongo/client.go @@ -549,15 +549,39 @@ func (c *Client) ActivateClient(ctx context.Context, projectID types.ID, key str return &clientInfo, nil } -// DeactivateClient deactivates the client of the given refKey. +// DeactivateClient deactivates the client of the given refKey and updates document statuses as detached. func (c *Client) DeactivateClient(ctx context.Context, refKey types.ClientRefKey) (*database.ClientInfo, error) { res := c.collection(ColClients).FindOneAndUpdate(ctx, bson.M{ "project_id": refKey.ProjectID, "_id": refKey.ClientID, - }, bson.M{ - "$set": bson.M{ - "status": database.ClientDeactivated, - "updated_at": gotime.Now(), + }, bson.A{ + bson.M{ + "$set": bson.M{ + "status": database.ClientDeactivated, + "updated_at": gotime.Now(), + "documents": bson.M{ + "$arrayToObject": bson.M{ + "$map": bson.M{ + "input": bson.M{"$objectToArray": "$documents"}, + "as": "doc", + "in": bson.M{ + "k": "$$doc.k", + "v": bson.M{ + "$cond": bson.M{ + "if": bson.M{"$eq": bson.A{"$$doc.v.status", database.DocumentAttached}}, + "then": bson.M{ + "client_seq": 0, + "server_seq": 0, + "status": database.DocumentDetached, + }, + "else": "$$doc.v", + }, + }, + }, + }, + }, + }, + }, }, }, options.FindOneAndUpdate().SetReturnDocument(options.After)) @@ -827,6 +851,35 @@ func (c *Client) FindDocInfoByKey( return &docInfo, nil } +// FindDocInfosByKeys finds the documents of the given keys. +func (c *Client) FindDocInfosByKeys( + ctx context.Context, + projectID types.ID, + docKeys []key.Key, +) ([]*database.DocInfo, error) { + filter := bson.M{ + "project_id": projectID, + "key": bson.M{ + "$in": docKeys, + }, + "removed_at": bson.M{ + "$exists": false, + }, + } + + cursor, err := c.collection(ColDocuments).Find(ctx, filter) + if err != nil { + return nil, fmt.Errorf("find documents: %w", err) + } + + var docInfos []*database.DocInfo + if err := cursor.All(ctx, &docInfos); err != nil { + return nil, fmt.Errorf("fetch documents: %w", err) + } + + return docInfos, nil +} + // FindDocInfoByRefKey finds a docInfo of the given refKey. func (c *Client) FindDocInfoByRefKey( ctx context.Context, @@ -926,8 +979,15 @@ func (c *Client) CreateChangeInfos( now := gotime.Now() updateFields := bson.M{ "server_seq": docInfo.ServerSeq, - "updated_at": now, } + + for _, cn := range changes { + if len(cn.Operations()) > 0 { + updateFields["updated_at"] = now + break + } + } + if isRemoved { updateFields["removed_at"] = now } @@ -1265,6 +1325,9 @@ func (c *Client) FindDocInfosByQuery( "key": bson.M{"$regex": primitive.Regex{ Pattern: "^" + escapeRegex(query), }}, + "removed_at": bson.M{ + "$exists": false, + }, }) if err != nil { return nil, fmt.Errorf("find document infos: %w", err) diff --git a/server/backend/database/mongo/client_test.go b/server/backend/database/mongo/client_test.go index 3a6e75372..5b647ec43 100644 --- a/server/backend/database/mongo/client_test.go +++ b/server/backend/database/mongo/client_test.go @@ -63,6 +63,10 @@ func TestClient(t *testing.T) { testcases.RunFindDocInfoTest(t, cli, dummyProjectID) }) + t.Run("RunFindDocInfosByKeys test", func(t *testing.T) { + testcases.RunFindDocInfosByKeysTest(t, cli, dummyProjectID) + }) + t.Run("RunFindDocInfosByQuery test", func(t *testing.T) { t.Skip("TODO(hackerwins): the order of docInfos is different with memDB") testcases.RunFindDocInfosByQueryTest(t, cli, projectOneID) diff --git a/server/backend/database/testcases/testcases.go b/server/backend/database/testcases/testcases.go index 61c6e5ea2..9a8184832 100644 --- a/server/backend/database/testcases/testcases.go +++ b/server/backend/database/testcases/testcases.go @@ -71,6 +71,91 @@ func RunFindDocInfoTest( assert.NoError(t, err) assert.Equal(t, docKey, docInfo.Key) }) + + t.Run("find docInfo by key test", func(t *testing.T) { + ctx := context.Background() + clientInfo, err := db.ActivateClient(ctx, projectID, t.Name()) + assert.NoError(t, err) + + // 01. Create a document + docKey := helper.TestDocKey(t) + info, err := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), docKey, true) + assert.NoError(t, err) + assert.Equal(t, docKey, info.Key) + + // 02. Remove the document + err = db.CreateChangeInfos(ctx, projectID, info, 0, []*change.Change{}, true) + assert.NoError(t, err) + + // 03. Find the document + info, err = db.FindDocInfoByKey(ctx, projectID, docKey) + assert.ErrorIs(t, err, database.ErrDocumentNotFound) + }) +} + +// RunFindDocInfosByKeysTest runs the FindDocInfosByKeys test for the given db. +func RunFindDocInfosByKeysTest( + t *testing.T, + db database.Database, + projectID types.ID, +) { + t.Run("find docInfos by keys test", func(t *testing.T) { + ctx := context.Background() + clientInfo, err := db.ActivateClient(ctx, projectID, t.Name()) + assert.NoError(t, err) + + // 01. Create documents + docKeys := []key.Key{ + "test", "test$3", "test123", "test$0", + "search$test", "abcde", "test abc", + } + for _, docKey := range docKeys { + _, err := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), docKey, true) + assert.NoError(t, err) + } + + // 02. Find documents + infos, err := db.FindDocInfosByKeys(ctx, projectID, docKeys) + assert.NoError(t, err) + + actualKeys := make([]key.Key, len(infos)) + for i, info := range infos { + actualKeys[i] = info.Key + } + + assert.ElementsMatch(t, docKeys, actualKeys) + assert.Len(t, infos, len(docKeys)) + }) + + t.Run("find docInfos by keys where some keys are not found test", func(t *testing.T) { + ctx := context.Background() + clientInfo, err := db.ActivateClient(ctx, projectID, t.Name()) + assert.NoError(t, err) + + // 01. Create documents + docKeys := []key.Key{ + "exist-key1", "exist-key2", "exist-key3", + } + for _, docKey := range docKeys { + _, err := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), docKey, true) + assert.NoError(t, err) + } + + // 02. append a key that does not exist + docKeysWithNonExistKey := append(docKeys, "non-exist-key") + + // 03. Find documents + infos, err := db.FindDocInfosByKeys(ctx, projectID, docKeysWithNonExistKey) + assert.NoError(t, err) + + actualKeys := make([]key.Key, len(infos)) + for i, info := range infos { + actualKeys[i] = info.Key + } + + assert.ElementsMatch(t, docKeys, actualKeys) + assert.Len(t, infos, len(docKeys)) + }) } // RunFindProjectInfoBySecretKeyTest runs the FindProjectInfoBySecretKey test for the given db. @@ -199,7 +284,7 @@ func RunFindChangesBetweenServerSeqsTest( clientInfo, _ := db.ActivateClient(ctx, projectID, t.Name()) docInfo, _ := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), docKey, true) docRefKey := docInfo.RefKey() - assert.NoError(t, clientInfo.AttachDocument(docInfo.ID)) + assert.NoError(t, clientInfo.AttachDocument(docInfo.ID, false)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) bytesID, _ := clientInfo.ID.Bytes() @@ -391,6 +476,56 @@ func RunActivateClientDeactivateClientTest(t *testing.T, db database.Database, p assert.Equal(t, t.Name(), clientInfo.Key) assert.Equal(t, database.ClientDeactivated, clientInfo.Status) }) + + t.Run("ensure document detached when deactivate client test", func(t *testing.T) { + ctx := context.Background() + + // 01. Create a client + clientInfo, err := db.ActivateClient(ctx, projectID, t.Name()) + assert.NoError(t, err) + assert.Equal(t, t.Name(), clientInfo.Key) + assert.Equal(t, database.ClientActivated, clientInfo.Status) + + // 02. Create documents and attach them to the client + for i := 0; i < 3; i++ { + docInfo, _ := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), helper.TestDocKey(t, i), true) + assert.NoError(t, clientInfo.AttachDocument(docInfo.ID, false)) + clientInfo.Documents[docInfo.ID].ServerSeq = 1 + clientInfo.Documents[docInfo.ID].ClientSeq = 1 + assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) + + result, err := db.FindClientInfoByRefKey(ctx, clientInfo.RefKey()) + assert.Equal(t, result.Documents[docInfo.ID].Status, database.DocumentAttached) + assert.Equal(t, result.Documents[docInfo.ID].ServerSeq, int64(1)) + assert.Equal(t, result.Documents[docInfo.ID].ClientSeq, uint32(1)) + assert.NoError(t, err) + } + + // 03. Remove one document + docInfo, err := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), helper.TestDocKey(t, 2), true) + assert.NoError(t, err) + assert.NoError(t, clientInfo.RemoveDocument(docInfo.ID)) + assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) + + // 04. Deactivate the client + result, err := db.DeactivateClient(ctx, types.ClientRefKey{ + ProjectID: projectID, + ClientID: clientInfo.ID, + }) + assert.NoError(t, err) + + // 05. Check whether doc.Status is reflected properly. + // If it was `DocumentAttached`, it should be changed to `DocumentDetached`. + for i := 0; i < 2; i++ { + docInfo, err := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), helper.TestDocKey(t, i), true) + assert.NoError(t, err) + assert.Equal(t, result.Documents[docInfo.ID].Status, database.DocumentDetached) + } + // If it was `DocumentRemoved`, it should be remained `DocumentRemoved`. + docInfo, err = db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), helper.TestDocKey(t, 2), true) + assert.NoError(t, err) + assert.Equal(t, result.Documents[docInfo.ID].Status, database.DocumentRemoved) + }) } // RunUpdateProjectInfoTest runs the UpdateProjectInfo tests for the given db. @@ -720,7 +855,7 @@ func RunCreateChangeInfosTest(t *testing.T, db database.Database, projectID type clientInfo, _ := db.ActivateClient(ctx, projectID, t.Name()) docInfo, _ := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), docKey, true) docRefKey := docInfo.RefKey() - assert.NoError(t, clientInfo.AttachDocument(docInfo.ID)) + assert.NoError(t, clientInfo.AttachDocument(docInfo.ID, false)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) // 02. Remove the document and check the document is removed. @@ -739,7 +874,7 @@ func RunCreateChangeInfosTest(t *testing.T, db database.Database, projectID type clientInfo1, _ := db.ActivateClient(ctx, projectID, t.Name()) docInfo1, _ := db.FindDocInfoByKeyAndOwner(ctx, clientInfo1.RefKey(), docKey, true) docRefKey1 := docInfo1.RefKey() - assert.NoError(t, clientInfo1.AttachDocument(docRefKey1.DocID)) + assert.NoError(t, clientInfo1.AttachDocument(docRefKey1.DocID, false)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo1, docInfo1)) // 02. Remove the document. @@ -750,7 +885,7 @@ func RunCreateChangeInfosTest(t *testing.T, db database.Database, projectID type // 03. Create a document with same key and check they have same key but different id. docInfo2, _ := db.FindDocInfoByKeyAndOwner(ctx, clientInfo1.RefKey(), docKey, true) docRefKey2 := docInfo2.RefKey() - assert.NoError(t, clientInfo1.AttachDocument(docRefKey2.DocID)) + assert.NoError(t, clientInfo1.AttachDocument(docRefKey2.DocID, false)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo1, docInfo2)) assert.Equal(t, docInfo1.Key, docInfo2.Key) assert.NotEqual(t, docInfo1.ID, docInfo2.ID) @@ -763,7 +898,7 @@ func RunCreateChangeInfosTest(t *testing.T, db database.Database, projectID type clientInfo, _ := db.ActivateClient(ctx, projectID, t.Name()) docInfo, _ := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), docKey, true) docRefKey := docInfo.RefKey() - assert.NoError(t, clientInfo.AttachDocument(docInfo.ID)) + assert.NoError(t, clientInfo.AttachDocument(docInfo.ID, false)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) doc := document.New(key.Key(t.Name())) @@ -784,6 +919,46 @@ func RunCreateChangeInfosTest(t *testing.T, db database.Database, projectID type assert.NoError(t, err) assert.NotEqual(t, database.DocumentRemoved, clientInfo.Documents[docInfo.ID].Status) }) + + t.Run("set updated_at in docInfo test", func(t *testing.T) { + ctx := context.Background() + docKey := helper.TestDocKey(t) + + // 01. Create a client and a document then attach the document to the client. + clientInfo, _ := db.ActivateClient(ctx, projectID, t.Name()) + docInfo1, _ := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), docKey, true) + docRefKey := docInfo1.RefKey() + assert.NoError(t, clientInfo.AttachDocument(docRefKey.DocID, false)) + assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo1)) + + bytesID, _ := clientInfo.ID.Bytes() + actorID, _ := time.ActorIDFromBytes(bytesID) + doc := document.New(key.Key(t.Name())) + doc.SetActor(actorID) + + // 02. update document only presence + assert.NoError(t, doc.Update(func(root *json.Object, p *presence.Presence) error { + p.Set("key", "val") + return nil + })) + pack := doc.CreateChangePack() + updatedAt := docInfo1.UpdatedAt + assert.NoError(t, db.CreateChangeInfos(ctx, projectID, docInfo1, 0, pack.Changes, false)) + docInfo2, _ := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), docKey, true) + assert.Equal(t, updatedAt, docInfo2.UpdatedAt) + + // 03. update document presence and operation + assert.NoError(t, doc.Update(func(root *json.Object, p *presence.Presence) error { + p.Set("key", "val") + root.SetNewArray("array") + return nil + })) + pack = doc.CreateChangePack() + updatedAt = docInfo2.UpdatedAt + assert.NoError(t, db.CreateChangeInfos(ctx, projectID, docInfo2, 0, pack.Changes, false)) + docInfo3, _ := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), docKey, true) + assert.NotEqual(t, updatedAt, docInfo3.UpdatedAt) + }) } // RunUpdateClientInfoAfterPushPullTest runs the UpdateClientInfoAfterPushPull tests for the given db. @@ -801,7 +976,7 @@ func RunUpdateClientInfoAfterPushPullTest(t *testing.T, db database.Database, pr err = db.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo) assert.ErrorIs(t, err, database.ErrDocumentNeverAttached) - assert.NoError(t, clientInfo.AttachDocument(docInfo.ID)) + assert.NoError(t, clientInfo.AttachDocument(docInfo.ID, false)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) }) @@ -813,7 +988,7 @@ func RunUpdateClientInfoAfterPushPullTest(t *testing.T, db database.Database, pr docInfo, err := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), docKey, true) assert.NoError(t, err) - assert.NoError(t, clientInfo.AttachDocument(docInfo.ID)) + assert.NoError(t, clientInfo.AttachDocument(docInfo.ID, false)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) result, err := db.FindClientInfoByRefKey(ctx, clientInfo.RefKey()) @@ -831,7 +1006,7 @@ func RunUpdateClientInfoAfterPushPullTest(t *testing.T, db database.Database, pr docInfo, err := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), docKey, true) assert.NoError(t, err) - assert.NoError(t, clientInfo.AttachDocument(docInfo.ID)) + assert.NoError(t, clientInfo.AttachDocument(docInfo.ID, false)) clientInfo.Documents[docInfo.ID].ServerSeq = 1 clientInfo.Documents[docInfo.ID].ClientSeq = 1 assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) @@ -873,7 +1048,7 @@ func RunUpdateClientInfoAfterPushPullTest(t *testing.T, db database.Database, pr docInfo, err := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), docKey, true) assert.NoError(t, err) - assert.NoError(t, clientInfo.AttachDocument(docInfo.ID)) + assert.NoError(t, clientInfo.AttachDocument(docInfo.ID, false)) clientInfo.Documents[docInfo.ID].ServerSeq = 1 clientInfo.Documents[docInfo.ID].ClientSeq = 1 assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) @@ -902,7 +1077,7 @@ func RunUpdateClientInfoAfterPushPullTest(t *testing.T, db database.Database, pr docInfo, err := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), docKey, true) assert.NoError(t, err) - assert.NoError(t, clientInfo.AttachDocument(docInfo.ID)) + assert.NoError(t, clientInfo.AttachDocument(docInfo.ID, false)) clientInfo.Documents[docInfo.ID].ServerSeq = 1 clientInfo.Documents[docInfo.ID].ClientSeq = 1 assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) @@ -931,7 +1106,7 @@ func RunUpdateClientInfoAfterPushPullTest(t *testing.T, db database.Database, pr docInfo, err := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), docKey, true) assert.NoError(t, err) - assert.NoError(t, clientInfo.AttachDocument(docInfo.ID)) + assert.NoError(t, clientInfo.AttachDocument(docInfo.ID, false)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) clientInfo.ID = "invalid clientInfo id" @@ -962,7 +1137,7 @@ func RunIsDocumentAttachedTest(t *testing.T, db database.Database, projectID typ assert.False(t, attached) // 02. Check if document is attached after attaching - assert.NoError(t, c1.AttachDocument(docRefKey1.DocID)) + assert.NoError(t, c1.AttachDocument(docRefKey1.DocID, false)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, c1, d1)) attached, err = db.IsDocumentAttached(ctx, docRefKey1, "") assert.NoError(t, err) @@ -976,9 +1151,9 @@ func RunIsDocumentAttachedTest(t *testing.T, db database.Database, projectID typ assert.False(t, attached) // 04. Check if document is attached after two clients attaching - assert.NoError(t, c1.AttachDocument(docRefKey1.DocID)) + assert.NoError(t, c1.AttachDocument(docRefKey1.DocID, false)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, c1, d1)) - assert.NoError(t, c2.AttachDocument(docRefKey1.DocID)) + assert.NoError(t, c2.AttachDocument(docRefKey1.DocID, false)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, c2, d1)) attached, err = db.IsDocumentAttached(ctx, docRefKey1, "") assert.NoError(t, err) @@ -1012,14 +1187,14 @@ func RunIsDocumentAttachedTest(t *testing.T, db database.Database, projectID typ // 01. Check if documents are attached after attaching docRefKey1 := d1.RefKey() - assert.NoError(t, c1.AttachDocument(docRefKey1.DocID)) + assert.NoError(t, c1.AttachDocument(docRefKey1.DocID, false)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, c1, d1)) attached, err := db.IsDocumentAttached(ctx, docRefKey1, "") assert.NoError(t, err) assert.True(t, attached) docRefKey2 := d2.RefKey() - assert.NoError(t, c1.AttachDocument(docRefKey2.DocID)) + assert.NoError(t, c1.AttachDocument(docRefKey2.DocID, false)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, c1, d2)) attached, err = db.IsDocumentAttached(ctx, docRefKey2, "") assert.NoError(t, err) @@ -1061,7 +1236,7 @@ func RunIsDocumentAttachedTest(t *testing.T, db database.Database, projectID typ assert.False(t, attached) // 02. Check if document is attached after attaching - assert.NoError(t, c1.AttachDocument(docRefKey1.DocID)) + assert.NoError(t, c1.AttachDocument(docRefKey1.DocID, false)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, c1, d1)) attached, err = db.IsDocumentAttached(ctx, docRefKey1, "") assert.NoError(t, err) @@ -1081,9 +1256,9 @@ func RunIsDocumentAttachedTest(t *testing.T, db database.Database, projectID typ assert.False(t, attached) // 04. Check if document is attached after two clients attaching - assert.NoError(t, c1.AttachDocument(docRefKey1.DocID)) + assert.NoError(t, c1.AttachDocument(docRefKey1.DocID, false)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, c1, d1)) - assert.NoError(t, c2.AttachDocument(docRefKey1.DocID)) + assert.NoError(t, c2.AttachDocument(docRefKey1.DocID, false)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, c2, d1)) attached, err = db.IsDocumentAttached(ctx, docRefKey1, "") assert.NoError(t, err) diff --git a/server/backend/housekeeping/config.go b/server/backend/housekeeping/config.go index 10f6c3ad3..3fc9e16ff 100644 --- a/server/backend/housekeeping/config.go +++ b/server/backend/housekeeping/config.go @@ -14,6 +14,8 @@ * limitations under the License. */ +// Package housekeeping is the package for housekeeping service. It cleans up +// the resources and data that is no longer needed. package housekeeping import ( @@ -91,3 +93,13 @@ func (c *Config) Validate() error { return nil } + +// ParseInterval parses the interval. +func (c *Config) ParseInterval() (time.Duration, error) { + interval, err := time.ParseDuration(c.Interval) + if err != nil { + return 0, fmt.Errorf("parse interval %s: %w", c.Interval, err) + } + + return interval, nil +} diff --git a/server/backend/housekeeping/housekeeping.go b/server/backend/housekeeping/housekeeping.go index 08d536ca2..029260d18 100644 --- a/server/backend/housekeeping/housekeeping.go +++ b/server/backend/housekeeping/housekeeping.go @@ -14,9 +14,6 @@ * limitations under the License. */ -// Package housekeeping provides the housekeeping service. The housekeeping -// service is responsible for deactivating clients that have not been used for -// a long time. package housekeeping import ( @@ -24,22 +21,22 @@ import ( "fmt" "time" - "github.com/yorkie-team/yorkie/api/types" - "github.com/yorkie-team/yorkie/server/backend/database" - "github.com/yorkie-team/yorkie/server/backend/sync" - "github.com/yorkie-team/yorkie/server/clients" + "github.com/go-co-op/gocron/v2" + "github.com/yorkie-team/yorkie/server/logging" ) -const ( +const ( // existing commit deactivateCandidatesKey = "housekeeping/deactivateCandidates" documentHardDeletionLockKey = "housekeeping/DocumentHardDeletionLock" ) // Housekeeping is the housekeeping service. It periodically runs housekeeping -// tasks. It is responsible for deactivating clients that have not been active -// for a long time. +// tasks. type Housekeeping struct { + Config *Config + /* existing commit + database database.Database coordinator sync.Coordinator @@ -49,42 +46,30 @@ type Housekeeping struct { clientDeactivationCandidateLimitPerProject int DocumentHardDeletionCandidateLimitPerProject int projectFetchSize int - - ctx context.Context - cancelFunc context.CancelFunc -} - -// Start starts the housekeeping service. -func Start( - conf *Config, - database database.Database, - coordinator sync.Coordinator, -) (*Housekeeping, error) { - h, err := New(conf, database, coordinator) - if err != nil { - return nil, err - } - if err := h.Start(); err != nil { - return nil, err - } - - return h, nil + */ + scheduler gocron.Scheduler } // New creates a new housekeeping instance. -func New( - conf *Config, - database database.Database, - coordinator sync.Coordinator, -) (*Housekeeping, error) { - intervalDeactivateCandidates, err := time.ParseDuration(conf.IntervalDeactivateCandidates) - if err != nil { - return nil, fmt.Errorf("parse intervalDeactivateCandidates %s: %w", - conf.IntervalDeactivateCandidates, err) - } +func New(conf *Config) (*Housekeeping, error) { + scheduler, err := gocron.NewScheduler() + /* existing commit + func New( + conf *Config, + database database.Database, + coordinator sync.Coordinator, + ) (*Housekeeping, error) { + intervalDeactivateCandidates, err := time.ParseDuration(conf.IntervalDeactivateCandidates) + if err != nil { + return nil, fmt.Errorf("parse intervalDeactivateCandidates %s: %w", + conf.IntervalDeactivateCandidates, err) + } - intervalDeleteDocuments, err := time.ParseDuration(conf.IntervalDeleteDocuments) - if err != nil { + intervalDeleteDocuments, err := time.ParseDuration(conf.IntervalDeleteDocuments) + if err != nil { + */ + return nil, fmt.Errorf("new scheduler: %w", err) + /* existing commit return nil, fmt.Errorf("parse intervalDeleteDocuments %s: %w", conf.IntervalDeleteDocuments, err) } @@ -93,10 +78,11 @@ func New( return nil, fmt.Errorf("parse documentHardDeletionGracefulPeriod %s: %w", conf.DocumentHardDeletionGracefulPeriod, err) } - - ctx, cancelFunc := context.WithCancel(context.Background()) - + */ return &Housekeeping{ + Config: conf, + scheduler: scheduler, + /* existing commit database: database, coordinator: coordinator, @@ -109,22 +95,56 @@ func New( ctx: ctx, cancelFunc: cancelFunc, + */ }, nil } +// RegisterTask registers task the housekeeping service. +func (h *Housekeeping) RegisterTask( + interval time.Duration, + task func(ctx context.Context) error, +) error { + if _, err := h.scheduler.NewJob( + gocron.DurationJob(interval), + gocron.NewTask(func() { + ctx := context.Background() + if err := task(ctx); err != nil { + logging.From(ctx).Error(err) + } + }), + ); err != nil { + return fmt.Errorf("scheduler new job: %w", err) + } + + return nil +} + // Start starts the housekeeping service. func (h *Housekeeping) Start() error { - go h.AttachDeactivateCandidates() + h.scheduler.Start() + /* existing commit + go h.AttachDeactivateCandidates()밋 go h.AttachDocumentHardDeletion() + */ return nil } // Stop stops the housekeeping service. func (h *Housekeeping) Stop() error { + if err := h.scheduler.StopJobs(); err != nil { + return fmt.Errorf("scheduler stop jobs: %w", err) + } + + if err := h.scheduler.Shutdown(); err != nil { + return fmt.Errorf("scheduler shutdown: %w", err) + } + /* existing commit h.cancelFunc() + */ return nil } +/* existing commit // AttachDeactivateCandidates is the housekeeping loop for DeactivateCandidates func (h *Housekeeping) AttachDeactivateCandidates() { housekeepingLastProjectID := database.DefaultProjectID @@ -345,3 +365,4 @@ func (h *Housekeeping) FindDocumentHardDeletionCandidates( return topProjectID, candidates, nil } +*/ diff --git a/server/clients/clients.go b/server/clients/clients.go index 9260147a9..83049d54d 100644 --- a/server/clients/clients.go +++ b/server/clients/clients.go @@ -49,29 +49,25 @@ func Deactivate( db database.Database, refKey types.ClientRefKey, ) (*database.ClientInfo, error) { - clientInfo, err := db.FindClientInfoByRefKey(ctx, refKey) + // TODO(hackerwins): We need to remove the presence of the client from the document. + // Be careful that housekeeping is executed by the leader. And documents are sharded + // by the servers in the cluster. So, we need to consider the case where the leader is + // not the same as the server that handles the document. + + // TODO(raararaara): When deactivating a client, we need to update three DB properties + // (ClientInfo.Status, ClientInfo.Documents, SyncedSeq) in DB. + // Updating the sub-properties of ClientInfo guarantees atomicity as it involves a single MongoDB document. + // However, SyncedSeqs are stored in separate documents, so we can't ensure atomic updates for both. + // Currently, if SyncedSeqs update fails, it mainly impacts GC efficiency without causing major issues. + // We need to consider implementing a correction logic to remove SyncedSeqs in the future. + clientInfo, err := db.DeactivateClient(ctx, refKey) if err != nil { return nil, err } + // TODO(raararaara): We're currently updating SyncedSeq one by one. This approach is similar + // to n+1 query problem. We need to investigate if we can optimize this process by using a single query in the future. for docID, clientDocInfo := range clientInfo.Documents { - isAttached, err := clientInfo.IsAttached(docID) - if err != nil { - return nil, err - } - if !isAttached { - continue - } - - if err := clientInfo.DetachDocument(docID); err != nil { - return nil, err - } - - // TODO(hackerwins): We need to remove the presence of the client from the document. - // Be careful that housekeeping is executed by the leader. And documents are sharded - // by the servers in the cluster. So, we need to consider the case where the leader is - // not the same as the server that handles the document. - if err := db.UpdateSyncedSeq( ctx, clientInfo, @@ -85,14 +81,23 @@ func Deactivate( } } - return db.DeactivateClient(ctx, refKey) + return clientInfo, err } -// FindClientInfo finds the client with the given refKey. -func FindClientInfo( +// FindActiveClientInfo find the active client info by the given ref key. +func FindActiveClientInfo( ctx context.Context, db database.Database, refKey types.ClientRefKey, ) (*database.ClientInfo, error) { - return db.FindClientInfoByRefKey(ctx, refKey) + info, err := db.FindClientInfoByRefKey(ctx, refKey) + if err != nil { + return nil, err + } + + if err := info.EnsureActivated(); err != nil { + return nil, err + } + + return info, nil } diff --git a/server/clients/housekeeping.go b/server/clients/housekeeping.go new file mode 100644 index 000000000..76ab28bd8 --- /dev/null +++ b/server/clients/housekeeping.go @@ -0,0 +1,122 @@ +/* + * Copyright 2024 The Yorkie Authors. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package clients + +import ( + "context" + "time" + + "github.com/yorkie-team/yorkie/api/types" + "github.com/yorkie-team/yorkie/server/backend" + "github.com/yorkie-team/yorkie/server/backend/database" + "github.com/yorkie-team/yorkie/server/logging" +) + +const ( + deactivateCandidatesKey = "housekeeping/deactivateCandidates" +) + +// DeactivateInactives deactivates clients that have not been active for a +// long time. +func DeactivateInactives( + ctx context.Context, + be *backend.Backend, + candidatesLimitPerProject int, + projectFetchSize int, + housekeepingLastProjectID types.ID, +) (types.ID, error) { + start := time.Now() + + locker, err := be.Coordinator.NewLocker(ctx, deactivateCandidatesKey) + if err != nil { + return database.DefaultProjectID, err + } + + if err := locker.Lock(ctx); err != nil { + return database.DefaultProjectID, err + } + + defer func() { + if err := locker.Unlock(ctx); err != nil { + logging.From(ctx).Error(err) + } + }() + + lastProjectID, candidates, err := FindDeactivateCandidates( + ctx, + be, + candidatesLimitPerProject, + projectFetchSize, + housekeepingLastProjectID, + ) + if err != nil { + return database.DefaultProjectID, err + } + + deactivatedCount := 0 + for _, clientInfo := range candidates { + if _, err := Deactivate(ctx, be.DB, clientInfo.RefKey()); err != nil { + return database.DefaultProjectID, err + } + + deactivatedCount++ + } + + if len(candidates) > 0 { + logging.From(ctx).Infof( + "HSKP: candidates %d, deactivated %d, %s", + len(candidates), + deactivatedCount, + time.Since(start), + ) + } + + return lastProjectID, nil +} + +// FindDeactivateCandidates finds candidates to deactivate from the database. +func FindDeactivateCandidates( + ctx context.Context, + be *backend.Backend, + candidatesLimitPerProject int, + projectFetchSize int, + lastProjectID types.ID, +) (types.ID, []*database.ClientInfo, error) { + projects, err := be.DB.FindNextNCyclingProjectInfos(ctx, projectFetchSize, lastProjectID) + if err != nil { + return database.DefaultProjectID, nil, err + } + + var candidates []*database.ClientInfo + for _, project := range projects { + infos, err := be.DB.FindDeactivateCandidatesPerProject(ctx, project, candidatesLimitPerProject) + if err != nil { + return database.DefaultProjectID, nil, err + } + + candidates = append(candidates, infos...) + } + + var topProjectID types.ID + if len(projects) < projectFetchSize { + topProjectID = database.DefaultProjectID + } else { + topProjectID = projects[len(projects)-1].ID + } + + return topProjectID, candidates, nil +} diff --git a/server/config.go b/server/config.go index df710abdb..c04b356e1 100644 --- a/server/config.go +++ b/server/config.go @@ -61,6 +61,7 @@ const ( DefaultSnapshotThreshold = 500 DefaultSnapshotInterval = 1000 DefaultSnapshotWithPurgingChanges = false + DefaultSnapshotDisableGC = false DefaultAuthWebhookMaxRetries = 10 DefaultAuthWebhookMaxWaitInterval = 3000 * time.Millisecond diff --git a/server/documents/documents.go b/server/documents/documents.go index f27be066b..e73167e34 100644 --- a/server/documents/documents.go +++ b/server/documents/documents.go @@ -97,16 +97,7 @@ func GetDocumentSummary( project *types.Project, k key.Key, ) (*types.DocumentSummary, error) { - // TODO(hackerwins): Split FindDocInfoByKeyAndOwner into upsert and find. - docInfo, err := be.DB.FindDocInfoByKeyAndOwner( - ctx, - types.ClientRefKey{ - ProjectID: project.ID, - ClientID: types.IDFromActorID(time.InitialActorID), - }, - k, - false, - ) + docInfo, err := be.DB.FindDocInfoByKey(ctx, project.ID, k) if err != nil { return nil, err } @@ -126,6 +117,47 @@ func GetDocumentSummary( }, nil } +// GetDocumentSummaries returns a list of document summaries. +func GetDocumentSummaries( + ctx context.Context, + be *backend.Backend, + project *types.Project, + keys []key.Key, + includeSnapshot bool, +) ([]*types.DocumentSummary, error) { + docInfos, err := be.DB.FindDocInfosByKeys(ctx, project.ID, keys) + if err != nil { + return nil, err + } + + var summaries []*types.DocumentSummary + for _, docInfo := range docInfos { + snapshot := "" + if includeSnapshot { + // TODO(hackerwins, kokodak): Resolve the N+1 problem. + doc, err := packs.BuildDocumentForServerSeq(ctx, be, docInfo, docInfo.ServerSeq) + if err != nil { + return nil, err + } + + snapshot = doc.Marshal() + } + + summary := &types.DocumentSummary{ + ID: docInfo.ID, + Key: docInfo.Key, + CreatedAt: docInfo.CreatedAt, + AccessedAt: docInfo.AccessedAt, + UpdatedAt: docInfo.UpdatedAt, + Snapshot: snapshot, + } + + summaries = append(summaries, summary) + } + + return summaries, nil +} + // GetDocumentByServerSeq returns a document for the given server sequence. func GetDocumentByServerSeq( ctx context.Context, diff --git a/server/logging/logging.go b/server/logging/logging.go index 1faabd318..371496d09 100644 --- a/server/logging/logging.go +++ b/server/logging/logging.go @@ -30,6 +30,9 @@ import ( // Logger is a wrapper of zap.Logger. type Logger = *zap.SugaredLogger +// Field is a wrapper of zap.Field. +type Field = zap.Field + var defaultLogger Logger var logLevel = zapcore.InfoLevel var loggerOnce sync.Once @@ -57,8 +60,25 @@ func SetLogLevel(level string) error { } // New creates a new logger with the given configuration. -func New(name string) Logger { - return newLogger(name) +func New(name string, fields ...Field) Logger { + logger := newLogger(name) + + if len(fields) > 0 { + var args = make([]interface{}, len(fields)) + for i, field := range fields { + args[i] = field + } + + logger = logger.With(args...) + } + + return logger +} + +// NewField creates a new field with the given key and value. +func NewField(key string, value string) Field { + return zap.String(key, value) + } // DefaultLogger returns the default logger used by Yorkie. diff --git a/server/packs/packs.go b/server/packs/packs.go index 6015dbf68..f37d94655 100644 --- a/server/packs/packs.go +++ b/server/packs/packs.go @@ -47,6 +47,15 @@ func SnapshotKey(projectID types.ID, docKey key.Key) sync.Key { return sync.NewKey(fmt.Sprintf("snapshot-%s-%s", projectID, docKey)) } +// PushPullOptions represents the options for PushPull. +type PushPullOptions struct { + // Mode represents the sync mode. + Mode types.SyncMode + + // Status represents the status of the document to be updated. + Status document.StatusType +} + // PushPull stores the given changes and returns accumulated changes of the // given document. // @@ -59,7 +68,7 @@ func PushPull( clientInfo *database.ClientInfo, docInfo *database.DocInfo, reqPack *change.Pack, - mode types.SyncMode, + opts PushPullOptions, ) (*ServerPack, error) { start := gotime.Now() defer func() { @@ -76,7 +85,7 @@ func PushPull( be.Metrics.AddPushPullReceivedOperations(reqPack.OperationsLen()) // 02. pull pack: pull changes or a snapshot from the database and create a response pack. - respPack, err := pullPack(ctx, be, clientInfo, docInfo, reqPack, cpAfterPush, initialServerSeq, mode) + respPack, err := pullPack(ctx, be, clientInfo, docInfo, reqPack, cpAfterPush, initialServerSeq, opts.Mode) if err != nil { return nil, err } @@ -84,12 +93,23 @@ func PushPull( be.Metrics.AddPushPullSentOperations(respPack.OperationsLen()) be.Metrics.AddPushPullSnapshotBytes(respPack.SnapshotLen()) + // 03. update the client's document and checkpoint. docRefKey := docInfo.RefKey() - if err := clientInfo.UpdateCheckpoint(docRefKey.DocID, respPack.Checkpoint); err != nil { - return nil, err + if opts.Status == document.StatusRemoved { + if err := clientInfo.RemoveDocument(docInfo.ID); err != nil { + return nil, err + } + } else if opts.Status == document.StatusDetached { + if err := clientInfo.DetachDocument(docInfo.ID); err != nil { + return nil, err + } + } else { + if err := clientInfo.UpdateCheckpoint(docRefKey.DocID, respPack.Checkpoint); err != nil { + return nil, err + } } - // 03. store pushed changes, docInfo and checkpoint of the client to DB. + // 04. store pushed changes, docInfo and checkpoint of the client to DB. if len(pushedChanges) > 0 || reqPack.IsRemoved { if err := be.DB.CreateChangeInfos( ctx, @@ -107,7 +127,7 @@ func PushPull( return nil, err } - // 04. update and find min synced ticket for garbage collection. + // 05. update and find min synced ticket for garbage collection. // NOTE(hackerwins): Since the client could not receive the response, the // requested seq(reqPack) is stored instead of the response seq(resPack). minSyncedTicket, err := be.DB.UpdateAndFindMinSyncedTicket( @@ -135,7 +155,7 @@ func PushPull( minSyncedTicket.ToTestString(), ) - // 05. publish document change event then store snapshot asynchronously. + // 06. publish document change event then store snapshot asynchronously. if len(pushedChanges) > 0 || reqPack.IsRemoved { be.Background.AttachGoroutine(func(ctx context.Context) { publisherID, err := clientInfo.ID.ToActorID() @@ -236,7 +256,7 @@ func BuildDocumentForServerSeq( change.InitialCheckpoint.NextServerSeq(serverSeq), changes, nil, - )); err != nil { + ), be.Config.SnapshotDisableGC); err != nil { return nil, err } @@ -245,7 +265,7 @@ func BuildDocumentForServerSeq( "after apply %d changes: elements: %d removeds: %d, %s", len(changes), doc.Root().ElementMapLen(), - doc.Root().RemovedElementLen(), + doc.Root().GarbageElementLen(), doc.RootObject().Marshal(), ) } diff --git a/server/packs/pushpull.go b/server/packs/pushpull.go index ca87c87ae..20303689a 100644 --- a/server/packs/pushpull.go +++ b/server/packs/pushpull.go @@ -151,7 +151,7 @@ func pullSnapshot( doc.Checkpoint().NextServerSeq(docInfo.ServerSeq), reqPack.Changes, nil, - )); err != nil { + ), be.Config.SnapshotDisableGC); err != nil { return nil, err } } diff --git a/server/packs/snapshots.go b/server/packs/snapshots.go index 39b0c915d..f46aecd4b 100644 --- a/server/packs/snapshots.go +++ b/server/packs/snapshots.go @@ -91,7 +91,7 @@ func storeSnapshot( ) pack.MinSyncedTicket = minSyncedTicket - if err := doc.ApplyChangePack(pack); err != nil { + if err := doc.ApplyChangePack(pack, be.Config.SnapshotDisableGC); err != nil { return err } diff --git a/server/rpc/admin_server.go b/server/rpc/admin_server.go index dc57c66c9..9f44d6b6f 100644 --- a/server/rpc/admin_server.go +++ b/server/rpc/admin_server.go @@ -204,6 +204,38 @@ func (s *adminServer) GetDocument( }), nil } +// GetDocuments gets the documents. +func (s *adminServer) GetDocuments( + ctx context.Context, + req *connect.Request[api.GetDocumentsRequest], +) (*connect.Response[api.GetDocumentsResponse], error) { + user := users.From(ctx) + project, err := projects.GetProject(ctx, s.backend, user.ID, req.Msg.ProjectName) + if err != nil { + return nil, err + } + + var keys []key.Key + for _, k := range req.Msg.DocumentKeys { + keys = append(keys, key.Key(k)) + } + + docs, err := documents.GetDocumentSummaries( + ctx, + s.backend, + project, + keys, + req.Msg.IncludeSnapshot, + ) + if err != nil { + return nil, err + } + + return connect.NewResponse(&api.GetDocumentsResponse{ + Documents: converter.ToDocumentSummaries(docs), + }), nil +} + // GetSnapshotMeta gets the snapshot metadata that corresponds to the server sequence. func (s *adminServer) GetSnapshotMeta( ctx context.Context, diff --git a/server/rpc/connecthelper/logging.go b/server/rpc/connecthelper/logging.go deleted file mode 100644 index 01359b480..000000000 --- a/server/rpc/connecthelper/logging.go +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2022 The Yorkie Authors. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Package connecthelper provides helper functions for connectRPC. -package connecthelper - -import ( - "context" - "strconv" - "sync/atomic" - - "connectrpc.com/connect" - - "github.com/yorkie-team/yorkie/server/logging" -) - -type reqID int32 - -func (c *reqID) next() string { - next := atomic.AddInt32((*int32)(c), 1) - return "r" + strconv.Itoa(int(next)) -} - -// LoggingInterceptor is an interceptor for request logging. -type LoggingInterceptor struct { - reqID reqID -} - -// NewLoggingInterceptor creates a new instance of LoggingInterceptor. -func NewLoggingInterceptor() *LoggingInterceptor { - return &LoggingInterceptor{} -} - -// WrapUnary creates a unary server interceptor for request logging. -func (i *LoggingInterceptor) WrapUnary(next connect.UnaryFunc) connect.UnaryFunc { - return func( - ctx context.Context, - req connect.AnyRequest, - ) (connect.AnyResponse, error) { - reqLogger := logging.New(i.reqID.next()) - return next(logging.With(ctx, reqLogger), req) - } -} - -// WrapStreamingClient creates a stream client interceptor for request logging. -func (i *LoggingInterceptor) WrapStreamingClient(next connect.StreamingClientFunc) connect.StreamingClientFunc { - return func( - ctx context.Context, - spec connect.Spec, - ) connect.StreamingClientConn { - return next(ctx, spec) - } -} - -// WrapStreamingHandler creates a stream server interceptor for request logging. -func (i *LoggingInterceptor) WrapStreamingHandler(next connect.StreamingHandlerFunc) connect.StreamingHandlerFunc { - return func( - ctx context.Context, - conn connect.StreamingHandlerConn, - ) error { - reqLogger := logging.New(i.reqID.next()) - return next(logging.With(ctx, reqLogger), conn) - } -} diff --git a/server/rpc/connecthelper/status.go b/server/rpc/connecthelper/status.go index 1cc22b89b..2b330c70d 100644 --- a/server/rpc/connecthelper/status.go +++ b/server/rpc/connecthelper/status.go @@ -14,12 +14,12 @@ * limitations under the License. */ +// Package connecthelper provides helper functions for connectRPC. package connecthelper import ( "context" "errors" - "fmt" "connectrpc.com/connect" "google.golang.org/genproto/googleapis/rpc/errdetails" @@ -36,8 +36,8 @@ import ( "github.com/yorkie-team/yorkie/server/rpc/auth" ) -// errorToCode maps an error to connectRPC status code. -var errorToCode = map[error]connect.Code{ +// errorToConnectCode maps an error to connectRPC status code. +var errorToConnectCode = map[error]connect.Code{ // InvalidArgument means the request is malformed. converter.ErrPackRequired: connect.CodeInvalidArgument, converter.ErrCheckpointRequired: connect.CodeInvalidArgument, @@ -65,6 +65,7 @@ var errorToCode = map[error]connect.Code{ database.ErrClientNotActivated: connect.CodeFailedPrecondition, database.ErrDocumentNotAttached: connect.CodeFailedPrecondition, database.ErrDocumentAlreadyAttached: connect.CodeFailedPrecondition, + database.ErrDocumentAlreadyDetached: connect.CodeFailedPrecondition, documents.ErrDocumentAttached: connect.CodeFailedPrecondition, packs.ErrInvalidServerSeq: connect.CodeFailedPrecondition, database.ErrConflictOnUpdate: connect.CodeFailedPrecondition, @@ -86,9 +87,110 @@ var errorToCode = map[error]connect.Code{ context.Canceled: connect.CodeCanceled, } -func detailsFromError(err error) (*errdetails.BadRequest, bool) { - invalidFieldsError, ok := err.(*validation.StructError) +// errorToCode maps an error to a string representation of the error. +// TODO(hackerwins): We need to add codes by hand for each error. It would be +// better to generate this map automatically. +var errorToCode = map[error]string{ + converter.ErrPackRequired: "ErrPackRequired", + converter.ErrCheckpointRequired: "ErrCheckpointRequired", + time.ErrInvalidHexString: "ErrInvalidHexString", + time.ErrInvalidActorID: "ErrInvalidActorID", + types.ErrInvalidID: "ErrInvalidID", + clients.ErrInvalidClientID: "ErrInvalidClientID", + clients.ErrInvalidClientKey: "ErrInvalidClientKey", + key.ErrInvalidKey: "ErrInvalidKey", + types.ErrEmptyProjectFields: "ErrEmptyProjectFields", + + database.ErrProjectNotFound: "ErrProjectNotFound", + database.ErrClientNotFound: "ErrClientNotFound", + database.ErrDocumentNotFound: "ErrDocumentNotFound", + database.ErrUserNotFound: "ErrUserNotFound", + + database.ErrProjectAlreadyExists: "ErrProjectAlreadyExists", + database.ErrProjectNameAlreadyExists: "ErrProjectNameAlreadyExists", + database.ErrUserAlreadyExists: "ErrUserAlreadyExists", + + database.ErrClientNotActivated: "ErrClientNotActivated", + database.ErrDocumentNotAttached: "ErrDocumentNotAttached", + database.ErrDocumentAlreadyAttached: "ErrDocumentAlreadyAttached", + database.ErrDocumentAlreadyDetached: "ErrDocumentAlreadyDetached", + documents.ErrDocumentAttached: "ErrDocumentAttached", + packs.ErrInvalidServerSeq: "ErrInvalidServerSeq", + database.ErrConflictOnUpdate: "ErrConflictOnUpdate", + + converter.ErrUnsupportedOperation: "ErrUnsupportedOperation", + converter.ErrUnsupportedElement: "ErrUnsupportedElement", + converter.ErrUnsupportedEventType: "ErrUnsupportedEventType", + converter.ErrUnsupportedValueType: "ErrUnsupportedValueType", + converter.ErrUnsupportedCounterType: "ErrUnsupportedCounterType", + + auth.ErrNotAllowed: "ErrNotAllowed", + auth.ErrUnexpectedStatusCode: "ErrUnexpectedStatusCode", + auth.ErrWebhookTimeout: "ErrWebhookTimeout", + database.ErrMismatchedPassword: "ErrMismatchedPassword", +} + +// CodeOf returns the string representation of the given error. +func CodeOf(err error) string { + cause := err + for errors.Unwrap(cause) != nil { + cause = errors.Unwrap(cause) + } + + if code, ok := errorToCode[cause]; ok { + return code + } + + return "" +} + +// errorToConnectError returns connect.Error from the given error. +func errorToConnectError(err error) (*connect.Error, bool) { + cause := err + for errors.Unwrap(cause) != nil { + cause = errors.Unwrap(cause) + } + + connectCode, ok := errorToConnectCode[cause] + if !ok { + return nil, false + } + + connectErr := connect.NewError(connectCode, err) + if code, ok := errorToCode[cause]; ok { + errorInfo := &errdetails.ErrorInfo{ + Metadata: map[string]string{"code": code}, + } + if detail, detailErr := connect.NewErrorDetail(errorInfo); detailErr == nil { + connectErr.AddDetail(detail) + } + } + + return connectErr, true +} + +// structErrorToConnectError returns connect.Error from the given struct error. +func structErrorToConnectError(err error) (*connect.Error, bool) { + var invalidFieldsError *validation.StructError + if !errors.As(err, &invalidFieldsError) { + return nil, false + } + + connectErr := connect.NewError(connect.CodeInvalidArgument, err) + badRequest, ok := badRequestFromError(err) if !ok { + return connectErr, true + } + if detail, err := connect.NewErrorDetail(badRequest); err == nil { + connectErr.AddDetail(detail) + } + + return connectErr, true +} + +func badRequestFromError(err error) (*errdetails.BadRequest, bool) { + var invalidFieldsError *validation.StructError + if !errors.As(err, &invalidFieldsError) { return nil, false } @@ -105,38 +207,23 @@ func detailsFromError(err error) (*errdetails.BadRequest, bool) { return br, true } -// ToStatusError returns a connect.Error from the given logic error. If an error +// ToStatusError returns connect.Error from the given logic error. If an error // occurs while executing logic in API handler, connectRPC connect.error should be // returned so that the client can know more about the status of the request. func ToStatusError(err error) error { - cause := err - for errors.Unwrap(cause) != nil { - cause = errors.Unwrap(cause) - } - if code, ok := errorToCode[cause]; ok { - return connect.NewError(code, err) + if err == nil { + return nil } - // NOTE(hackerwins): InvalidFieldsError has details of invalid fields in - // the error message. - var invalidFieldsError *validation.StructError - if errors.As(err, &invalidFieldsError) { - st := connect.NewError(connect.CodeInvalidArgument, err) - details, ok := detailsFromError(err) - if !ok { - return st - } - if detail, err := connect.NewErrorDetail(details); err == nil { - st.AddDetail(detail) - } - return st + if err, ok := errorToConnectError(err); ok { + return err } - if err := connect.NewError(connect.CodeInternal, err); err != nil { - return fmt.Errorf("create status error: %w", err) + if err, ok := structErrorToConnectError(err); ok { + return err } - return nil + return connect.NewError(connect.CodeInternal, err) } // ToRPCCodeString returns a string representation of the given error. @@ -149,7 +236,7 @@ func ToRPCCodeString(err error) string { for errors.Unwrap(cause) != nil { cause = errors.Unwrap(cause) } - if code, ok := errorToCode[cause]; ok { + if code, ok := errorToConnectCode[cause]; ok { return code.String() } diff --git a/server/rpc/interceptors/admin_auth.go b/server/rpc/interceptors/admin.go similarity index 69% rename from server/rpc/interceptors/admin_auth.go rename to server/rpc/interceptors/admin.go index 39ee85119..1f6ab5373 100644 --- a/server/rpc/interceptors/admin_auth.go +++ b/server/rpc/interceptors/admin.go @@ -26,6 +26,7 @@ import ( "github.com/yorkie-team/yorkie/api/types" "github.com/yorkie-team/yorkie/server/backend" + "github.com/yorkie-team/yorkie/server/logging" "github.com/yorkie-team/yorkie/server/projects" "github.com/yorkie-team/yorkie/server/rpc/auth" "github.com/yorkie-team/yorkie/server/rpc/connecthelper" @@ -35,22 +36,34 @@ import ( // ErrUnauthenticated is returned when authentication is failed. var ErrUnauthenticated = errors.New("authorization is not provided") -// AdminAuthInterceptor is an interceptor for authentication. -type AdminAuthInterceptor struct { +func isAdminService(method string) bool { + return strings.HasPrefix(method, "/yorkie.v1.AdminService") +} + +func isRequiredAuth(method string) bool { + return method != "/yorkie.v1.AdminService/LogIn" && + method != "/yorkie.v1.AdminService/SignUp" +} + +// AdminServiceInterceptor is an interceptor for building additional context +// and handling authentication for AdminService. +type AdminServiceInterceptor struct { backend *backend.Backend + requestID *requestID tokenManager *auth.TokenManager } -// NewAdminAuthInterceptor creates a new instance of AdminAuthInterceptor. -func NewAdminAuthInterceptor(be *backend.Backend, tokenManager *auth.TokenManager) *AdminAuthInterceptor { - return &AdminAuthInterceptor{ +// NewAdminServiceInterceptor creates a new instance of AdminServiceInterceptor. +func NewAdminServiceInterceptor(be *backend.Backend, tokenManager *auth.TokenManager) *AdminServiceInterceptor { + return &AdminServiceInterceptor{ backend: be, + requestID: newRequestID("a"), tokenManager: tokenManager, } } // WrapUnary creates a unary server interceptor for authentication. -func (i *AdminAuthInterceptor) WrapUnary(next connect.UnaryFunc) connect.UnaryFunc { +func (i *AdminServiceInterceptor) WrapUnary(next connect.UnaryFunc) connect.UnaryFunc { return func( ctx context.Context, req connect.AnyRequest, @@ -59,12 +72,9 @@ func (i *AdminAuthInterceptor) WrapUnary(next connect.UnaryFunc) connect.UnaryFu return next(ctx, req) } - if isRequiredAuth(req.Spec().Procedure) { - user, err := i.authenticate(ctx, req.Header()) - if err != nil { - return nil, err - } - ctx = users.With(ctx, user) + ctx, err := i.buildContext(ctx, req.Spec().Procedure, req.Header()) + if err != nil { + return nil, err } res, err := next(ctx, req) @@ -92,7 +102,7 @@ func (i *AdminAuthInterceptor) WrapUnary(next connect.UnaryFunc) connect.UnaryFu } // WrapStreamingClient creates a stream client interceptor for authentication. -func (i *AdminAuthInterceptor) WrapStreamingClient(next connect.StreamingClientFunc) connect.StreamingClientFunc { +func (i *AdminServiceInterceptor) WrapStreamingClient(next connect.StreamingClientFunc) connect.StreamingClientFunc { return func( ctx context.Context, spec connect.Spec, @@ -102,7 +112,7 @@ func (i *AdminAuthInterceptor) WrapStreamingClient(next connect.StreamingClientF } // WrapStreamingHandler creates a stream server interceptor for authentication. -func (i *AdminAuthInterceptor) WrapStreamingHandler(next connect.StreamingHandlerFunc) connect.StreamingHandlerFunc { +func (i *AdminServiceInterceptor) WrapStreamingHandler(next connect.StreamingHandlerFunc) connect.StreamingHandlerFunc { return func( ctx context.Context, conn connect.StreamingHandlerConn, @@ -111,15 +121,12 @@ func (i *AdminAuthInterceptor) WrapStreamingHandler(next connect.StreamingHandle return next(ctx, conn) } - if isRequiredAuth(conn.Spec().Procedure) { - user, err := i.authenticate(ctx, conn.RequestHeader()) - if err != nil { - return err - } - ctx = users.With(ctx, user) + ctx, err := i.buildContext(ctx, conn.Spec().Procedure, conn.RequestHeader()) + if err != nil { + return err } - err := next(ctx, conn) + err = next(ctx, conn) // TODO(hackerwins, emplam27): Consider splitting between admin and sdk metrics. sdkType, sdkVersion := connecthelper.SDKTypeAndVersion(conn.RequestHeader()) @@ -143,17 +150,27 @@ func (i *AdminAuthInterceptor) WrapStreamingHandler(next connect.StreamingHandle } } -func isAdminService(method string) bool { - return strings.HasPrefix(method, "/yorkie.v1.AdminService") -} +// buildContext builds a new context with the given request header. +func (i *AdminServiceInterceptor) buildContext( + ctx context.Context, + procedure string, + header http.Header, +) (context.Context, error) { + if isRequiredAuth(procedure) { + user, err := i.authenticate(ctx, header) + if err != nil { + return nil, err + } + ctx = users.With(ctx, user) + } -func isRequiredAuth(method string) bool { - return method != "/yorkie.v1.AdminService/LogIn" && - method != "/yorkie.v1.AdminService/SignUp" + ctx = logging.With(ctx, logging.New(i.requestID.next())) + + return ctx, nil } // authenticate does authenticate the request. -func (i *AdminAuthInterceptor) authenticate( +func (i *AdminServiceInterceptor) authenticate( ctx context.Context, header http.Header, ) (*types.User, error) { @@ -163,6 +180,7 @@ func (i *AdminAuthInterceptor) authenticate( } // NOTE(raararaara): If the token is access token, return the user of the token. + // This is used for the case where the user uses dashboard or CLI. claims, err := i.tokenManager.Verify(authorization) if err == nil { user, err := users.GetUserByName(ctx, i.backend, claims.Username) @@ -172,6 +190,9 @@ func (i *AdminAuthInterceptor) authenticate( } // NOTE(raararaara): If the token is secret key, return the owner of the project. + // This is used for the case where the user uses REST API. + // TODO(hackerwins): In this case, attacker can hijack the project owner's identity. + // We need to separate project-wide API and user-wide API from AdminService. project, err := projects.GetProjectFromSecretKey(ctx, i.backend, authorization) if err == nil { user, err := users.GetUserByID(ctx, i.backend, project.Owner) diff --git a/server/rpc/interceptors/default.go b/server/rpc/interceptors/default.go index acdfe8c4a..674c40296 100644 --- a/server/rpc/interceptors/default.go +++ b/server/rpc/interceptors/default.go @@ -23,12 +23,11 @@ import ( "connectrpc.com/connect" - "github.com/yorkie-team/yorkie/server/rpc/connecthelper" - "github.com/yorkie-team/yorkie/server/logging" + "github.com/yorkie-team/yorkie/server/rpc/connecthelper" ) -// DefaultInterceptor is a interceptor for default. +// DefaultInterceptor is an interceptor for common RPC. type DefaultInterceptor struct{} // NewDefaultInterceptor creates a new instance of DefaultInterceptor. diff --git a/server/rpc/interceptors/requestid.go b/server/rpc/interceptors/requestid.go new file mode 100644 index 000000000..f43068340 --- /dev/null +++ b/server/rpc/interceptors/requestid.go @@ -0,0 +1,42 @@ +/* + * Copyright 2022 The Yorkie Authors. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package interceptors + +import ( + "strconv" + "sync/atomic" +) + +// requestID is used to generate a unique request ID. +type requestID struct { + prefix string + id int32 +} + +// newRequestID creates a new requestID. +func newRequestID(prefix string) *requestID { + return &requestID{ + prefix: prefix, + id: 0, + } +} + +// next generates a new request ID. +func (r *requestID) next() string { + next := atomic.AddInt32(&r.id, 1) + return r.prefix + strconv.Itoa(int(next)) +} diff --git a/server/rpc/interceptors/context.go b/server/rpc/interceptors/yorkie.go similarity index 76% rename from server/rpc/interceptors/context.go rename to server/rpc/interceptors/yorkie.go index 076b15a55..5a29812fc 100644 --- a/server/rpc/interceptors/context.go +++ b/server/rpc/interceptors/yorkie.go @@ -35,26 +35,33 @@ import ( "github.com/yorkie-team/yorkie/server/rpc/metadata" ) -// ContextInterceptor is an interceptor for building additional context. -type ContextInterceptor struct { +func isYorkieService(method string) bool { + return strings.HasPrefix(method, "/yorkie.v1.YorkieService/") +} + +// YorkieServiceInterceptor is an interceptor for building additional context +// and handling authentication for YorkieService. +type YorkieServiceInterceptor struct { backend *backend.Backend + requestID *requestID projectInfoCache *cache.LRUExpireCache[string, *types.Project] } -// NewContextInterceptor creates a new instance of ContextInterceptor. -func NewContextInterceptor(be *backend.Backend) *ContextInterceptor { +// NewYorkieServiceInterceptor creates a new instance of YorkieServiceInterceptor. +func NewYorkieServiceInterceptor(be *backend.Backend) *YorkieServiceInterceptor { projectInfoCache, err := cache.NewLRUExpireCache[string, *types.Project](be.Config.ProjectInfoCacheSize) if err != nil { logging.DefaultLogger().Fatal("Failed to create project info cache: %v", err) } - return &ContextInterceptor{ + return &YorkieServiceInterceptor{ backend: be, + requestID: newRequestID("r"), projectInfoCache: projectInfoCache, } } // WrapUnary creates a unary server interceptor for building additional context. -func (i *ContextInterceptor) WrapUnary(next connect.UnaryFunc) connect.UnaryFunc { +func (i *YorkieServiceInterceptor) WrapUnary(next connect.UnaryFunc) connect.UnaryFunc { return func( ctx context.Context, req connect.AnyRequest, @@ -93,7 +100,7 @@ func (i *ContextInterceptor) WrapUnary(next connect.UnaryFunc) connect.UnaryFunc } // WrapStreamingClient creates a stream client interceptor for building additional context. -func (i *ContextInterceptor) WrapStreamingClient(next connect.StreamingClientFunc) connect.StreamingClientFunc { +func (i *YorkieServiceInterceptor) WrapStreamingClient(next connect.StreamingClientFunc) connect.StreamingClientFunc { return func( ctx context.Context, spec connect.Spec, @@ -103,7 +110,9 @@ func (i *ContextInterceptor) WrapStreamingClient(next connect.StreamingClientFun } // WrapStreamingHandler creates a stream server interceptor for building additional context. -func (i *ContextInterceptor) WrapStreamingHandler(next connect.StreamingHandlerFunc) connect.StreamingHandlerFunc { +func (i *YorkieServiceInterceptor) WrapStreamingHandler( + next connect.StreamingHandlerFunc, +) connect.StreamingHandlerFunc { return func( ctx context.Context, conn connect.StreamingHandlerConn, @@ -141,13 +150,9 @@ func (i *ContextInterceptor) WrapStreamingHandler(next connect.StreamingHandlerF } } -func isYorkieService(method string) bool { - return strings.HasPrefix(method, "/yorkie.v1.YorkieService/") -} - // buildContext builds a context data for RPC. It includes the metadata of the // request and the project information. -func (i *ContextInterceptor) buildContext(ctx context.Context, header http.Header) (context.Context, error) { +func (i *YorkieServiceInterceptor) buildContext(ctx context.Context, header http.Header) (context.Context, error) { // 01. building metadata md := metadata.Metadata{} @@ -166,16 +171,18 @@ func (i *ContextInterceptor) buildContext(ctx context.Context, header http.Heade cacheKey := md.APIKey // 02. building project - if cachedProjectInfo, ok := i.projectInfoCache.Get(cacheKey); ok { - ctx = projects.With(ctx, cachedProjectInfo) - } else { - project, err := projects.GetProjectFromAPIKey(ctx, i.backend, md.APIKey) + if _, ok := i.projectInfoCache.Get(cacheKey); !ok { + prj, err := projects.GetProjectFromAPIKey(ctx, i.backend, md.APIKey) if err != nil { return nil, connecthelper.ToStatusError(err) } - i.projectInfoCache.Add(cacheKey, project, i.backend.Config.ParseProjectInfoCacheTTL()) - ctx = projects.With(ctx, project) + i.projectInfoCache.Add(cacheKey, prj, i.backend.Config.ParseProjectInfoCacheTTL()) } + project, _ := i.projectInfoCache.Get(cacheKey) + ctx = projects.With(ctx, project) + + // 03. building logger + ctx = logging.With(ctx, logging.New(i.requestID.next(), logging.NewField("prj", project.Name))) return ctx, nil } diff --git a/server/rpc/server.go b/server/rpc/server.go index e3977853b..85f57b521 100644 --- a/server/rpc/server.go +++ b/server/rpc/server.go @@ -36,7 +36,6 @@ import ( "github.com/yorkie-team/yorkie/server/backend" "github.com/yorkie-team/yorkie/server/logging" "github.com/yorkie-team/yorkie/server/rpc/auth" - "github.com/yorkie-team/yorkie/server/rpc/connecthelper" "github.com/yorkie-team/yorkie/server/rpc/interceptors" ) @@ -57,9 +56,8 @@ func NewServer(conf *Config, be *backend.Backend) (*Server, error) { opts := []connect.HandlerOption{ connect.WithInterceptors( - connecthelper.NewLoggingInterceptor(), - interceptors.NewAdminAuthInterceptor(be, tokenManager), - interceptors.NewContextInterceptor(be), + interceptors.NewAdminServiceInterceptor(be, tokenManager), + interceptors.NewYorkieServiceInterceptor(be), interceptors.NewDefaultInterceptor(), ), } diff --git a/server/rpc/server_test.go b/server/rpc/server_test.go index 9b8b4dd64..57f234d04 100644 --- a/server/rpc/server_test.go +++ b/server/rpc/server_test.go @@ -70,6 +70,7 @@ func TestMain(m *testing.M) { be, err := backend.New(&backend.Config{ AdminUser: helper.AdminUser, AdminPassword: helper.AdminPassword, + UseDefaultProject: helper.UseDefaultProject, ClientDeactivateThreshold: helper.ClientDeactivateThreshold, SnapshotThreshold: helper.SnapshotThreshold, AuthWebhookCacheSize: helper.AuthWebhookSize, @@ -108,9 +109,12 @@ func TestMain(m *testing.M) { log.Fatal(err) } - if err := testRPCServer.Start(); err != nil { + if err = testRPCServer.Start(); err != nil { log.Fatalf("failed rpc listen: %s\n", err) } + if err = helper.WaitForServerToStart(testRPCAddr); err != nil { + log.Fatal(err) + } authInterceptor := client.NewAuthInterceptor(project.PublicKey, "") diff --git a/server/rpc/testcases/testcases.go b/server/rpc/testcases/testcases.go index c3712784b..3094ae7dd 100644 --- a/server/rpc/testcases/testcases.go +++ b/server/rpc/testcases/testcases.go @@ -27,8 +27,13 @@ import ( "google.golang.org/protobuf/types/known/wrapperspb" "github.com/yorkie-team/yorkie/admin" + "github.com/yorkie-team/yorkie/api/converter" api "github.com/yorkie-team/yorkie/api/yorkie/v1" "github.com/yorkie-team/yorkie/api/yorkie/v1/v1connect" + "github.com/yorkie-team/yorkie/pkg/document/time" + "github.com/yorkie-team/yorkie/server/backend/database" + "github.com/yorkie-team/yorkie/server/clients" + "github.com/yorkie-team/yorkie/server/rpc/connecthelper" "github.com/yorkie-team/yorkie/test/helper" ) @@ -66,17 +71,20 @@ func RunActivateAndDeactivateClientTest( context.Background(), connect.NewRequest(&api.ActivateClientRequest{ClientKey: ""})) assert.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(clients.ErrInvalidClientKey), converter.ErrorCodeOf(err)) _, err = testClient.DeactivateClient( context.Background(), connect.NewRequest(&api.DeactivateClientRequest{ClientId: emptyClientID})) assert.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(time.ErrInvalidHexString), converter.ErrorCodeOf(err)) // client not found _, err = testClient.DeactivateClient( context.Background(), connect.NewRequest(&api.DeactivateClientRequest{ClientId: nilClientID})) assert.Equal(t, connect.CodeNotFound, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrClientNotFound), converter.ErrorCodeOf(err)) } // RunAttachAndDetachDocumentTest runs the AttachDocument and DetachDocument test. @@ -112,6 +120,7 @@ func RunAttachAndDetachDocumentTest( }, )) assert.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(time.ErrInvalidHexString), converter.ErrorCodeOf(err)) // try to attach with invalid client _, err = testClient.AttachDocument( @@ -122,6 +131,7 @@ func RunAttachAndDetachDocumentTest( }, )) assert.Equal(t, connect.CodeNotFound, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrClientNotFound), converter.ErrorCodeOf(err)) // try to attach already attached document _, err = testClient.AttachDocument( @@ -132,6 +142,7 @@ func RunAttachAndDetachDocumentTest( }, )) assert.Equal(t, connect.CodeFailedPrecondition, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrDocumentAlreadyAttached), converter.ErrorCodeOf(err)) // try to attach invalid change pack _, err = testClient.AttachDocument( @@ -142,6 +153,7 @@ func RunAttachAndDetachDocumentTest( }, )) assert.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(converter.ErrCheckpointRequired), converter.ErrorCodeOf(err)) _, err = testClient.DetachDocument( context.Background(), @@ -163,6 +175,7 @@ func RunAttachAndDetachDocumentTest( }, )) assert.Equal(t, connect.CodeFailedPrecondition, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrDocumentNotAttached), converter.ErrorCodeOf(err)) _, err = testClient.DetachDocument( context.Background(), @@ -172,6 +185,7 @@ func RunAttachAndDetachDocumentTest( }, )) assert.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(converter.ErrCheckpointRequired), converter.ErrorCodeOf(err)) // document not found _, err = testClient.DetachDocument( @@ -185,6 +199,7 @@ func RunAttachAndDetachDocumentTest( }, )) assert.Equal(t, connect.CodeNotFound, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrDocumentNotFound), converter.ErrorCodeOf(err)) _, err = testClient.DeactivateClient( context.Background(), @@ -200,6 +215,7 @@ func RunAttachAndDetachDocumentTest( }, )) assert.Equal(t, connect.CodeFailedPrecondition, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrClientNotActivated), converter.ErrorCodeOf(err)) } // RunAttachAndDetachRemovedDocumentTest runs the AttachDocument and DetachDocument test on a removed document. @@ -253,6 +269,7 @@ func RunAttachAndDetachRemovedDocumentTest( }, )) assert.Equal(t, connect.CodeFailedPrecondition, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrDocumentNotAttached), converter.ErrorCodeOf(err)) // try to create new document with same key as removed document resPack, err = testClient.AttachDocument( @@ -360,6 +377,7 @@ func RunPushPullChangeTest( }, )) assert.Equal(t, connect.CodeFailedPrecondition, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrDocumentNotAttached), converter.ErrorCodeOf(err)) // try to push/pull with invalid pack _, err = testClient.PushPullChanges( @@ -371,6 +389,7 @@ func RunPushPullChangeTest( }, )) assert.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(converter.ErrCheckpointRequired), converter.ErrorCodeOf(err)) _, err = testClient.DeactivateClient( context.Background(), @@ -387,6 +406,7 @@ func RunPushPullChangeTest( }, )) assert.Equal(t, connect.CodeFailedPrecondition, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrClientNotActivated), converter.ErrorCodeOf(err)) } // RunPushPullChangeOnRemovedDocumentTest runs the PushChange and PullChange test on a removed document. @@ -439,6 +459,7 @@ func RunPushPullChangeOnRemovedDocumentTest( }, )) assert.Equal(t, connect.CodeFailedPrecondition, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrDocumentNotAttached), converter.ErrorCodeOf(err)) } // RunRemoveDocumentTest runs the RemoveDocument test. @@ -491,6 +512,7 @@ func RunRemoveDocumentTest( }, )) assert.Equal(t, connect.CodeFailedPrecondition, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrDocumentNotAttached), converter.ErrorCodeOf(err)) } // RunRemoveDocumentWithInvalidClientStateTest runs the RemoveDocument test with an invalid client state. @@ -543,6 +565,7 @@ func RunRemoveDocumentWithInvalidClientStateTest( }, )) assert.Equal(t, connect.CodeFailedPrecondition, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrDocumentNotAttached), converter.ErrorCodeOf(err)) _, err = testClient.DeactivateClient( context.Background(), @@ -559,6 +582,7 @@ func RunRemoveDocumentWithInvalidClientStateTest( }, )) assert.Equal(t, connect.CodeFailedPrecondition, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrClientNotActivated), converter.ErrorCodeOf(err)) } // RunWatchDocumentTest runs the WatchDocument test. @@ -640,6 +664,7 @@ func RunAdminSignUpTest( }, )) assert.Equal(t, connect.CodeAlreadyExists, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrUserAlreadyExists), converter.ErrorCodeOf(err)) } // RunAdminLoginTest runs the Admin Login test. @@ -665,6 +690,7 @@ func RunAdminLoginTest( }, )) assert.Equal(t, connect.CodeUnauthenticated, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrMismatchedPassword), converter.ErrorCodeOf(err)) } // RunAdminCreateProjectTest runs the CreateProject test in admin. @@ -702,6 +728,7 @@ func RunAdminCreateProjectTest( }, )) assert.Equal(t, connect.CodeAlreadyExists, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrProjectAlreadyExists), converter.ErrorCodeOf(err)) } // RunAdminListProjectsTest runs the ListProjects test in admin. @@ -778,6 +805,7 @@ func RunAdminGetProjectTest( }, )) assert.Equal(t, connect.CodeNotFound, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrProjectNotFound), converter.ErrorCodeOf(err)) } // RunAdminUpdateProjectTest runs the UpdateProject test in admin. @@ -864,6 +892,7 @@ func RunAdminListDocumentsTest( }, )) assert.Equal(t, connect.CodeNotFound, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrProjectNotFound), converter.ErrorCodeOf(err)) } // RunAdminGetDocumentTest runs the GetDocument test in admin. @@ -923,6 +952,7 @@ func RunAdminGetDocumentTest( }, )) assert.Equal(t, connect.CodeNotFound, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrDocumentNotFound), converter.ErrorCodeOf(err)) } // RunAdminListChangesTest runs the ListChanges test in admin. @@ -979,7 +1009,8 @@ func RunAdminListChangesTest( connect.NewRequest(&api.ListChangesRequest{ ProjectName: defaultProjectName, DocumentKey: invalidChangePack.DocumentKey, - }, - )) + }), + ) assert.Equal(t, connect.CodeNotFound, connect.CodeOf(err)) + assert.Equal(t, connecthelper.CodeOf(database.ErrDocumentNotFound), converter.ErrorCodeOf(err)) } diff --git a/server/rpc/yorkie_server.go b/server/rpc/yorkie_server.go index c2a47310e..22f5ee995 100644 --- a/server/rpc/yorkie_server.go +++ b/server/rpc/yorkie_server.go @@ -25,6 +25,7 @@ import ( "github.com/yorkie-team/yorkie/api/converter" "github.com/yorkie-team/yorkie/api/types" api "github.com/yorkie-team/yorkie/api/yorkie/v1" + "github.com/yorkie-team/yorkie/pkg/document" "github.com/yorkie-team/yorkie/pkg/document/key" "github.com/yorkie-team/yorkie/pkg/document/time" "github.com/yorkie-team/yorkie/server/backend" @@ -144,7 +145,7 @@ func (s *yorkieServer) AttachDocument( } }() - clientInfo, err := clients.FindClientInfo(ctx, s.backend.DB, types.ClientRefKey{ + clientInfo, err := clients.FindActiveClientInfo(ctx, s.backend.DB, types.ClientRefKey{ ProjectID: project.ID, ClientID: types.IDFromActorID(actorID), }) @@ -156,11 +157,14 @@ func (s *yorkieServer) AttachDocument( return nil, err } - if err := clientInfo.AttachDocument(docInfo.ID); err != nil { + if err := clientInfo.AttachDocument(docInfo.ID, pack.IsAttached()); err != nil { return nil, err } - pulled, err := packs.PushPull(ctx, s.backend, project, clientInfo, docInfo, pack, types.SyncModePushPull) + pulled, err := packs.PushPull(ctx, s.backend, project, clientInfo, docInfo, pack, packs.PushPullOptions{ + Mode: types.SyncModePushPull, + Status: document.StatusAttached, + }) if err != nil { return nil, err } @@ -217,7 +221,7 @@ func (s *yorkieServer) DetachDocument( } }() - clientInfo, err := clients.FindClientInfo(ctx, s.backend.DB, types.ClientRefKey{ + clientInfo, err := clients.FindActiveClientInfo(ctx, s.backend.DB, types.ClientRefKey{ ProjectID: project.ID, ClientID: types.IDFromActorID(actorID), }) @@ -243,18 +247,18 @@ func (s *yorkieServer) DetachDocument( return nil, err } + var status document.StatusType if req.Msg.RemoveIfNotAttached && !isAttached { pack.IsRemoved = true - if err := clientInfo.RemoveDocument(docInfo.ID); err != nil { - return nil, err - } + status = document.StatusRemoved } else { - if err := clientInfo.DetachDocument(docInfo.ID); err != nil { - return nil, err - } + status = document.StatusDetached } - pulled, err := packs.PushPull(ctx, s.backend, project, clientInfo, docInfo, pack, types.SyncModePushPull) + pulled, err := packs.PushPull(ctx, s.backend, project, clientInfo, docInfo, pack, packs.PushPullOptions{ + Mode: types.SyncModePushPull, + Status: status, + }) if err != nil { return nil, err } @@ -316,12 +320,7 @@ func (s *yorkieServer) PushPullChanges( }() } - syncMode := types.SyncModePushPull - if req.Msg.PushOnly { - syncMode = types.SyncModePushOnly - } - - clientInfo, err := clients.FindClientInfo(ctx, s.backend.DB, types.ClientRefKey{ + clientInfo, err := clients.FindActiveClientInfo(ctx, s.backend.DB, types.ClientRefKey{ ProjectID: project.ID, ClientID: types.IDFromActorID(actorID), }) @@ -342,7 +341,15 @@ func (s *yorkieServer) PushPullChanges( return nil, err } - pulled, err := packs.PushPull(ctx, s.backend, project, clientInfo, docInfo, pack, syncMode) + syncMode := types.SyncModePushPull + if req.Msg.PushOnly { + syncMode = types.SyncModePushOnly + } + + pulled, err := packs.PushPull(ctx, s.backend, project, clientInfo, docInfo, pack, packs.PushPullOptions{ + Mode: syncMode, + Status: document.StatusAttached, + }) if err != nil { return nil, err } @@ -379,6 +386,13 @@ func (s *yorkieServer) WatchDocument( DocID: docID, } + if _, err = clients.FindActiveClientInfo(ctx, s.backend.DB, types.ClientRefKey{ + ProjectID: project.ID, + ClientID: types.IDFromActorID(clientID), + }); err != nil { + return err + } + docInfo, err := documents.FindDocInfoByRefKey( ctx, s.backend, @@ -395,13 +409,6 @@ func (s *yorkieServer) WatchDocument( return err } - if _, err = clients.FindClientInfo(ctx, s.backend.DB, types.ClientRefKey{ - ProjectID: project.ID, - ClientID: types.IDFromActorID(clientID), - }); err != nil { - return err - } - locker, err := s.backend.Coordinator.NewLocker( ctx, sync.NewKey(fmt.Sprintf("watchdoc-%s-%s", clientID, docID)), @@ -514,7 +521,7 @@ func (s *yorkieServer) RemoveDocument( }() } - clientInfo, err := clients.FindClientInfo(ctx, s.backend.DB, types.ClientRefKey{ + clientInfo, err := clients.FindActiveClientInfo(ctx, s.backend.DB, types.ClientRefKey{ ProjectID: project.ID, ClientID: types.IDFromActorID(actorID), }) @@ -531,11 +538,10 @@ func (s *yorkieServer) RemoveDocument( return nil, err } - if err := clientInfo.RemoveDocument(docInfo.ID); err != nil { - return nil, err - } - - pulled, err := packs.PushPull(ctx, s.backend, project, clientInfo, docInfo, pack, types.SyncModePushPull) + pulled, err := packs.PushPull(ctx, s.backend, project, clientInfo, docInfo, pack, packs.PushPullOptions{ + Mode: types.SyncModePushPull, + Status: document.StatusRemoved, + }) if err != nil { return nil, err } @@ -627,7 +633,7 @@ func (s *yorkieServer) Broadcast( return nil, err } - if _, err = clients.FindClientInfo(ctx, s.backend.DB, types.ClientRefKey{ + if _, err = clients.FindActiveClientInfo(ctx, s.backend.DB, types.ClientRefKey{ ProjectID: project.ID, ClientID: types.IDFromActorID(clientID), }); err != nil { diff --git a/server/server.go b/server/server.go index 6b5280094..6a777f5d5 100644 --- a/server/server.go +++ b/server/server.go @@ -20,11 +20,17 @@ package server import ( + "context" gosync "sync" + "github.com/yorkie-team/yorkie/api/types" + "github.com/yorkie-team/yorkie/client" "github.com/yorkie-team/yorkie/server/backend" + "github.com/yorkie-team/yorkie/server/backend/database" + "github.com/yorkie-team/yorkie/server/clients" "github.com/yorkie-team/yorkie/server/profiling" "github.com/yorkie-team/yorkie/server/profiling/prometheus" + "github.com/yorkie-team/yorkie/server/projects" "github.com/yorkie-team/yorkie/server/rpc" ) @@ -88,6 +94,14 @@ func (r *Yorkie) Start() error { r.lock.Lock() defer r.lock.Unlock() + if err := r.RegisterHousekeepingTasks(r.backend); err != nil { + return err + } + + if err := r.backend.Start(); err != nil { + return err + } + if r.profilingServer != nil { err := r.profilingServer.Start() if err != nil { @@ -128,3 +142,57 @@ func (r *Yorkie) ShutdownCh() <-chan struct{} { func (r *Yorkie) RPCAddr() string { return r.conf.RPCAddr() } + +// DeactivateClient deactivates the given client. It is used for testing. +func (r *Yorkie) DeactivateClient(ctx context.Context, c1 *client.Client) error { + project, err := r.DefaultProject(ctx) + if err != nil { + return err + } + + _, err = clients.Deactivate(ctx, r.backend.DB, types.ClientRefKey{ + ProjectID: project.ID, + ClientID: types.IDFromActorID(c1.ID()), + }) + return err +} + +// RegisterHousekeepingTasks registers housekeeping tasks. +func (r *Yorkie) RegisterHousekeepingTasks(be *backend.Backend) error { + interval, err := be.Housekeeping.Config.ParseInterval() + if err != nil { + return err + } + + housekeepingLastProjectID := database.DefaultProjectID + return be.Housekeeping.RegisterTask(interval, func(ctx context.Context) error { + lastProjectID, err := clients.DeactivateInactives( + ctx, + be, + be.Housekeeping.Config.CandidatesLimitPerProject, + be.Housekeeping.Config.ProjectFetchSize, + housekeepingLastProjectID, + ) + if err != nil { + return err + } + + housekeepingLastProjectID = lastProjectID + return nil + }) +} + +// DefaultProject returns the default project. +func (r *Yorkie) DefaultProject(ctx context.Context) (*types.Project, error) { + return projects.GetProjectFromAPIKey(ctx, r.backend, "") +} + +// CreateProject creates a project with the given name. +func (r *Yorkie) CreateProject(ctx context.Context, name string) (*types.Project, error) { + project, err := r.DefaultProject(ctx) + if err != nil { + return nil, err + } + + return projects.CreateProject(ctx, r.backend, project.Owner, name) +} diff --git a/test/bench/grpc_bench_test.go b/test/bench/grpc_bench_test.go index 39bb924ca..55107eb6f 100644 --- a/test/bench/grpc_bench_test.go +++ b/test/bench/grpc_bench_test.go @@ -221,9 +221,9 @@ func BenchmarkRPC(b *testing.B) { }) assert.NoError(b, err) - rch1, err := c1.Watch(ctx, d1) + rch1, _, err := c1.Subscribe(d1) assert.NoError(b, err) - rch2, err := c2.Watch(ctx, d2) + rch2, _, err := c2.Subscribe(d2) assert.NoError(b, err) done1 := make(chan bool) diff --git a/test/bench/push_pull_bench_test.go b/test/bench/push_pull_bench_test.go index b6d981037..ca6fff1bb 100644 --- a/test/bench/push_pull_bench_test.go +++ b/test/bench/push_pull_bench_test.go @@ -90,7 +90,7 @@ func setUpClientsAndDocs( assert.NoError(b, err) docInfo, err := be.DB.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), docKey, true) assert.NoError(b, err) - assert.NoError(b, clientInfo.AttachDocument(docInfo.ID)) + assert.NoError(b, clientInfo.AttachDocument(docInfo.ID, false)) assert.NoError(b, be.DB.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) bytesID, _ := clientInfo.ID.Bytes() @@ -144,7 +144,10 @@ func benchmarkPushChanges( assert.NoError(b, err) b.StartTimer() - _, err = packs.PushPull(ctx, be, project, clientInfos[0], docInfo, pack, types.SyncModePushPull) + _, err = packs.PushPull(ctx, be, project, clientInfos[0], docInfo, pack, packs.PushPullOptions{ + Mode: types.SyncModePushPull, + Status: document.StatusAttached, + }) assert.NoError(b, err) } } @@ -171,14 +174,20 @@ func benchmarkPullChanges( } docInfo, err := documents.FindDocInfoByRefKey(ctx, be, docRefKey) assert.NoError(b, err) - _, err = packs.PushPull(ctx, be, project, pusherClientInfo, docInfo, pushPack, types.SyncModePushPull) + _, err = packs.PushPull(ctx, be, project, pusherClientInfo, docInfo, pushPack, packs.PushPullOptions{ + Mode: types.SyncModePushPull, + Status: document.StatusAttached, + }) assert.NoError(b, err) docInfo, err = documents.FindDocInfoByRefKey(ctx, be, docRefKey) assert.NoError(b, err) b.StartTimer() - _, err = packs.PushPull(ctx, be, project, pullerClientInfo, docInfo, pullPack, types.SyncModePushPull) + _, err = packs.PushPull(ctx, be, project, pullerClientInfo, docInfo, pullPack, packs.PushPullOptions{ + Mode: types.SyncModePushPull, + Status: document.StatusAttached, + }) assert.NoError(b, err) } } @@ -208,7 +217,10 @@ func benchmarkPushSnapshots( assert.NoError(b, err) b.StartTimer() - pulled, err := packs.PushPull(ctx, be, project, clientInfos[0], docInfo, pushPack, types.SyncModePushPull) + pulled, err := packs.PushPull(ctx, be, project, clientInfos[0], docInfo, pushPack, packs.PushPullOptions{ + Mode: types.SyncModePushPull, + Status: document.StatusAttached, + }) assert.NoError(b, err) b.StopTimer() @@ -244,14 +256,20 @@ func benchmarkPullSnapshot( } docInfo, err := documents.FindDocInfoByRefKey(ctx, be, docRefKey) assert.NoError(b, err) - _, err = packs.PushPull(ctx, be, project, pusherClientInfo, docInfo, pushPack, types.SyncModePushPull) + _, err = packs.PushPull(ctx, be, project, pusherClientInfo, docInfo, pushPack, packs.PushPullOptions{ + Mode: types.SyncModePushPull, + Status: document.StatusAttached, + }) assert.NoError(b, err) docInfo, err = documents.FindDocInfoByRefKey(ctx, be, docRefKey) assert.NoError(b, err) b.StartTimer() - _, err = packs.PushPull(ctx, be, project, pullerClientInfo, docInfo, pullPack, types.SyncModePushPull) + _, err = packs.PushPull(ctx, be, project, pullerClientInfo, docInfo, pullPack, packs.PushPullOptions{ + Mode: types.SyncModePushPull, + Status: document.StatusAttached, + }) assert.NoError(b, err) } } diff --git a/test/helper/helper.go b/test/helper/helper.go index 6b447f584..90688f9f1 100644 --- a/test/helper/helper.go +++ b/test/helper/helper.go @@ -21,6 +21,7 @@ import ( "context" "fmt" "log" + "net" "strings" "testing" gotime "time" @@ -33,6 +34,7 @@ import ( adminClient "github.com/yorkie-team/yorkie/admin" "github.com/yorkie-team/yorkie/api/types" + "github.com/yorkie-team/yorkie/client" "github.com/yorkie-team/yorkie/internal/validation" "github.com/yorkie-team/yorkie/pkg/document" "github.com/yorkie-team/yorkie/pkg/document/change" @@ -62,6 +64,7 @@ var ( AdminUser = server.DefaultAdminUser AdminPassword = server.DefaultAdminPassword + UseDefaultProject = true HousekeepingIntervalDeactivateCandidates = 10 * gotime.Second HousekeepingIntervalDeleteDocuments = 10 * gotime.Second HousekeepingDocumentHardDeletionGracefulPeriod = 0 * gotime.Second @@ -200,6 +203,28 @@ func BuildTreeNode(node *json.TreeNode) *crdt.TreeNode { return doc.Root().GetTree("test").Root() } +type treeNodePair struct { + node *crdt.TreeNode + parentID *crdt.TreeNodeID +} + +func createTreeNodePairs(node *crdt.TreeNode, parentID *crdt.TreeNodeID) []treeNodePair { + var pairs []treeNodePair + + pairs = append(pairs, treeNodePair{node, parentID}) + for _, child := range node.Index.Children(true) { + pairs = append(pairs, createTreeNodePairs(child.Value, node.ID())...) + } + return pairs +} + +// AssertEqualTreeNode asserts that the given TreeNodes are equal. +func AssertEqualTreeNode(t *testing.T, nodeA, nodeB *crdt.TreeNode) { + pairsA := createTreeNodePairs(nodeA, nil) + pairsB := createTreeNodePairs(nodeB, nil) + assert.Equal(t, pairsA, pairsB) +} + var portOffset = 0 // TestConfig returns config for creating Yorkie instance. @@ -256,8 +281,13 @@ func TestServer() *server.Yorkie { } // TestDocKey returns a new instance of document key for testing. -func TestDocKey(t testing.TB) key.Key { +func TestDocKey(t testing.TB, prefix ...int) key.Key { name := t.Name() + + if len(prefix) > 0 { + name = fmt.Sprintf("%d-%s", prefix[0], name) + } + if err := key.Key(name).Validate(); err == nil { return key.Key(name) } @@ -460,3 +490,54 @@ func CreateDummyClientWithID( return nil } + +// WaitForServerToStart waits for the server to start. +func WaitForServerToStart(addr string) error { + maxRetries := 10 + initialDelay := 100 * gotime.Millisecond + maxDelay := 5 * gotime.Second + + for attempt := 0; attempt < maxRetries; attempt++ { + // Exponential backoff calculation + delay := initialDelay * gotime.Duration(1< maxDelay { + delay = maxDelay + } + + conn, err := net.DialTimeout("tcp", addr, 1*gotime.Second) + if err != nil { + gotime.Sleep(delay) + continue + } + + err = conn.Close() + if err != nil { + return fmt.Errorf("close connection: %w", err) + } + + return nil + } + + return fmt.Errorf("timeout for server to start: %s", addr) +} + +// CreateProjectAndDocuments creates a new project and documents for the given count. +func CreateProjectAndDocuments(t *testing.T, server *server.Yorkie, count int) (*types.Project, []*document.Document) { + ctx := context.Background() + project, err := server.CreateProject(ctx, t.Name()) + assert.NoError(t, err) + + cli, err := client.Dial(server.RPCAddr(), client.WithAPIKey(project.PublicKey)) + assert.NoError(t, err) + assert.NoError(t, cli.Activate(ctx)) + + var docs []*document.Document + for i := 0; i < count; i++ { + doc := document.New(TestDocKey(t, i)) + assert.NoError(t, cli.Attach(ctx, doc)) + docs = append(docs, doc) + } + + return project, docs +} diff --git a/test/integration/admin_test.go b/test/integration/admin_test.go index b02fa8748..6d77773b8 100644 --- a/test/integration/admin_test.go +++ b/test/integration/admin_test.go @@ -83,15 +83,14 @@ func TestAdmin(t *testing.T) { t.Run("document event propagation on removal test", func(t *testing.T) { ctx := context.Background() - watchCtx, cancel := context.WithCancel(ctx) - defer cancel() // 01. c1 attaches and watches d1. d1 := document.New(helper.TestDocKey(t)) assert.NoError(t, c1.Attach(ctx, d1)) wg := sync.WaitGroup{} wg.Add(1) - rch, err := c1.Watch(watchCtx, d1) + rch, cancel, err := c1.Subscribe(d1) + defer cancel() assert.NoError(t, err) go func() { defer wg.Done() @@ -151,12 +150,12 @@ func TestAdmin(t *testing.T) { t.Run("unauthentication test", func(t *testing.T) { // 01. try to call admin API without token. - adminCli2, err := admin.Dial(defaultServer.RPCAddr(), admin.WithInsecure(true)) + cli, err := admin.Dial(defaultServer.RPCAddr(), admin.WithInsecure(true)) assert.NoError(t, err) defer func() { - adminCli2.Close() + cli.Close() }() - _, err = adminCli2.GetProject(ctx, "default") + _, err = cli.GetProject(ctx, "default") // 02. server should return unauthenticated error. assert.Equal(t, connect.CodeUnauthenticated, connect.CodeOf(err)) diff --git a/test/integration/auth_webhook_test.go b/test/integration/auth_webhook_test.go index 8f196b8bf..a37a6bf41 100644 --- a/test/integration/auth_webhook_test.go +++ b/test/integration/auth_webhook_test.go @@ -177,7 +177,7 @@ func TestProjectAuthWebhook(t *testing.T) { err = cli.Attach(ctx, doc) assert.Equal(t, connect.CodeUnauthenticated, connect.CodeOf(err)) - _, err = cli.Watch(ctx, doc) + _, _, err = cli.Subscribe(doc) assert.Equal(t, client.ErrDocumentNotAttached, err) }) } diff --git a/test/integration/client_test.go b/test/integration/client_test.go index e37fe4413..3e9593d7e 100644 --- a/test/integration/client_test.go +++ b/test/integration/client_test.go @@ -20,8 +20,10 @@ package integration import ( "context" + "sync" "testing" + "connectrpc.com/connect" "github.com/stretchr/testify/assert" "github.com/yorkie-team/yorkie/client" @@ -172,4 +174,36 @@ func TestClient(t *testing.T) { assert.Equal(t, doc.Checkpoint(), change.Checkpoint{ClientSeq: 4, ServerSeq: 4}) assert.Equal(t, "2", doc.Root().GetCounter("counter").Marshal()) }) + + t.Run("deactivated client's stream test", func(t *testing.T) { + ctx := context.Background() + + c1, err := client.Dial(defaultServer.RPCAddr()) + assert.NoError(t, err) + assert.NoError(t, c1.Activate(ctx)) + + d1 := document.New(helper.TestDocKey(t)) + + // 01. Attach the document and subscribe. + assert.NoError(t, c1.Attach(ctx, d1)) + + // 02. Deactivate the client and try to watch. + assert.NoError(t, defaultServer.DeactivateClient(ctx, c1)) + + wg := sync.WaitGroup{} + wg.Add(1) + stream, _ := c1.Watch(ctx, d1) + + go func() { + defer wg.Done() + + stream.Receive() + if err = stream.Err(); err != nil { + assert.Equal(t, connect.CodeFailedPrecondition, connect.CodeOf(err)) + return + } + }() + + wg.Wait() + }) } diff --git a/test/integration/document_test.go b/test/integration/document_test.go index a163ab758..2451723d7 100644 --- a/test/integration/document_test.go +++ b/test/integration/document_test.go @@ -27,6 +27,7 @@ import ( "testing" "time" + "connectrpc.com/connect" "github.com/stretchr/testify/assert" "github.com/yorkie-team/yorkie/client" @@ -75,17 +76,35 @@ func TestDocument(t *testing.T) { assert.Error(t, err) }) - t.Run("detach removeIfNotAttached flag test", func(t *testing.T) { - // 01. create a document and attach it to c1 + t.Run("reattach test", func(t *testing.T) { ctx := context.Background() + + // 01. reattach a detached document doc := document.New(helper.TestDocKey(t)) - err := doc.Update(func(root *json.Object, p *presence.Presence) error { + assert.NoError(t, c1.Attach(ctx, doc)) + assert.NoError(t, doc.Update(func(root *json.Object, p *presence.Presence) error { root.SetString("k1", "v1") return nil - }, "update k1 with v1") - assert.NoError(t, err) + })) + assert.NoError(t, c1.Detach(ctx, doc)) + assert.Equal(t, connect.CodeFailedPrecondition, connect.CodeOf(c1.Attach(ctx, doc))) - err = c1.Attach(ctx, doc) + // 02. attach a new document with the same key + doc2 := document.New(helper.TestDocKey(t)) + assert.NoError(t, c1.Attach(ctx, doc2)) + assert.NoError(t, c1.Detach(ctx, doc2)) + + // 03. reattach but without updating the document + doc3 := document.New(helper.TestDocKey(t)) + assert.NoError(t, c1.Attach(ctx, doc3)) + assert.NoError(t, c1.Detach(ctx, doc3)) + }) + + t.Run("detach removeIfNotAttached flag test", func(t *testing.T) { + // 01. create a document and attach it to c1 + ctx := context.Background() + doc := document.New(helper.TestDocKey(t)) + err := c1.Attach(ctx, doc) assert.NoError(t, err) assert.True(t, doc.IsAttached()) @@ -96,6 +115,7 @@ func TestDocument(t *testing.T) { assert.Equal(t, doc.Status(), document.StatusDetached) // 03. attach again to c1 and check if it is attached normally + doc = document.New(helper.TestDocKey(t)) err = c1.Attach(ctx, doc) assert.NoError(t, err) assert.True(t, doc.IsAttached()) @@ -149,7 +169,7 @@ func TestDocument(t *testing.T) { ctx := context.Background() d1 := document.New(helper.TestDocKey(t)) - _, err := c1.Watch(ctx, d1) + _, _, err := c1.Subscribe(d1) assert.ErrorIs(t, err, client.ErrDocumentNotAttached) err = c1.Attach(ctx, d1) @@ -163,8 +183,9 @@ func TestDocument(t *testing.T) { // 01. cli1 watches doc1. wg.Add(1) - rch, err := c1.Watch(ctx, d1) + rch, _, err := c1.Subscribe(d1) assert.NoError(t, err) + go func() { defer wg.Done() @@ -402,23 +423,21 @@ func TestDocument(t *testing.T) { t.Run("removed document removal with watching test", func(t *testing.T) { ctx := context.Background() - watchCtx, cancel := context.WithCancel(ctx) - defer cancel() // 01. c1 creates d1 without attaching. d1 := document.New(helper.TestDocKey(t)) - _, err := c1.Watch(watchCtx, d1) + _, _, err := c1.Subscribe(d1) assert.ErrorIs(t, err, client.ErrDocumentNotAttached) // 02. c1 attaches d1 and watches it. assert.NoError(t, c1.Attach(ctx, d1)) - _, err = c1.Watch(watchCtx, d1) + _, _, err = c1.Subscribe(d1) assert.NoError(t, err) // 03. c1 removes d1 and watches it. assert.NoError(t, c1.Remove(ctx, d1)) assert.Equal(t, d1.Status(), document.StatusRemoved) - _, err = c1.Watch(watchCtx, d1) + _, _, err = c1.Subscribe(d1) assert.ErrorIs(t, err, client.ErrDocumentNotAttached) }) @@ -437,19 +456,19 @@ func TestDocument(t *testing.T) { d1 := document.New(helper.TestDocKey(t)) assert.NoError(t, c1.Attach(ctx, d1)) - rch1, err := c1.Watch(ctx, d1) + rch1, _, err := c1.Subscribe(d1) assert.NoError(t, err) d1.SubscribeBroadcastEvent("mention", handler) d2 := document.New(helper.TestDocKey(t)) assert.NoError(t, c2.Attach(ctx, d2)) - rch2, err := c2.Watch(ctx, d2) + rch2, _, err := c2.Subscribe(d2) assert.NoError(t, err) d2.SubscribeBroadcastEvent("mention", handler) d3 := document.New(helper.TestDocKey(t)) assert.NoError(t, c3.Attach(ctx, d3)) - rch3, err := c3.Watch(ctx, d3) + rch3, _, err := c3.Subscribe(d3) assert.NoError(t, err) d3.SubscribeBroadcastEvent("mention", handler) @@ -499,13 +518,13 @@ func TestDocument(t *testing.T) { d1 := document.New(helper.TestDocKey(t)) assert.NoError(t, c1.Attach(ctx, d1)) - rch1, err := c1.Watch(ctx, d1) + rch1, _, err := c1.Subscribe(d1) assert.NoError(t, err) d1.SubscribeBroadcastEvent("mention", handler) d2 := document.New(helper.TestDocKey(t)) assert.NoError(t, c2.Attach(ctx, d2)) - rch2, err := c2.Watch(ctx, d2) + rch2, _, err := c2.Subscribe(d2) assert.NoError(t, err) d2.SubscribeBroadcastEvent("mention", handler) @@ -557,14 +576,14 @@ func TestDocument(t *testing.T) { d1 := document.New(helper.TestDocKey(t)) assert.NoError(t, c1.Attach(ctx, d1)) - rch1, err := c1.Watch(ctx, d1) + rch1, _, err := c1.Subscribe(d1) assert.NoError(t, err) d1.SubscribeBroadcastEvent("mention", handler) // c2 doesn't subscribe to the "mention" broadcast event. d2 := document.New(helper.TestDocKey(t)) assert.NoError(t, c2.Attach(ctx, d2)) - rch2, err := c2.Watch(ctx, d2) + rch2, _, err := c2.Subscribe(d2) assert.NoError(t, err) // The unsubscriber c2 broadcasts the "mention" event. @@ -603,7 +622,7 @@ func TestDocument(t *testing.T) { d1 := document.New(helper.TestDocKey(t)) assert.NoError(t, c1.Attach(ctx, d1)) - _, err := c1.Watch(ctx, d1) + _, _, err := c1.Subscribe(d1) assert.NoError(t, err) d1.SubscribeBroadcastEvent("mention", nil) @@ -626,13 +645,13 @@ func TestDocument(t *testing.T) { d1 := document.New(helper.TestDocKey(t)) assert.NoError(t, c1.Attach(ctx, d1)) - rch1, err := c1.Watch(ctx, d1) + rch1, _, err := c1.Subscribe(d1) assert.NoError(t, err) d1.SubscribeBroadcastEvent("mention", handler) d2 := document.New(helper.TestDocKey(t)) assert.NoError(t, c2.Attach(ctx, d2)) - rch2, err := c2.Watch(ctx, d2) + rch2, _, err := c2.Subscribe(d2) assert.NoError(t, err) d2.SubscribeBroadcastEvent("mention", handler) @@ -711,9 +730,8 @@ func TestDocumentWithProjects(t *testing.T) { d1 := document.New(helper.TestDocKey(t)) err = c1.Attach(ctx, d1) assert.NoError(t, err) - watch1Ctx, cancel1 := context.WithCancel(ctx) + rch, cancel1, err := c1.Subscribe(d1) defer cancel1() - rch, err := c1.Watch(watch1Ctx, d1) assert.NoError(t, err) go func() { @@ -750,8 +768,7 @@ func TestDocumentWithProjects(t *testing.T) { }) d2 := document.New(helper.TestDocKey(t)) assert.NoError(t, c2.Attach(ctx, d2)) - watch2Ctx, cancel2 := context.WithCancel(ctx) - _, err = c2.Watch(watch2Ctx, d2) + _, cancel2, err := c2.Subscribe(d2) assert.NoError(t, err) // c2 updates the document, so c1 receives a documents changed event. @@ -764,8 +781,7 @@ func TestDocumentWithProjects(t *testing.T) { // d3 is in another project, so c1 and c2 should not receive events. d3 := document.New(helper.TestDocKey(t)) assert.NoError(t, c3.Attach(ctx, d3)) - watch3Ctx, cancel3 := context.WithCancel(ctx) - _, err = c3.Watch(watch3Ctx, d3) + _, cancel3, err := c3.Subscribe(d3) assert.NoError(t, err) assert.NoError(t, d3.Update(func(root *json.Object, p *presence.Presence) error { root.SetString("key3", "value3") diff --git a/test/integration/gc_test.go b/test/integration/gc_test.go index 0c972d5bf..0713abd4f 100644 --- a/test/integration/gc_test.go +++ b/test/integration/gc_test.go @@ -20,14 +20,17 @@ package integration import ( "context" + "strconv" "testing" "github.com/stretchr/testify/assert" + "github.com/yorkie-team/yorkie/client" "github.com/yorkie-team/yorkie/pkg/document" "github.com/yorkie-team/yorkie/pkg/document/json" "github.com/yorkie-team/yorkie/pkg/document/presence" "github.com/yorkie-team/yorkie/pkg/document/time" + "github.com/yorkie-team/yorkie/server" "github.com/yorkie-team/yorkie/test/helper" ) @@ -452,4 +455,213 @@ func TestGarbageCollection(t *testing.T) { assert.Equal(t, 5, d1.GarbageCollect(time.MaxTicket)) }) + t.Run("Should work properly when there are multiple nodes to be collected in text type", func(t *testing.T) { + ctx := context.Background() + d1 := document.New(helper.TestDocKey(t)) + err := c1.Attach(ctx, d1) + assert.NoError(t, err) + + d2 := document.New(helper.TestDocKey(t)) + err = c2.Attach(ctx, d2) + assert.NoError(t, err) + + err = d1.Update(func(root *json.Object, p *presence.Presence) error { + root.SetNewText("text").Edit(0, 0, "z") + return nil + }) + assert.NoError(t, err) + err = d1.Update(func(root *json.Object, p *presence.Presence) error { + root.GetText("text").Edit(0, 1, "a") + return nil + }) + assert.NoError(t, err) + err = d1.Update(func(root *json.Object, p *presence.Presence) error { + root.GetText("text").Edit(1, 1, "b") + return nil + }) + assert.NoError(t, err) + err = d1.Update(func(root *json.Object, p *presence.Presence) error { + root.GetText("text").Edit(2, 2, "d") + return nil + }) + assert.NoError(t, err) + err = c1.Sync(ctx) + assert.NoError(t, err) + err = c2.Sync(ctx) + assert.NoError(t, err) + + assert.Equal(t, `{"text":[{"val":"a"},{"val":"b"},{"val":"d"}]}`, d1.Marshal()) + assert.Equal(t, `{"text":[{"val":"a"},{"val":"b"},{"val":"d"}]}`, d2.Marshal()) + assert.Equal(t, 1, d1.GarbageLen()) // z + + err = d1.Update(func(root *json.Object, p *presence.Presence) error { + root.GetText("text").Edit(2, 2, "c") + return nil + }) + assert.NoError(t, err) + err = c1.Sync(ctx) + assert.NoError(t, err) + err = c2.Sync(ctx) + assert.NoError(t, err) + err = c2.Sync(ctx) + assert.NoError(t, err) + assert.Equal(t, `{"text":[{"val":"a"},{"val":"b"},{"val":"c"},{"val":"d"}]}`, d1.Marshal()) + assert.Equal(t, `{"text":[{"val":"a"},{"val":"b"},{"val":"c"},{"val":"d"}]}`, d2.Marshal()) + + err = d1.Update(func(root *json.Object, p *presence.Presence) error { + root.GetText("text").Edit(1, 3, "") + return nil + }) + assert.NoError(t, err) + err = c1.Sync(ctx) + assert.NoError(t, err) + assert.Equal(t, `{"text":[{"val":"a"},{"val":"d"}]}`, d1.Marshal()) + assert.Equal(t, 2, d1.GarbageLen()) // b,c + + err = c2.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, `{"text":[{"val":"a"},{"val":"d"}]}`, d2.Marshal()) + assert.Equal(t, 0, d1.GarbageLen()) + }) + + t.Run("Should work properly when there are multiple nodes to be collected in tree type", func(t *testing.T) { + ctx := context.Background() + d1 := document.New(helper.TestDocKey(t)) + err := c1.Attach(ctx, d1) + assert.NoError(t, err) + + d2 := document.New(helper.TestDocKey(t)) + err = c2.Attach(ctx, d2) + assert.NoError(t, err) + + err = d1.Update(func(root *json.Object, p *presence.Presence) error { + root.SetNewTree("tree", &json.TreeNode{ + Type: "r", + Children: []json.TreeNode{{ + Type: "text", Value: "z", + }}, + }) + return nil + }) + assert.NoError(t, err) + err = d1.Update(func(root *json.Object, p *presence.Presence) error { + root.GetTree("tree").EditByPath([]int{0}, []int{1}, &json.TreeNode{Type: "text", Value: "a"}, 0) + return nil + }) + assert.NoError(t, err) + err = d1.Update(func(root *json.Object, p *presence.Presence) error { + root.GetTree("tree").EditByPath([]int{1}, []int{1}, &json.TreeNode{Type: "text", Value: "b"}, 0) + return nil + }) + assert.NoError(t, err) + err = d1.Update(func(root *json.Object, p *presence.Presence) error { + root.GetTree("tree").EditByPath([]int{2}, []int{2}, &json.TreeNode{Type: "text", Value: "d"}, 0) + return nil + }) + assert.NoError(t, err) + err = c1.Sync(ctx) + assert.NoError(t, err) + err = c2.Sync(ctx) + assert.NoError(t, err) + + assert.Equal(t, `abd`, d1.Root().GetTree("tree").ToXML()) + assert.Equal(t, `abd`, d2.Root().GetTree("tree").ToXML()) + assert.Equal(t, 1, d1.GarbageLen()) // z + + err = d1.Update(func(root *json.Object, p *presence.Presence) error { + root.GetTree("tree").EditByPath([]int{2}, []int{2}, &json.TreeNode{Type: "text", Value: "c"}, 0) + return nil + }) + assert.NoError(t, err) + err = c1.Sync(ctx) + assert.NoError(t, err) + err = c2.Sync(ctx) + assert.NoError(t, err) + err = c2.Sync(ctx) + assert.NoError(t, err) + assert.Equal(t, `abcd`, d1.Root().GetTree("tree").ToXML()) + assert.Equal(t, `abcd`, d2.Root().GetTree("tree").ToXML()) + + err = d1.Update(func(root *json.Object, p *presence.Presence) error { + root.GetTree("tree").EditByPath([]int{1}, []int{3}, nil, 0) + return nil + }) + assert.NoError(t, err) + err = c1.Sync(ctx) + assert.NoError(t, err) + assert.Equal(t, `ad`, d1.Root().GetTree("tree").ToXML()) + assert.Equal(t, 2, d1.GarbageLen()) // b,c + + err = c2.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, `ad`, d2.Root().GetTree("tree").ToXML()) + assert.Equal(t, 0, d1.GarbageLen()) + }) + + t.Run("Should not collect the garbage if the DisableGC is true", func(t *testing.T) { + // 01. Create a new server with SnapshotDisableGC set to true + conf := helper.TestConfig() + conf.Backend.SnapshotDisableGC = true + conf.Backend.SnapshotThreshold = 10 + conf.Backend.SnapshotInterval = 10 + testServer, err := server.New(conf) + assert.NoError(t, err) + assert.NoError(t, testServer.Start()) + defer func() { + assert.NoError(t, testServer.Shutdown(true)) + }() + + ctx := context.Background() + c1, err := client.Dial(testServer.RPCAddr()) + assert.NoError(t, err) + assert.NoError(t, c1.Activate(ctx)) + defer func() { + assert.NoError(t, c1.Deactivate(ctx)) + assert.NoError(t, c1.Close()) + }() + + // 02. Create a document and update it to check if the garbage is collected + d1 := document.New(helper.TestDocKey(t), document.WithDisableGC()) + assert.NoError(t, c1.Attach(ctx, d1)) + defer func() { + assert.NoError(t, c1.Detach(ctx, d1)) + }() + + assert.NoError(t, d1.Update(func(root *json.Object, p *presence.Presence) error { + root.SetNewText("text").Edit(0, 0, "-") + return nil + })) + for i := 0; i < int(conf.Backend.SnapshotInterval); i++ { + assert.NoError(t, d1.Update(func(root *json.Object, p *presence.Presence) error { + root.GetText("text").Edit(0, 1, strconv.Itoa(i)) + return nil + })) + } + assert.Equal(t, int(conf.Backend.SnapshotInterval), d1.GarbageLen()) + assert.NoError(t, c1.Sync(ctx)) + + // 03. Check if the garbage is collected after the snapshot interval + c2, err := client.Dial(testServer.RPCAddr()) + assert.NoError(t, err) + assert.NoError(t, c2.Activate(ctx)) + defer func() { + assert.NoError(t, c2.Deactivate(ctx)) + assert.NoError(t, c2.Close()) + }() + + d2 := document.New(helper.TestDocKey(t), document.WithDisableGC()) + assert.NoError(t, c2.Attach(ctx, d2)) + defer func() { + assert.NoError(t, c2.Detach(ctx, d2)) + }() + assert.Equal(t, int(conf.Backend.SnapshotInterval), d2.GarbageLen()) + }) } diff --git a/test/integration/housekeeping_test.go b/test/integration/housekeeping_test.go index 9b56d916d..add1a9a93 100644 --- a/test/integration/housekeeping_test.go +++ b/test/integration/housekeeping_test.go @@ -25,18 +25,17 @@ import ( "log" "sort" "testing" - gotime "time" - monkey "github.com/undefinedlabs/go-mpatch" - "github.com/stretchr/testify/assert" + monkey "github.com/undefinedlabs/go-mpatch" "github.com/yorkie-team/yorkie/api/types" + "github.com/yorkie-team/yorkie/server/backend" "github.com/yorkie-team/yorkie/server/backend/database" "github.com/yorkie-team/yorkie/server/backend/database/mongo" - "github.com/yorkie-team/yorkie/server/backend/housekeeping" - "github.com/yorkie-team/yorkie/server/backend/sync/memory" + "github.com/yorkie-team/yorkie/server/clients" + "github.com/yorkie-team/yorkie/server/profiling/prometheus" "github.com/yorkie-team/yorkie/test/helper" ) @@ -46,41 +45,49 @@ const ( clientDeactivateThreshold = "23h" ) -func setupTest(t *testing.T) *mongo.Client { - config := &mongo.Config{ +func setupBackend(t *testing.T) *backend.Backend { + conf := helper.TestConfig() + conf.Backend.UseDefaultProject = false + conf.Mongo = &mongo.Config{ ConnectionTimeout: "5s", ConnectionURI: "mongodb://localhost:27017", YorkieDatabase: helper.TestDBName() + "-integration", PingTimeout: "5s", } - assert.NoError(t, config.Validate()) - cli, err := mongo.Dial(config) + metrics, err := prometheus.NewMetrics() + assert.NoError(t, err) + + be, err := backend.New( + conf.Backend, + conf.Mongo, + conf.Housekeeping, + metrics, + ) assert.NoError(t, err) - return cli + return be } func TestHousekeeping(t *testing.T) { - config := helper.TestConfig() - db := setupTest(t) + be := setupBackend(t) + defer func() { + assert.NoError(t, be.Shutdown()) + }() - projects := createProjects(t, db) - - coordinator := memory.NewCoordinator(nil) - - h, err := housekeeping.New(config.Housekeeping, db, coordinator) - assert.NoError(t, err) + projects := createProjects(t, be.DB) t.Run("FindDeactivateCandidates return lastProjectID test", func(t *testing.T) { ctx := context.Background() fetchSize := 3 - lastProjectID := database.DefaultProjectID + var err error + lastProjectID := database.DefaultProjectID for i := 0; i < len(projects)/fetchSize; i++ { - lastProjectID, _, err = h.FindDeactivateCandidates( + lastProjectID, _, err = clients.FindDeactivateCandidates( ctx, + be, 0, fetchSize, lastProjectID, @@ -89,8 +96,9 @@ func TestHousekeeping(t *testing.T) { assert.Equal(t, projects[((i+1)*fetchSize)-1].ID, lastProjectID) } - lastProjectID, _, err = h.FindDeactivateCandidates( + lastProjectID, _, err = clients.FindDeactivateCandidates( ctx, + be, 0, fetchSize, lastProjectID, @@ -107,20 +115,20 @@ func TestHousekeeping(t *testing.T) { if err != nil { log.Fatal(err) } - clientA, err := db.ActivateClient(ctx, projects[0].ID, fmt.Sprintf("%s-A", t.Name())) + clientA, err := be.DB.ActivateClient(ctx, projects[0].ID, fmt.Sprintf("%s-A", t.Name())) assert.NoError(t, err) - clientB, err := db.ActivateClient(ctx, projects[0].ID, fmt.Sprintf("%s-B", t.Name())) + clientB, err := be.DB.ActivateClient(ctx, projects[0].ID, fmt.Sprintf("%s-B", t.Name())) assert.NoError(t, err) - err = patch.Unpatch() - if err != nil { + if err = patch.Unpatch(); err != nil { log.Fatal(err) } - clientC, err := db.ActivateClient(ctx, projects[0].ID, fmt.Sprintf("%s-C", t.Name())) + clientC, err := be.DB.ActivateClient(ctx, projects[0].ID, fmt.Sprintf("%s-C", t.Name())) assert.NoError(t, err) - _, candidates, err := h.FindDeactivateCandidates( + _, candidates, err := clients.FindDeactivateCandidates( ctx, + be, 10, 10, database.DefaultProjectID, @@ -134,7 +142,7 @@ func TestHousekeeping(t *testing.T) { }) } -func createProjects(t *testing.T, db *mongo.Client) []*database.ProjectInfo { +func createProjects(t *testing.T, db database.Database) []*database.ProjectInfo { t.Helper() ctx := context.Background() diff --git a/test/integration/presence_test.go b/test/integration/presence_test.go index e2b37aa69..9f0a8e891 100644 --- a/test/integration/presence_test.go +++ b/test/integration/presence_test.go @@ -139,9 +139,8 @@ func TestPresence(t *testing.T) { wgEvents := sync.WaitGroup{} wgEvents.Add(1) - watch1Ctx, cancel1 := context.WithCancel(ctx) + wrch, cancel1, err := c1.Subscribe(d1) defer cancel1() - wrch, err := c1.Watch(watch1Ctx, d1) assert.NoError(t, err) go func() { defer func() { @@ -177,8 +176,7 @@ func TestPresence(t *testing.T) { c2.ID().String(): {}, }, }) - watch2Ctx, cancel2 := context.WithCancel(ctx) - _, err = c2.Watch(watch2Ctx, d2) + _, cancel2, err := c2.Subscribe(d2) assert.NoError(t, err) // 04. Update the second client's presence. @@ -224,9 +222,8 @@ func TestPresence(t *testing.T) { wgEvents := sync.WaitGroup{} wgEvents.Add(1) - watch1Ctx, cancel1 := context.WithCancel(ctx) + wrch, cancel1, err := c1.Subscribe(d1) defer cancel1() - wrch, err := c1.Watch(watch1Ctx, d1) assert.NoError(t, err) go func() { defer func() { @@ -263,9 +260,8 @@ func TestPresence(t *testing.T) { c2.ID().String(): {}, }, }) - watch2Ctx, cancel2 := context.WithCancel(ctx) + _, cancel2, err := c2.Subscribe(d2) defer cancel2() - _, err = c2.Watch(watch2Ctx, d2) assert.NoError(t, err) // 04. Update the second client's presence. @@ -313,9 +309,8 @@ func TestPresence(t *testing.T) { wgEvents := sync.WaitGroup{} wgEvents.Add(1) - watch1Ctx, cancel1 := context.WithCancel(ctx) + wrch, cancel1, err := c1.Subscribe(d1) defer cancel1() - wrch, err := c1.Watch(watch1Ctx, d1) assert.NoError(t, err) go func() { defer func() { @@ -352,9 +347,8 @@ func TestPresence(t *testing.T) { c2.ID().String(): {}, }, }) - watch2Ctx, cancel2 := context.WithCancel(ctx) + _, cancel2, err := c2.Subscribe(d2) defer cancel2() - _, err = c2.Watch(watch2Ctx, d2) assert.NoError(t, err) // 04. Update the second client's presence. @@ -405,9 +399,8 @@ func TestPresence(t *testing.T) { wgEvents := sync.WaitGroup{} wgEvents.Add(1) - watch1Ctx, cancel1 := context.WithCancel(ctx) + wrch, cancel1, err := c1.Subscribe(d1) defer cancel1() - wrch, err := c1.Watch(watch1Ctx, d1) assert.NoError(t, err) go func() { defer func() { @@ -452,13 +445,11 @@ func TestPresence(t *testing.T) { c2.ID().String(): d2.MyPresence(), }, }) - watch2Ctx, cancel2 := context.WithCancel(ctx) - _, err = c2.Watch(watch2Ctx, d2) + _, cancel2, err := c2.Subscribe(d2) assert.NoError(t, err) assert.NoError(t, c1.Sync(ctx, client.WithDocKey(helper.TestDocKey(t)))) - watch3Ctx, cancel3 := context.WithCancel(ctx) - _, err = c2.Watch(watch3Ctx, d3) + _, cancel3, err := c2.Subscribe(d3) assert.NoError(t, err) // 05. The second client unwatch the documents attached by itself. diff --git a/test/integration/restapi_test.go b/test/integration/restapi_test.go new file mode 100644 index 000000000..18926c209 --- /dev/null +++ b/test/integration/restapi_test.go @@ -0,0 +1,134 @@ +//go:build integration + +/* + * Copyright 2024 The Yorkie Authors. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package integration + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/yorkie-team/yorkie/api/types" + "github.com/yorkie-team/yorkie/test/helper" +) + +// documentSummaries represents a list of document documentSummaries. +type documentSummaries struct { + Documents []*types.DocumentSummary `json:"documents"` +} + +// documentSummary represents a summary of a document. +type documentSummary struct { + Document *types.DocumentSummary `json:"document"` +} + +func TestRESTAPI(t *testing.T) { + t.Run("document retrieval test", func(t *testing.T) { + project, docs := helper.CreateProjectAndDocuments(t, defaultServer, 3) + res := post( + t, + project, + fmt.Sprintf("http://%s/yorkie.v1.AdminService/GetDocument", defaultServer.RPCAddr()), + fmt.Sprintf(`{"project_name": "%s", "document_key": "%s"}`, project.Name, docs[0].Key()), + ) + + summary := &documentSummary{} + assert.NoError(t, json.Unmarshal(res, summary)) + assert.Equal(t, docs[0].Key(), summary.Document.Key) + }) + + t.Run("bulk document retrieval test", func(t *testing.T) { + project, docs := helper.CreateProjectAndDocuments(t, defaultServer, 3) + res := post( + t, + project, + fmt.Sprintf("http://%s/yorkie.v1.AdminService/GetDocuments", defaultServer.RPCAddr()), + fmt.Sprintf(`{"project_name": "%s", "document_keys": ["%s", "%s"]}`, project.Name, docs[0].Key(), docs[1].Key()), + ) + + summaries := &documentSummaries{} + assert.NoError(t, json.Unmarshal(res, summaries)) + assert.Len(t, summaries.Documents, 2) + }) + + t.Run("list documents test", func(t *testing.T) { + project, _ := helper.CreateProjectAndDocuments(t, defaultServer, 3) + res := post( + t, + project, + fmt.Sprintf("http://%s/yorkie.v1.AdminService/ListDocuments", defaultServer.RPCAddr()), + fmt.Sprintf(`{"project_name": "%s", "document_key": "test"}`, project.Name), + ) + + summaries := &documentSummaries{} + assert.NoError(t, json.Unmarshal(res, summaries)) + assert.Len(t, summaries.Documents, 3) + }) + + t.Run("search documents test", func(t *testing.T) { + project, docs := helper.CreateProjectAndDocuments(t, defaultServer, 3) + res := post( + t, + project, + fmt.Sprintf("http://%s/yorkie.v1.AdminService/SearchDocuments", defaultServer.RPCAddr()), + fmt.Sprintf(`{"project_name": "%s", "query": "0-", "page_size": 3}`, project.Name), + ) + summaries := &documentSummaries{} + assert.NoError(t, json.Unmarshal(res, summaries)) + assert.Len(t, summaries.Documents, 1) + + _ = post( + t, + project, + fmt.Sprintf("http://%s/yorkie.v1.AdminService/RemoveDocumentByAdmin", defaultServer.RPCAddr()), + fmt.Sprintf(`{"project_name": "%s", "document_key": "%s", "force": true}`, project.Name, docs[0].Key()), + ) + + res = post( + t, + project, + fmt.Sprintf("http://%s/yorkie.v1.AdminService/SearchDocuments", defaultServer.RPCAddr()), + fmt.Sprintf(`{"project_name": "%s", "query": "0-", "page_size": 3}`, project.Name), + ) + summaries = &documentSummaries{} + assert.NoError(t, json.Unmarshal(res, summaries)) + assert.Len(t, summaries.Documents, 0) + }) +} + +// post sends a POST request to the given URL with the given body. +func post(t *testing.T, project *types.Project, url, body string) []byte { + req, err := http.NewRequest("POST", url, strings.NewReader(body)) + assert.NoError(t, err) + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", project.SecretKey) + + httpClient := http.Client{} + res, err := httpClient.Do(req) + assert.NoError(t, err) + assert.Equal(t, http.StatusOK, res.StatusCode) + + resBody, err := io.ReadAll(res.Body) + assert.NoError(t, err) + return resBody +} diff --git a/test/integration/server_test.go b/test/integration/server_test.go index 93c53eb99..30dc03d5e 100644 --- a/test/integration/server_test.go +++ b/test/integration/server_test.go @@ -45,7 +45,7 @@ func TestServer(t *testing.T) { assert.NoError(t, cli.Attach(ctx, doc)) wg := sync.WaitGroup{} - wrch, err := cli.Watch(ctx, doc) + wrch, _, err := cli.Subscribe(doc) assert.NoError(t, err) go func() { 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 diff --git a/test/integration/tree_concurrency_test.go b/test/integration/tree_concurrency_test.go index b62e41706..b342bebcb 100644 --- a/test/integration/tree_concurrency_test.go +++ b/test/integration/tree_concurrency_test.go @@ -30,6 +30,28 @@ import ( "github.com/yorkie-team/yorkie/test/helper" ) +/** + * parseSimpleXML parses the given XML string into a slice of strings. + * For example, "

    abc

    " returns ["

    ", "abc", "

    "]. + */ +func parseSimpleXML(s string) []string { + var res []string + for i := 0; i < len(s); i++ { + current := "" + if s[i] == '<' { + for i < len(s) && s[i] != '>' { + current += string(s[i]) + i++ + } + current += string(s[i]) + } else { + current += string(s[i]) + } + res = append(res, current) + } + return res +} + type testResult struct { flag bool resultDesc string @@ -43,6 +65,8 @@ const ( RangeMiddle RangeBack RangeAll + RangeOneQuarter + RangeThreeQuarter ) type rangeType struct { @@ -59,14 +83,22 @@ type twoRangesType struct { } func getRange(ranges twoRangesType, selector rangeSelector, user int) rangeType { + interval := ranges.ranges[user] + from, mid, to := interval.from, interval.mid, interval.to if selector == RangeFront { - return rangeType{ranges.ranges[user].from, ranges.ranges[user].from} + return rangeType{from, from} } else if selector == RangeMiddle { - return rangeType{ranges.ranges[user].mid, ranges.ranges[user].mid} + return rangeType{mid, mid} } else if selector == RangeBack { - return rangeType{ranges.ranges[user].to, ranges.ranges[user].to} + return rangeType{to, to} } else if selector == RangeAll { - return rangeType{ranges.ranges[user].from, ranges.ranges[user].to} + return rangeType{from, to} + } else if selector == RangeOneQuarter { + pos := (from + mid + 1) / 2 + return rangeType{pos, pos} + } else if selector == RangeThreeQuarter { + pos := (mid + to) / 2 + return rangeType{pos, pos} } return rangeType{-1, -1} } @@ -77,6 +109,20 @@ func makeTwoRanges(from1, mid1, to1 int, from2, mid2, to2 int, desc string) twoR return twoRangesType{[2]rangeWithMiddleType{range0, range1}, desc} } +func getMergeRange(xml string, interval rangeType) rangeType { + content := parseSimpleXML(xml) + st, ed := -1, -1 + for i := interval.from + 1; i <= interval.to; i++ { + if st == -1 && len(content[i]) >= 2 && content[i][0] == '<' && content[i][1] == '/' { + st = i - 1 + } + if len(content[i]) >= 2 && content[i][0] == '<' && content[i][1] != '/' { + ed = i + } + } + return rangeType{st, ed} +} + type styleOpCode int type editOpCode int @@ -89,6 +135,8 @@ const ( const ( EditUndefined editOpCode = iota EditUpdate + MergeUpdate + SplitUpdate ) type operationInterface interface { @@ -138,7 +186,19 @@ func (op editOperationType) run(t *testing.T, doc *document.Document, user int, from, to := interval.from, interval.to assert.NoError(t, doc.Update(func(root *json.Object, p *presence.Presence) error { - root.GetTree("t").Edit(from, to, op.content, op.splitLevel) + if op.op == EditUpdate { + root.GetTree("t").Edit(from, to, op.content, op.splitLevel) + } else if op.op == MergeUpdate { + mergeInterval := getMergeRange(root.GetTree("t").ToXML(), interval) + from, to = mergeInterval.from, mergeInterval.to + if from != -1 && to != -1 && from < to { + root.GetTree("t").Edit(mergeInterval.from, mergeInterval.to, op.content, op.splitLevel) + } + } else if op.op == SplitUpdate { + assert.NotEqual(t, 0, op.splitLevel) + assert.Equal(t, from, to) + root.GetTree("t").Edit(from, to, op.content, op.splitLevel) + } return nil })) } @@ -151,17 +211,17 @@ func (op editOperationType) run(t *testing.T, doc *document.Document, user int, func RunTestTreeConcurrency(testDesc string, t *testing.T, initialState json.TreeNode, initialXML string, rangesArr []twoRangesType, opArr1, opArr2 []operationInterface) { - runTest := func(ranges twoRangesType, op1, op2 operationInterface) testResult { - clients := activeClients(t, 2) - c1, c2 := clients[0], clients[1] - defer deactivateAndCloseClients(t, clients) + clients := activeClients(t, 2) + c1, c2 := clients[0], clients[1] + defer deactivateAndCloseClients(t, clients) - ctx := context.Background() - d1 := document.New(helper.TestDocKey(t)) - assert.NoError(t, c1.Attach(ctx, d1)) - d2 := document.New(helper.TestDocKey(t)) - assert.NoError(t, c2.Attach(ctx, d2)) + ctx := context.Background() + d1 := document.New(helper.TestDocKey(t)) + assert.NoError(t, c1.Attach(ctx, d1)) + d2 := document.New(helper.TestDocKey(t)) + assert.NoError(t, c2.Attach(ctx, d2)) + runTest := func(ranges twoRangesType, op1, op2 operationInterface) testResult { assert.NoError(t, d1.Update(func(root *json.Object, p *presence.Presence) error { root.SetNewTree("t", &initialState) return nil @@ -247,6 +307,7 @@ func TestTreeConcurrencyEditEdit(t *testing.T) { editOperationType{RangeBack, EditUpdate, elementNode1, 0, `insertElementBack`}, editOperationType{RangeAll, EditUpdate, elementNode1, 0, `replaceElement`}, editOperationType{RangeAll, EditUpdate, nil, 0, `delete`}, + editOperationType{RangeAll, MergeUpdate, nil, 0, `merge`}, } editOperations2 := []operationInterface{ @@ -259,11 +320,119 @@ func TestTreeConcurrencyEditEdit(t *testing.T) { editOperationType{RangeBack, EditUpdate, elementNode2, 0, `insertElementBack`}, editOperationType{RangeAll, EditUpdate, elementNode2, 0, `replaceElement`}, editOperationType{RangeAll, EditUpdate, nil, 0, `delete`}, + editOperationType{RangeAll, MergeUpdate, nil, 0, `merge`}, } RunTestTreeConcurrency("concurrently-edit-edit-test", t, initialState, initialXML, ranges, editOperations1, editOperations2) } +func TestTreeConcurrencySplitSplit(t *testing.T) { + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 + //

    a b c d

    e f g h

    i j k l

    + + initialState := json.TreeNode{ + Type: "root", + Children: []json.TreeNode{ + {Type: "p", Children: []json.TreeNode{ + {Type: "p", Children: []json.TreeNode{ + {Type: "p", Children: []json.TreeNode{ + {Type: "p", Children: []json.TreeNode{{Type: "text", Value: "abcd"}}}, + {Type: "p", Children: []json.TreeNode{{Type: "text", Value: "efgh"}}}, + }}, + {Type: "p", Children: []json.TreeNode{{Type: "text", Value: "ijkl"}}}, + }}, + }}, + }, + } + initialXML := `

    abcd

    efgh

    ijkl

    ` + + ranges := []twoRangesType{ + // equal-single-element:

    abcd

    + makeTwoRanges(3, 6, 9, 3, 6, 9, `equal-single`), + // equal-multiple-element:

    abcd

    efgh

    + makeTwoRanges(3, 9, 15, 3, 9, 15, `equal-multiple`), + // A contains B same level:

    abcd

    efgh

    -

    efgh

    + makeTwoRanges(3, 9, 15, 9, 12, 15, `A contains B same level`), + // A contains B multiple level:

    abcd

    efgh

    ijkl

    -

    efgh

    + makeTwoRanges(2, 16, 22, 9, 12, 15, `A contains B multiple level`), + // side by side + makeTwoRanges(3, 6, 9, 9, 12, 15, `B is next to A`), + } + + splitOperations := []operationInterface{ + editOperationType{RangeFront, SplitUpdate, nil, 1, `split-front-1`}, + editOperationType{RangeOneQuarter, SplitUpdate, nil, 1, `split-one-quarter-1`}, + editOperationType{RangeThreeQuarter, SplitUpdate, nil, 1, `split-three-quarter-1`}, + editOperationType{RangeBack, SplitUpdate, nil, 1, `split-back-1`}, + editOperationType{RangeFront, SplitUpdate, nil, 2, `split-front-2`}, + editOperationType{RangeOneQuarter, SplitUpdate, nil, 2, `split-one-quarter-2`}, + editOperationType{RangeThreeQuarter, SplitUpdate, nil, 2, `split-three-quarter-2`}, + editOperationType{RangeBack, SplitUpdate, nil, 2, `split-back-2`}, + } + + RunTestTreeConcurrency("concurrently-split-split-test", t, initialState, initialXML, ranges, splitOperations, splitOperations) +} + +func TestTreeConcurrencySplitEdit(t *testing.T) { + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + //

    a b c d

    e f g h

    i j k l

    + + initialState := json.TreeNode{ + Type: "root", + Children: []json.TreeNode{ + {Type: "p", Children: []json.TreeNode{ + {Type: "p", Children: []json.TreeNode{ + {Type: "p", Children: []json.TreeNode{{Type: "text", Value: "abcd"}}, Attributes: map[string]string{"italic": "true"}}, + {Type: "p", Children: []json.TreeNode{{Type: "text", Value: "efgh"}}, Attributes: map[string]string{"italic": "true"}}, + }, Attributes: map[string]string{"italic": "true"}}, + {Type: "p", Children: []json.TreeNode{{Type: "text", Value: "ijkl"}}, Attributes: map[string]string{"italic": "true"}}, + }}, + }, + } + initialXML := `

    abcd

    efgh

    ijkl

    ` + + content := &json.TreeNode{Type: "i", Children: []json.TreeNode{}} + + ranges := []twoRangesType{ + // equal:

    ab'cd

    + makeTwoRanges(2, 5, 8, 2, 5, 8, `equal`), + // A contains B:

    ab'cd

    - bc + makeTwoRanges(2, 5, 8, 4, 5, 6, `A contains B`), + // B contains A:

    ab'cd

    -

    abcd

    efgh

    + makeTwoRanges(2, 5, 8, 2, 8, 14, `B contains A`), + // left node(text):

    ab'cd

    - ab + makeTwoRanges(2, 5, 8, 3, 4, 5, `left node(text)`), + // right node(text):

    ab'cd

    - cd + makeTwoRanges(2, 5, 8, 5, 6, 7, `right node(text)`), + // left node(element):

    abcd

    '

    efgh

    -

    abcd

    + makeTwoRanges(2, 8, 14, 2, 5, 8, `left node(element)`), + // right node(element):

    abcd

    '

    efgh

    -

    efgh

    + makeTwoRanges(2, 8, 14, 8, 11, 14, `right node(element)`), + // A -> B:

    ab'cd

    -

    efgh

    + makeTwoRanges(2, 5, 8, 8, 11, 14, `A -> B`), + // B -> A:

    ef'gh

    -

    abcd

    + makeTwoRanges(8, 11, 14, 2, 5, 8, `B -> A`), + } + + splitOperations := []operationInterface{ + editOperationType{RangeMiddle, SplitUpdate, nil, 1, `split-1`}, + editOperationType{RangeMiddle, SplitUpdate, nil, 2, `split-2`}, + } + + editOperations := []operationInterface{ + editOperationType{RangeFront, EditUpdate, content, 0, `insertFront`}, + editOperationType{RangeMiddle, EditUpdate, content, 0, `insertMiddle`}, + editOperationType{RangeBack, EditUpdate, content, 0, `insertBack`}, + editOperationType{RangeAll, EditUpdate, content, 0, "replace"}, + editOperationType{RangeAll, EditUpdate, nil, 0, `delete`}, + editOperationType{RangeAll, MergeUpdate, nil, 0, `merge`}, + styleOperationType{RangeAll, StyleSet, "bold", "aa", `style`}, + styleOperationType{RangeAll, StyleRemove, "italic", "", `remove-style`}, + } + + RunTestTreeConcurrency("concurrently-split-edit-test", t, initialState, initialXML, ranges, splitOperations, editOperations) +} + func TestTreeConcurrencyStyleStyle(t *testing.T) { // 0 1 2 3 4 5 6 7 8 9 //

    a

    b

    c

    @@ -314,18 +483,23 @@ func TestTreeConcurrencyEditStyle(t *testing.T) { initialState := json.TreeNode{ Type: "root", Children: []json.TreeNode{ - {Type: "p", Children: []json.TreeNode{{Type: "text", Value: "a"}}}, - {Type: "p", Children: []json.TreeNode{{Type: "text", Value: "b"}}}, - {Type: "p", Children: []json.TreeNode{{Type: "text", Value: "c"}}}, + {Type: "p", Children: []json.TreeNode{{Type: "text", Value: "a"}}, Attributes: map[string]string{"color": "red"}}, + {Type: "p", Children: []json.TreeNode{{Type: "text", Value: "b"}}, Attributes: map[string]string{"color": "red"}}, + {Type: "p", Children: []json.TreeNode{{Type: "text", Value: "c"}}, Attributes: map[string]string{"color": "red"}}, }, } - initialXML := `

    a

    b

    c

    ` + initialXML := `

    a

    b

    c

    ` - content := &json.TreeNode{Type: "p", Attributes: map[string]string{"italic": "true"}, Children: []json.TreeNode{{Type: "text", Value: `d`}}} + content := &json.TreeNode{Type: "p", Attributes: map[string]string{ + "italic": "true", + "color": "blue", + }, Children: []json.TreeNode{{Type: "text", Value: `d`}}} ranges := []twoRangesType{ // equal:

    b

    -

    b

    makeTwoRanges(3, 3, 6, 3, -1, 6, `equal`), + // equal multiple:

    a

    b

    c

    -

    a

    b

    c

    + makeTwoRanges(0, 3, 9, 0, 3, 9, `equal multiple`), // A contains B:

    a

    b

    c

    -

    b

    makeTwoRanges(0, 3, 9, 3, -1, 6, `A contains B`), // B contains A:

    b

    -

    a

    b

    c

    @@ -344,10 +518,11 @@ func TestTreeConcurrencyEditStyle(t *testing.T) { editOperationType{RangeBack, EditUpdate, content, 0, `insertBack`}, editOperationType{RangeAll, EditUpdate, nil, 0, `delete`}, editOperationType{RangeAll, EditUpdate, content, 0, `replace`}, + editOperationType{RangeAll, MergeUpdate, nil, 0, `merge`}, } styleOperations := []operationInterface{ - styleOperationType{RangeAll, StyleRemove, "bold", "", `remove-bold`}, + styleOperationType{RangeAll, StyleRemove, "color", "", `remove-color`}, styleOperationType{RangeAll, StyleSet, "bold", "aa", `set-bold-aa`}, } diff --git a/test/integration/tree_test.go b/test/integration/tree_test.go index 38df94629..54e1067c0 100644 --- a/test/integration/tree_test.go +++ b/test/integration/tree_test.go @@ -24,7 +24,9 @@ import ( "github.com/stretchr/testify/assert" + "github.com/yorkie-team/yorkie/api/converter" "github.com/yorkie-team/yorkie/pkg/document" + "github.com/yorkie-team/yorkie/pkg/document/crdt" "github.com/yorkie-team/yorkie/pkg/document/json" "github.com/yorkie-team/yorkie/pkg/document/presence" "github.com/yorkie-team/yorkie/pkg/index" @@ -375,6 +377,79 @@ func TestTree(t *testing.T) { assert.NoError(t, err) }) + t.Run("find correct path after deleting leftNode test", func(t *testing.T) { + ctx := context.Background() + d1 := document.New(helper.TestDocKey(t)) + assert.NoError(t, c1.Attach(ctx, d1)) + d2 := document.New(helper.TestDocKey(t)) + assert.NoError(t, c2.Attach(ctx, d2)) + + // 01. Create a tree and insert a paragraph with text. + assert.NoError(t, d1.Update(func(root *json.Object, p *presence.Presence) error { + root.SetNewTree("t", &json.TreeNode{ + Type: "r", + Children: []json.TreeNode{{ + Type: "p", + Children: []json.TreeNode{{ + Type: "text", + Value: "hello", + }}, + }}, + }) + + return nil + })) + assert.NoError(t, c1.Sync(ctx)) + assert.NoError(t, c2.Sync(ctx)) + assert.Equal(t, "

    hello

    ", d1.Root().GetTree("t").ToXML()) + assert.Equal(t, "

    hello

    ", d2.Root().GetTree("t").ToXML()) + + // 02. Insert additional character between 3rd character and 4th character. + assert.NoError(t, d1.Update(func(root *json.Object, p *presence.Presence) error { + root.GetTree("t").EditByPath([]int{0, 3}, []int{0, 3}, &json.TreeNode{ + Type: "text", + Value: "3", + }, 0) + + return nil + })) + assert.NoError(t, c1.Sync(ctx)) + assert.NoError(t, c2.Sync(ctx)) + assert.Equal(t, "

    hel3lo

    ", d1.Root().GetTree("t").ToXML()) + assert.Equal(t, "

    hel3lo

    ", d2.Root().GetTree("t").ToXML()) + + // 03. Get fromParent, fromLeft node from path [0, 5] before fix + fromPos, _ := d2.Root().GetTree("t").PathToPos([]int{0, 5}) + fromParent, fromLeft := d2.Root().GetTree("t").ToTreeNodes(fromPos) + + // 04. Apply modification + assert.NoError(t, d2.Update(func(root *json.Object, p *presence.Presence) error { + // 04-1. Erase 3rd character from the text, which immediately preceding the treePos obtained above. + root.GetTree("t").EditByPath([]int{0, 4}, []int{0, 5}, nil, 0) + assert.Equal(t, "

    hel3o

    ", d2.Root().GetTree("t").ToXML()) + + // 04-2. Insert character between 3rd character and 4th character. + root.GetTree("t").EditByPath([]int{0, 4}, []int{0, 4}, &json.TreeNode{ + Type: "text", + Value: "m", + }, 0) + assert.Equal(t, "

    hel3mo

    ", d2.Root().GetTree("t").ToXML()) + + return nil + })) + + // 05. Check if the path is identical when re-obtaining the path from `fromParent` and `fromLeft` after fix. + fromPath, err := d2.Root().GetTree("t").ToPath(fromParent, fromLeft) + assert.NoError(t, err) + assert.Equal(t, []int{0, 5}, fromPath) + + assert.NoError(t, c2.Sync(ctx)) + assert.NoError(t, c1.Sync(ctx)) + + assert.Equal(t, "

    hel3mo

    ", d1.Root().GetTree("t").ToXML()) + assert.Equal(t, "

    hel3mo

    ", d2.Root().GetTree("t").ToXML()) + }) + t.Run("sync its content with other clients test", func(t *testing.T) { ctx := context.Background() d1 := document.New(helper.TestDocKey(t)) @@ -425,7 +500,7 @@ func TestTree(t *testing.T) { root.GetTree("t").EditBulk(3, 3, []*json.TreeNode{{ Type: "text", Value: "c", - }, &json.TreeNode{ + }, { Type: "text", Value: "d", }}, 0) @@ -451,7 +526,7 @@ func TestTree(t *testing.T) { root.GetTree("t").EditBulk(4, 4, []*json.TreeNode{{ Type: "p", Children: []json.TreeNode{{Type: "text", Value: "cd"}}, - }, &json.TreeNode{ + }, { Type: "i", Children: []json.TreeNode{{Type: "text", Value: "fg"}}, }}, 0) @@ -1343,7 +1418,7 @@ func TestTree(t *testing.T) { assert.Equal(t, "

    a

    b

    ", d1.Root().GetTree("t").ToXML()) }) - t.Run("contained-split-and-split-at-diffrent-positions-on-the-same-node", func(t *testing.T) { + t.Run("contained-split-and-split-at-different-positions-on-the-same-node", func(t *testing.T) { ctx := context.Background() d1 := document.New(helper.TestDocKey(t)) assert.NoError(t, c1.Attach(ctx, d1)) @@ -2623,7 +2698,7 @@ func TestTree(t *testing.T) { assert.Equal(t, "

    a

    b

    ", d1.Root().GetTree("t").ToXML()) }) - t.Run("side-by-side-split-and-delete", func(t *testing.T) { + t.Run("side-by-side-split-and-merge", func(t *testing.T) { ctx := context.Background() d1 := document.New(helper.TestDocKey(t)) assert.NoError(t, c1.Attach(ctx, d1)) @@ -3428,6 +3503,140 @@ func TestTree(t *testing.T) { assert.Equal(t, size, d2.Root().GetTree("t").IndexTree.Root().Len()) }) + t.Run("can calculate size of index tree correctly during concurrent editing", func(t *testing.T) { + ctx := context.Background() + d1 := document.New(helper.TestDocKey(t)) + assert.NoError(t, c1.Attach(ctx, d1)) + d2 := document.New(helper.TestDocKey(t)) + assert.NoError(t, c2.Attach(ctx, d2)) + + assert.NoError(t, d1.Update(func(root *json.Object, p *presence.Presence) error { + root.SetNewTree("t", &json.TreeNode{ + Type: "doc", + Children: []json.TreeNode{{ + Type: "p", + Children: []json.TreeNode{{Type: "text", Value: "hello"}}, + }}, + }) + return nil + })) + assert.NoError(t, c1.Sync(ctx)) + assert.NoError(t, c2.Sync(ctx)) + + assert.Equal(t, "

    hello

    ", d1.Root().GetTree("t").ToXML()) + assert.Equal(t, "

    hello

    ", d2.Root().GetTree("t").ToXML()) + + assert.NoError(t, d1.Update(func(root *json.Object, p *presence.Presence) error { + root.GetTree("t").Edit(0, 7, nil, 0) + return nil + })) + assert.NoError(t, d2.Update(func(root *json.Object, p *presence.Presence) error { + root.GetTree("t").Edit(1, 2, &json.TreeNode{ + Type: "text", + Value: "p", + }, 0) + return nil + })) + assert.Equal(t, "", d1.Root().GetTree("t").ToXML()) + assert.Equal(t, 0, d1.Root().GetTree("t").Len()) + assert.Equal(t, "

    pello

    ", d2.Root().GetTree("t").ToXML()) + assert.Equal(t, 7, d2.Root().GetTree("t").Len()) + assert.NoError(t, c1.Sync(ctx)) + assert.NoError(t, c2.Sync(ctx)) + assert.NoError(t, c1.Sync(ctx)) + + assert.Equal(t, "", d1.Root().GetTree("t").ToXML()) + assert.Equal(t, "", d2.Root().GetTree("t").ToXML()) + assert.Equal(t, d1.Root().GetTree("t").Len(), d2.Root().GetTree("t").Len()) + }) + + t.Run("can keep index tree consistent from snapshot", func(t *testing.T) { + ctx := context.Background() + d1 := document.New(helper.TestDocKey(t)) + assert.NoError(t, c1.Attach(ctx, d1)) + d2 := document.New(helper.TestDocKey(t)) + assert.NoError(t, c2.Attach(ctx, d2)) + + assert.NoError(t, d1.Update(func(root *json.Object, p *presence.Presence) error { + root.SetNewTree("t", &json.TreeNode{ + Type: "r", + Children: []json.TreeNode{{ + Type: "p", + Children: []json.TreeNode{}, + }}, + }) + return nil + })) + assert.NoError(t, c1.Sync(ctx)) + assert.NoError(t, c2.Sync(ctx)) + + assert.Equal(t, "

    ", d1.Root().GetTree("t").ToXML()) + assert.Equal(t, "

    ", d2.Root().GetTree("t").ToXML()) + + assert.NoError(t, d1.Update(func(root *json.Object, p *presence.Presence) error { + root.GetTree("t").Edit(0, 2, nil, 0) + return nil + })) + assert.NoError(t, d2.Update(func(root *json.Object, p *presence.Presence) error { + root.GetTree("t").Edit(1, 1, &json.TreeNode{ + Type: "i", + Children: []json.TreeNode{{Type: "text", Value: "a"}}, + }, 0) + root.GetTree("t").Edit(2, 3, &json.TreeNode{ + Type: "text", + Value: "b", + }, 0) + return nil + })) + assert.Equal(t, "", d1.Root().GetTree("t").ToXML()) + assert.Equal(t, 0, d1.Root().GetTree("t").Len()) + assert.Equal(t, "

    b

    ", d2.Root().GetTree("t").ToXML()) + assert.Equal(t, 5, d2.Root().GetTree("t").Len()) + assert.NoError(t, c1.Sync(ctx)) + assert.NoError(t, c2.Sync(ctx)) + assert.NoError(t, c1.Sync(ctx)) + + assert.Equal(t, "", d1.Root().GetTree("t").ToXML()) + assert.Equal(t, "", d2.Root().GetTree("t").ToXML()) + + type Node struct { + xml string + len int + isRemoved bool + } + var d1Nodes []Node + var d2Nodes []Node + var sNodes []Node + + index.TraverseNode(d1.Root().GetTree("t").IndexTree.Root(), func(node *index.Node[*crdt.TreeNode], depth int) { + d1Nodes = append(d1Nodes, Node{ + xml: index.ToXML(node), + len: node.Len(), + isRemoved: node.Value.IsRemoved(), + }) + }) + index.TraverseNode(d2.Root().GetTree("t").IndexTree.Root(), func(node *index.Node[*crdt.TreeNode], depth int) { + d2Nodes = append(d2Nodes, Node{ + xml: index.ToXML(node), + len: node.Len(), + isRemoved: node.Value.IsRemoved(), + }) + }) + obj, err := converter.ObjectToBytes(d1.RootObject()) + assert.NoError(t, err) + sRoot, err := converter.BytesToObject(obj) + assert.NoError(t, err) + index.TraverseNode(sRoot.Get("t").(*crdt.Tree).IndexTree.Root(), func(node *index.Node[*crdt.TreeNode], depth int) { + sNodes = append(sNodes, Node{ + xml: index.ToXML(node), + len: node.Len(), + isRemoved: node.Value.IsRemoved(), + }) + }) + assert.ObjectsAreEqual(d1Nodes, d2Nodes) + assert.ObjectsAreEqual(d1Nodes, sNodes) + }) + t.Run("can split and merge with empty paragraph: left", func(t *testing.T) { ctx := context.Background() d1 := document.New(helper.TestDocKey(t)) diff --git a/test/sharding/mongo_client_test.go b/test/sharding/mongo_client_test.go index c041ec977..0653e0200 100644 --- a/test/sharding/mongo_client_test.go +++ b/test/sharding/mongo_client_test.go @@ -72,6 +72,10 @@ func TestClientWithShardedDB(t *testing.T) { testcases.RunFindDocInfoTest(t, cli, dummyProjectID) }) + t.Run("RunFindDocInfosByKeys test", func(t *testing.T) { + testcases.RunFindDocInfosByKeysTest(t, cli, dummyProjectID) + }) + t.Run("RunFindDocInfosByQuery test", func(t *testing.T) { t.Skip("TODO(hackerwins): the order of docInfos is different with memDB") testcases.RunFindDocInfosByQueryTest(t, cli, projectOneID) diff --git a/test/sharding/server_test.go b/test/sharding/server_test.go index 1351a106d..7305598fd 100644 --- a/test/sharding/server_test.go +++ b/test/sharding/server_test.go @@ -65,6 +65,7 @@ func TestMain(m *testing.M) { be, err := backend.New(&backend.Config{ AdminUser: helper.AdminUser, AdminPassword: helper.AdminPassword, + UseDefaultProject: helper.UseDefaultProject, ClientDeactivateThreshold: helper.ClientDeactivateThreshold, SnapshotThreshold: helper.SnapshotThreshold, AuthWebhookCacheSize: helper.AuthWebhookSize, From 96f70c478141034aa75e0b63e2dfe29b5769f397 Mon Sep 17 00:00:00 2001 From: yeongha Date: Tue, 30 Jul 2024 00:39:45 +0900 Subject: [PATCH 19/24] Changed document hard deletion code to improve housekeeping structure --- cmd/yorkie/server.go | 16 +- .../backend/database/testcases/testcases.go | 2 +- server/backend/housekeeping/config.go | 23 +- server/backend/housekeeping/config_test.go | 5 +- server/backend/housekeeping/housekeeping.go | 282 ++---------------- server/clients/housekeeping.go | 107 ++++++- server/config.go | 2 +- server/rpc/server_test.go | 2 +- server/server.go | 56 +++- test/helper/helper.go | 2 +- test/sharding/server_test.go | 2 +- 11 files changed, 201 insertions(+), 298 deletions(-) diff --git a/cmd/yorkie/server.go b/cmd/yorkie/server.go index 558feea5c..9cf227862 100644 --- a/cmd/yorkie/server.go +++ b/cmd/yorkie/server.go @@ -73,7 +73,7 @@ func newServerCmd() *cobra.Command { conf.Housekeeping.IntervalDeactivateCandidates = housekeepingIntervalDeactivateCandidates.String() conf.Housekeeping.IntervalDeleteDocuments = housekeepingIntervalDeleteDocuments.String() - conf.Housekeeping.DocumentHardDeletionGracefulPeriod = documentHardDeletionGracefulPeriod.String() + conf.Housekeeping.DocumentHardDeletionGracefulPeriod = documentHardDeletionGracefulPeriod if mongoConnectionURI != "" { conf.Mongo = &mongo.Config{ @@ -197,20 +197,20 @@ func init() { false, "Enable runtime profiling data via HTTP server.", ) - cmd.Flags().DurationVar( - &housekeepingIntervalDeactivateCandidates, + cmd.Flags().StringVar( + &conf.Housekeeping.IntervalDeactivateCandidates, "housekeeping-interval-Deactivate-Candidates", - server.DefaultHousekeepingIntervalDeactivateCandidates, + server.DefaultHousekeepingIntervalDeactivateCandidates.String(), "housekeeping Interval deactivate candidates between housekeeping runs", ) - cmd.Flags().DurationVar( - &housekeepingIntervalDeleteDocuments, + cmd.Flags().StringVar( + &conf.Housekeeping.IntervalDeleteDocuments, "housekeeping-interval-Delete-Documents", - server.DefaultHousekeepingIntervalDeleteDocuments, + server.DefaultHousekeepingIntervalDeleteDocuments.String(), "housekeeping Interval delete documents between housekeeping runs", ) cmd.Flags().DurationVar( - &documentHardDeletionGracefulPeriod, + &conf.Housekeeping.DocumentHardDeletionGracefulPeriod, "housekeeping-DocumentHardDeletion-delete-graceful-period", server.DefaultHousekeepingDocumentHardDeletionGracefulPeriod, "Document deletion over time after a single housekeeping run", diff --git a/server/backend/database/testcases/testcases.go b/server/backend/database/testcases/testcases.go index 9a8184832..5917183d9 100644 --- a/server/backend/database/testcases/testcases.go +++ b/server/backend/database/testcases/testcases.go @@ -1403,7 +1403,7 @@ func RunDocumentHardDeletionTest(t *testing.T, db database.Database) { assert.NoError(t, err) docInfo, err := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), helper.TestDocKey(t), true) assert.NoError(t, err) - assert.NoError(t, clientInfo.AttachDocument(docInfo.ID)) + assert.NoError(t, clientInfo.AttachDocument(docInfo.ID, false)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) assert.NoError(t, clientInfo.RemoveDocument(docInfo.ID)) diff --git a/server/backend/housekeeping/config.go b/server/backend/housekeeping/config.go index 3fc9e16ff..c19be42c4 100644 --- a/server/backend/housekeeping/config.go +++ b/server/backend/housekeeping/config.go @@ -32,7 +32,7 @@ type Config struct { IntervalDeleteDocuments string `yaml:"IntervalDeleteDocuments"` // DocumentHardDeletionGracefulPeriod finds documents whose removed_at time is older than that time. - DocumentHardDeletionGracefulPeriod string `yaml:"HousekeepingDocumentHardDeletionGracefulPeriod"` + DocumentHardDeletionGracefulPeriod time.Duration `yaml:"HousekeepingDocumentHardDeletionGracefulPeriod"` // ClientDeactivationCandidateLimitPerProject is the maximum number of candidates to be returned per project. ClientDeactivationCandidateLimitPerProject int `yaml:"ClientDeactivationCandidateLimitPerProject"` @@ -62,24 +62,23 @@ func (c *Config) Validate() error { ) } - if _, err := time.ParseDuration(c.DocumentHardDeletionGracefulPeriod); err != nil { + if c.DocumentHardDeletionGracefulPeriod <= 0 { return fmt.Errorf( - `invalid argument %v for "--housekeeping-project-delete-graceful-period" flag: %w`, + `invalid argument %v for "--housekeeping-project-delete-graceful-period"`, c.DocumentHardDeletionGracefulPeriod, - err, ) } if c.ClientDeactivationCandidateLimitPerProject <= 0 { return fmt.Errorf( - `invalid argument %d for "--housekeeping-candidates-limit-per-project" flag`, - c.ProjectFetchSize, + `invalid argument %d for "--housekeeping-client-deactivateion-candidate-limit-per-project"`, + c.ClientDeactivationCandidateLimitPerProject, ) } if c.DocumentHardDeletionCandidateLimitPerProject <= 0 { return fmt.Errorf( - `invalid argument %d for "--housekeeping-document-hard-deletion-limit-per-project" flag`, + `invalid argument %d for "--housekeeping-document-hard-deletion-limit-per-project"`, c.DocumentHardDeletionCandidateLimitPerProject, ) } @@ -95,11 +94,13 @@ func (c *Config) Validate() error { } // ParseInterval parses the interval. -func (c *Config) ParseInterval() (time.Duration, error) { - interval, err := time.ParseDuration(c.Interval) +func (c *Config) ParseInterval( + interval string, +) (time.Duration, error) { + parseInterval, err := time.ParseDuration(interval) if err != nil { - return 0, fmt.Errorf("parse interval %s: %w", c.Interval, err) + return 0, fmt.Errorf("parse interval %s: %w", interval, err) } - return interval, nil + return parseInterval, nil } diff --git a/server/backend/housekeeping/config_test.go b/server/backend/housekeeping/config_test.go index 15f8ce469..1cad2c5e6 100644 --- a/server/backend/housekeeping/config_test.go +++ b/server/backend/housekeeping/config_test.go @@ -18,6 +18,7 @@ package housekeeping_test import ( "testing" + "time" "github.com/stretchr/testify/assert" @@ -29,7 +30,7 @@ func TestConfig(t *testing.T) { validConf := housekeeping.Config{ IntervalDeactivateCandidates: "1m", IntervalDeleteDocuments: "1m", - DocumentHardDeletionGracefulPeriod: "1m", + DocumentHardDeletionGracefulPeriod: time.Minute, ClientDeactivationCandidateLimitPerProject: 100, DocumentHardDeletionCandidateLimitPerProject: 100, ProjectFetchSize: 100, @@ -45,7 +46,7 @@ func TestConfig(t *testing.T) { assert.Error(t, conf2.Validate()) conf3 := validConf - conf3.DocumentHardDeletionGracefulPeriod = "second" + conf3.DocumentHardDeletionGracefulPeriod = 0 assert.Error(t, conf3.Validate()) conf4 := validConf diff --git a/server/backend/housekeeping/housekeeping.go b/server/backend/housekeeping/housekeeping.go index 029260d18..519b8f009 100644 --- a/server/backend/housekeeping/housekeeping.go +++ b/server/backend/housekeeping/housekeeping.go @@ -26,27 +26,22 @@ import ( "github.com/yorkie-team/yorkie/server/logging" ) -const ( // existing commit - deactivateCandidatesKey = "housekeeping/deactivateCandidates" - documentHardDeletionLockKey = "housekeeping/DocumentHardDeletionLock" -) +/* existing commit -// Housekeeping is the housekeeping service. It periodically runs housekeeping -// tasks. -type Housekeeping struct { - Config *Config - /* existing commit +database database.Database +coordinator sync.Coordinator - database database.Database - coordinator sync.Coordinator +intervalDeactivateCandidates time.Duration +intervalDeleteDocuments time.Duration +documentHardDeletionGracefulPeriod time.Duration +clientDeactivationCandidateLimitPerProject int +DocumentHardDeletionCandidateLimitPerProject int +projectFetchSize int +*/ - intervalDeactivateCandidates time.Duration - intervalDeleteDocuments time.Duration - documentHardDeletionGracefulPeriod time.Duration - clientDeactivationCandidateLimitPerProject int - DocumentHardDeletionCandidateLimitPerProject int - projectFetchSize int - */ +// Housekeeping is the housekeeping service. It periodically runs housekeeping tasks. +type Housekeeping struct { + Config *Config scheduler gocron.Scheduler } @@ -68,7 +63,9 @@ func New(conf *Config) (*Housekeeping, error) { intervalDeleteDocuments, err := time.ParseDuration(conf.IntervalDeleteDocuments) if err != nil { */ - return nil, fmt.Errorf("new scheduler: %w", err) + if err != nil { + return nil, fmt.Errorf("new scheduler: %w", err) + } /* existing commit return nil, fmt.Errorf("parse intervalDeleteDocuments %s: %w", conf.IntervalDeleteDocuments, err) } @@ -101,11 +98,24 @@ func New(conf *Config) (*Housekeeping, error) { // RegisterTask registers task the housekeeping service. func (h *Housekeeping) RegisterTask( - interval time.Duration, + intervalDeactivateCandidates time.Duration, + intervalDeleteDocuments time.Duration, task func(ctx context.Context) error, ) error { if _, err := h.scheduler.NewJob( - gocron.DurationJob(interval), + gocron.DurationJob(intervalDeactivateCandidates), + gocron.NewTask(func() { + ctx := context.Background() + if err := task(ctx); err != nil { + logging.From(ctx).Error(err) + } + }), + ); err != nil { + return fmt.Errorf("scheduler new job: %w", err) + } + + if _, err := h.scheduler.NewJob( + gocron.DurationJob(intervalDeleteDocuments), gocron.NewTask(func() { ctx := context.Background() if err := task(ctx); err != nil { @@ -122,10 +132,6 @@ func (h *Housekeeping) RegisterTask( // Start starts the housekeeping service. func (h *Housekeeping) Start() error { h.scheduler.Start() - /* existing commit - go h.AttachDeactivateCandidates()밋 - go h.AttachDocumentHardDeletion() - */ return nil } @@ -138,231 +144,5 @@ func (h *Housekeeping) Stop() error { if err := h.scheduler.Shutdown(); err != nil { return fmt.Errorf("scheduler shutdown: %w", err) } - /* existing commit - h.cancelFunc() - */ return nil } - -/* existing commit -// AttachDeactivateCandidates is the housekeeping loop for DeactivateCandidates -func (h *Housekeeping) AttachDeactivateCandidates() { - housekeepingLastProjectID := database.DefaultProjectID - - for { - ctx := context.Background() - lastProjectID, err := h.deactivateCandidates(ctx, housekeepingLastProjectID) - if err != nil { - logging.From(ctx).Error(err) - continue - } - - housekeepingLastProjectID = lastProjectID - - select { - case <-time.After(h.intervalDeactivateCandidates): - case <-h.ctx.Done(): - return - } - } -} - -// AttachDocumentHardDeletion is the housekeeping loop for DocumentHardDeletion -func (h *Housekeeping) AttachDocumentHardDeletion() { - housekeepingLastProjectID := database.DefaultProjectID - - for { - ctx := context.Background() - lastProjectID, err := h.DeleteDocument(ctx, housekeepingLastProjectID) - if err != nil { - logging.From(ctx).Error(err) - continue - } - - housekeepingLastProjectID = lastProjectID - - select { - case <-time.After(h.intervalDeleteDocuments): - case <-h.ctx.Done(): - return - } - } -} - -// DeleteDocument deletes a document -func (h *Housekeeping) DeleteDocument( - ctx context.Context, - housekeepingLastProjectID types.ID, -) (types.ID, error) { - start := time.Now() - locker, err := h.coordinator.NewLocker(ctx, documentHardDeletionLockKey) - if err != nil { - return database.DefaultProjectID, err - } - - if err := locker.Lock(ctx); err != nil { - return database.DefaultProjectID, err - } - - defer func() { - if err := locker.Unlock(ctx); err != nil { - logging.From(ctx).Error(err) - } - }() - - lastProjectID, candidates, err := h.FindDocumentHardDeletionCandidates( - ctx, - h.DocumentHardDeletionCandidateLimitPerProject, - h.projectFetchSize, - h.documentHardDeletionGracefulPeriod, - housekeepingLastProjectID, - ) - - if err != nil { - return database.DefaultProjectID, err - } - - deletedDocumentsCount, err := h.database.DeleteDocument(ctx, candidates) - - if err != nil { - return database.DefaultProjectID, err - } - - if len(candidates) > 0 { - logging.From(ctx).Infof( - "HSKP: candidates %d, hard deleted %d, %s", - len(candidates), - deletedDocumentsCount, - time.Since(start), - ) - } - - return lastProjectID, nil -} - -// deactivateCandidates deactivates candidates. -func (h *Housekeeping) deactivateCandidates( - ctx context.Context, - housekeepingLastProjectID types.ID, -) (types.ID, error) { - start := time.Now() - locker, err := h.coordinator.NewLocker(ctx, deactivateCandidatesKey) - if err != nil { - return database.DefaultProjectID, err - } - - if err := locker.Lock(ctx); err != nil { - return database.DefaultProjectID, err - } - - defer func() { - if err := locker.Unlock(ctx); err != nil { - logging.From(ctx).Error(err) - } - }() - - lastProjectID, candidates, err := h.FindDeactivateCandidates( - ctx, - h.clientDeactivationCandidateLimitPerProject, - h.projectFetchSize, - housekeepingLastProjectID, - ) - if err != nil { - return database.DefaultProjectID, err - } - - deactivatedCount := 0 - for _, clientInfo := range candidates { - if _, err := clients.Deactivate( - ctx, - h.database, - clientInfo.RefKey(), - ); err != nil { - return database.DefaultProjectID, err - } - - deactivatedCount++ - } - - if len(candidates) > 0 { - logging.From(ctx).Infof( - "HSKP: candidates %d, deactivated %d, %s", - len(candidates), - deactivatedCount, - time.Since(start), - ) - } - - return lastProjectID, nil -} - -// FindDeactivateCandidates finds the housekeeping candidates. -func (h *Housekeeping) FindDeactivateCandidates( - ctx context.Context, - clientDeactivationCandidateLimitPerProject int, - projectFetchSize int, - lastProjectID types.ID, -) (types.ID, []*database.ClientInfo, error) { - projects, err := h.database.FindNextNCyclingProjectInfos(ctx, projectFetchSize, lastProjectID) - if err != nil { - return database.DefaultProjectID, nil, err - } - - var candidates []*database.ClientInfo - for _, project := range projects { - infos, err := h.database.FindDeactivateCandidatesPerProject(ctx, project, clientDeactivationCandidateLimitPerProject) - if err != nil { - return database.DefaultProjectID, nil, err - } - - candidates = append(candidates, infos...) - } - - var topProjectID types.ID - if len(projects) < projectFetchSize { - topProjectID = database.DefaultProjectID - } else { - topProjectID = projects[len(projects)-1].ID - } - - return topProjectID, candidates, nil -} - -// FindDocumentHardDeletionCandidates finds the clients that need housekeeping. -func (h *Housekeeping) FindDocumentHardDeletionCandidates( - ctx context.Context, - documentHardDeletionCandidateLimitPerProject int, - projectFetchSize int, - deletedAfterTime time.Duration, - lastProjectID types.ID, -) (types.ID, []*database.DocInfo, error) { - projects, err := h.database.FindNextNCyclingProjectInfos(ctx, projectFetchSize, lastProjectID) - if err != nil { - return database.DefaultProjectID, nil, err - } - - var candidates []*database.DocInfo - for _, project := range projects { - infos, err := h.database.FindDocumentHardDeletionCandidatesPerProject( - ctx, - project, - documentHardDeletionCandidateLimitPerProject, - deletedAfterTime, - ) - if err != nil { - return database.DefaultProjectID, nil, err - } - - candidates = append(candidates, infos...) - } - - var topProjectID types.ID - if len(projects) < projectFetchSize { - topProjectID = database.DefaultProjectID - } else { - topProjectID = projects[len(projects)-1].ID - } - - return topProjectID, candidates, nil -} -*/ diff --git a/server/clients/housekeeping.go b/server/clients/housekeeping.go index 76ab28bd8..2209bab82 100644 --- a/server/clients/housekeeping.go +++ b/server/clients/housekeeping.go @@ -27,7 +27,8 @@ import ( ) const ( - deactivateCandidatesKey = "housekeeping/deactivateCandidates" + deactivateCandidatesKey = "housekeeping/deactivateCandidates" + documentHardDeletionLockKey = "housekeeping/DocumentHardDeletionLock" ) // DeactivateInactives deactivates clients that have not been active for a @@ -35,7 +36,7 @@ const ( func DeactivateInactives( ctx context.Context, be *backend.Backend, - candidatesLimitPerProject int, + clientDeactivationCandidateLimitPerProject int, projectFetchSize int, housekeepingLastProjectID types.ID, ) (types.ID, error) { @@ -59,7 +60,7 @@ func DeactivateInactives( lastProjectID, candidates, err := FindDeactivateCandidates( ctx, be, - candidatesLimitPerProject, + clientDeactivationCandidateLimitPerProject, projectFetchSize, housekeepingLastProjectID, ) @@ -92,7 +93,7 @@ func DeactivateInactives( func FindDeactivateCandidates( ctx context.Context, be *backend.Backend, - candidatesLimitPerProject int, + clientDeactivationCandidateLimitPerProject int, projectFetchSize int, lastProjectID types.ID, ) (types.ID, []*database.ClientInfo, error) { @@ -103,7 +104,103 @@ func FindDeactivateCandidates( var candidates []*database.ClientInfo for _, project := range projects { - infos, err := be.DB.FindDeactivateCandidatesPerProject(ctx, project, candidatesLimitPerProject) + infos, err := be.DB.FindDeactivateCandidatesPerProject(ctx, project, clientDeactivationCandidateLimitPerProject) + if err != nil { + return database.DefaultProjectID, nil, err + } + + candidates = append(candidates, infos...) + } + + var topProjectID types.ID + if len(projects) < projectFetchSize { + topProjectID = database.DefaultProjectID + } else { + topProjectID = projects[len(projects)-1].ID + } + + return topProjectID, candidates, nil +} + +// DeleteDocument deletes a document +func DeleteDocument( + ctx context.Context, + be *backend.Backend, + documentHardDeletionCandidateLimitPerProject int, + documentHardDeletionGracefulPeriod time.Duration, + projectFetchSize int, + housekeepingLastProjectID types.ID, +) (types.ID, error) { + + start := time.Now() + locker, err := be.Coordinator.NewLocker(ctx, documentHardDeletionLockKey) + if err != nil { + return database.DefaultProjectID, err + } + + if err := locker.Lock(ctx); err != nil { + return database.DefaultProjectID, err + } + + defer func() { + if err := locker.Unlock(ctx); err != nil { + logging.From(ctx).Error(err) + } + }() + + lastProjectID, candidates, err := FindDocumentHardDeletionCandidates( + ctx, + be, + documentHardDeletionCandidateLimitPerProject, + projectFetchSize, + documentHardDeletionGracefulPeriod, + housekeepingLastProjectID, + ) + + if err != nil { + return database.DefaultProjectID, err + } + + deletedDocumentsCount, err := be.DB.DeleteDocument(ctx, candidates) + + if err != nil { + return database.DefaultProjectID, err + } + + if len(candidates) > 0 { + logging.From(ctx).Infof( + "HSKP: candidates %d, hard deleted %d, %s", + len(candidates), + deletedDocumentsCount, + time.Since(start), + ) + } + + return lastProjectID, nil +} + +// FindDocumentHardDeletionCandidates finds the clients that need housekeeping. +func FindDocumentHardDeletionCandidates( + ctx context.Context, + be *backend.Backend, + documentHardDeletionCandidateLimitPerProject int, + projectFetchSize int, + deletedAfterTime time.Duration, + lastProjectID types.ID, +) (types.ID, []*database.DocInfo, error) { + projects, err := be.DB.FindNextNCyclingProjectInfos(ctx, projectFetchSize, lastProjectID) + if err != nil { + return database.DefaultProjectID, nil, err + } + + var candidates []*database.DocInfo + for _, project := range projects { + infos, err := be.DB.FindDocumentHardDeletionCandidatesPerProject( + ctx, + project, + documentHardDeletionCandidateLimitPerProject, + deletedAfterTime, + ) if err != nil { return database.DefaultProjectID, nil, err } diff --git a/server/config.go b/server/config.go index c04b356e1..3f6a91568 100644 --- a/server/config.go +++ b/server/config.go @@ -234,7 +234,7 @@ func newConfig(port int, profilingPort int) *Config { Housekeeping: &housekeeping.Config{ IntervalDeactivateCandidates: DefaultHousekeepingIntervalDeactivateCandidates.String(), IntervalDeleteDocuments: DefaultHousekeepingIntervalDeleteDocuments.String(), - DocumentHardDeletionGracefulPeriod: DefaultHousekeepingDocumentHardDeletionGracefulPeriod.String(), + DocumentHardDeletionGracefulPeriod: DefaultHousekeepingDocumentHardDeletionGracefulPeriod, ClientDeactivationCandidateLimitPerProject: DefaultHousekeepingClientDeactivationCandidateLimitPerProject, DocumentHardDeletionCandidateLimitPerProject: DefaultHousekeepingDocumentHardDeletionCandidateLimitPerProject, ProjectFetchSize: DefaultHousekeepingProjectFetchSize, diff --git a/server/rpc/server_test.go b/server/rpc/server_test.go index 57f234d04..0ada39c00 100644 --- a/server/rpc/server_test.go +++ b/server/rpc/server_test.go @@ -85,7 +85,7 @@ func TestMain(m *testing.M) { }, &housekeeping.Config{ IntervalDeactivateCandidates: helper.HousekeepingIntervalDeactivateCandidates.String(), IntervalDeleteDocuments: helper.HousekeepingIntervalDeleteDocuments.String(), - DocumentHardDeletionGracefulPeriod: helper.HousekeepingDocumentHardDeletionGracefulPeriod.String(), + DocumentHardDeletionGracefulPeriod: helper.HousekeepingDocumentHardDeletionGracefulPeriod, ClientDeactivationCandidateLimitPerProject: helper.HousekeepingClientDeactivationCandidateLimitPerProject, DocumentHardDeletionCandidateLimitPerProject: helper.HousekeepingDocumentHardDeletionCandidateLimitPerProject, ProjectFetchSize: helper.HousekeepingProjectFetchSize, diff --git a/server/server.go b/server/server.go index 6a777f5d5..5f69cf5af 100644 --- a/server/server.go +++ b/server/server.go @@ -159,27 +159,51 @@ func (r *Yorkie) DeactivateClient(ctx context.Context, c1 *client.Client) error // RegisterHousekeepingTasks registers housekeeping tasks. func (r *Yorkie) RegisterHousekeepingTasks(be *backend.Backend) error { - interval, err := be.Housekeeping.Config.ParseInterval() + intervalDeactivateCandidates, err := + be.Housekeeping.Config.ParseInterval(be.Housekeeping.Config.IntervalDeactivateCandidates) if err != nil { return err } - housekeepingLastProjectID := database.DefaultProjectID - return be.Housekeeping.RegisterTask(interval, func(ctx context.Context) error { - lastProjectID, err := clients.DeactivateInactives( - ctx, - be, - be.Housekeeping.Config.CandidatesLimitPerProject, - be.Housekeeping.Config.ProjectFetchSize, - housekeepingLastProjectID, - ) - if err != nil { - return err - } + intervalDeleteDocuments, err := + be.Housekeeping.Config.ParseInterval(be.Housekeeping.Config.IntervalDeleteDocuments) + if err != nil { + return err + } - housekeepingLastProjectID = lastProjectID - return nil - }) + housekeepingLastDeactivateInactivesProjectID := database.DefaultProjectID + housekeepingLastDeleteDocumentProjectID := database.DefaultProjectID + return be.Housekeeping.RegisterTask( + intervalDeactivateCandidates, intervalDeleteDocuments, + func(ctx context.Context) error { + lastProjectDeactivateInactivesID, err := clients.DeactivateInactives( + ctx, + be, + be.Housekeeping.Config.ClientDeactivationCandidateLimitPerProject, + be.Housekeeping.Config.ProjectFetchSize, + housekeepingLastDeactivateInactivesProjectID, + ) + if err != nil { + return err + } + + // Second task: Document hard deletes + lastProjectDeleteDocumentID, err := clients.DeleteDocument( + ctx, + be, + be.Housekeeping.Config.DocumentHardDeletionCandidateLimitPerProject, + be.Housekeeping.Config.DocumentHardDeletionGracefulPeriod, + be.Housekeeping.Config.ProjectFetchSize, + housekeepingLastDeleteDocumentProjectID, + ) + if err != nil { + return err + } + + housekeepingLastDeactivateInactivesProjectID = lastProjectDeactivateInactivesID + housekeepingLastDeleteDocumentProjectID = lastProjectDeleteDocumentID + return nil + }) } // DefaultProject returns the default project. diff --git a/test/helper/helper.go b/test/helper/helper.go index 90688f9f1..0ac885057 100644 --- a/test/helper/helper.go +++ b/test/helper/helper.go @@ -240,7 +240,7 @@ func TestConfig() *server.Config { Housekeeping: &housekeeping.Config{ IntervalDeactivateCandidates: HousekeepingIntervalDeactivateCandidates.String(), IntervalDeleteDocuments: HousekeepingIntervalDeleteDocuments.String(), - DocumentHardDeletionGracefulPeriod: HousekeepingDocumentHardDeletionGracefulPeriod.String(), + DocumentHardDeletionGracefulPeriod: HousekeepingDocumentHardDeletionGracefulPeriod, ClientDeactivationCandidateLimitPerProject: HousekeepingClientDeactivationCandidateLimitPerProject, DocumentHardDeletionCandidateLimitPerProject: HousekeepingDocumentHardDeletionCandidateLimitPerProject, ProjectFetchSize: HousekeepingProjectFetchSize, diff --git a/test/sharding/server_test.go b/test/sharding/server_test.go index 7305598fd..c01247ff8 100644 --- a/test/sharding/server_test.go +++ b/test/sharding/server_test.go @@ -80,7 +80,7 @@ func TestMain(m *testing.M) { }, &housekeeping.Config{ IntervalDeactivateCandidates: helper.HousekeepingIntervalDeactivateCandidates.String(), IntervalDeleteDocuments: helper.HousekeepingIntervalDeleteDocuments.String(), - DocumentHardDeletionGracefulPeriod: helper.HousekeepingDocumentHardDeletionGracefulPeriod.String(), + DocumentHardDeletionGracefulPeriod: helper.HousekeepingDocumentHardDeletionGracefulPeriod, ClientDeactivationCandidateLimitPerProject: helper.HousekeepingClientDeactivationCandidateLimitPerProject, DocumentHardDeletionCandidateLimitPerProject: helper.HousekeepingDocumentHardDeletionCandidateLimitPerProject, ProjectFetchSize: helper.HousekeepingProjectFetchSize, From c17108505cce96e85067eb4738c5c620f2481432 Mon Sep 17 00:00:00 2001 From: yeongha Date: Tue, 30 Jul 2024 23:09:34 +0900 Subject: [PATCH 20/24] DocumentHardDeletionGracefulPeriod type and value change --- server/backend/housekeeping/config_test.go | 3 +-- test/helper/helper.go | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/server/backend/housekeeping/config_test.go b/server/backend/housekeeping/config_test.go index 1cad2c5e6..6317663d7 100644 --- a/server/backend/housekeeping/config_test.go +++ b/server/backend/housekeeping/config_test.go @@ -18,7 +18,6 @@ package housekeeping_test import ( "testing" - "time" "github.com/stretchr/testify/assert" @@ -30,7 +29,7 @@ func TestConfig(t *testing.T) { validConf := housekeeping.Config{ IntervalDeactivateCandidates: "1m", IntervalDeleteDocuments: "1m", - DocumentHardDeletionGracefulPeriod: time.Minute, + DocumentHardDeletionGracefulPeriod: 60, ClientDeactivationCandidateLimitPerProject: 100, DocumentHardDeletionCandidateLimitPerProject: 100, ProjectFetchSize: 100, diff --git a/test/helper/helper.go b/test/helper/helper.go index a8f3d3549..65f7832c2 100644 --- a/test/helper/helper.go +++ b/test/helper/helper.go @@ -68,7 +68,7 @@ var ( UseDefaultProject = true HousekeepingIntervalDeactivateCandidates = 10 * gotime.Second HousekeepingIntervalDeleteDocuments = 10 * gotime.Second - HousekeepingDocumentHardDeletionGracefulPeriod = 0 * gotime.Second + HousekeepingDocumentHardDeletionGracefulPeriod = 10 * gotime.Second HousekeepingClientDeactivationCandidateLimitPerProject = 10 HousekeepingDocumentHardDeletionCandidateLimitPerProject = 10 HousekeepingProjectFetchSize = 10 From 13369fcc1f4e81b6dc3e161d5acb1d9b94b41db2 Mon Sep 17 00:00:00 2001 From: yeongha Date: Thu, 1 Aug 2024 22:59:01 +0900 Subject: [PATCH 21/24] coderabbitai comments reflected, HousekeepingDocumentHardDeletionGracefulPeriod default hour 14h -> 336h (14day * 24h) --- server/backend/database/mongo/client.go | 10 ++++++++-- server/config.go | 2 +- server/config.sample.yml | 4 ++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/server/backend/database/mongo/client.go b/server/backend/database/mongo/client.go index 12d2011d3..32da93466 100644 --- a/server/backend/database/mongo/client.go +++ b/server/backend/database/mongo/client.go @@ -236,6 +236,12 @@ func (c *Client) DeleteDocument( return 0, nil } + for _, docInfo := range candidates { + if docInfo.ID == "" { + return 0, fmt.Errorf("invalid document ID") + } + } + var idList []types.ID for _, docInfo := range candidates { idList = append( @@ -250,7 +256,7 @@ func (c *Client) DeleteDocument( ) if err != nil { - return deletedResult.DeletedCount, fmt.Errorf("deletion Error : %w", err) + return deletedResult.DeletedCount, fmt.Errorf("failed to delete documents: %w", err) } return deletedResult.DeletedCount, nil @@ -769,7 +775,7 @@ func (c *Client) FindDeactivateCandidates( ) (types.ID, []*database.ClientInfo, error) { projects, err := c.FindNextNCyclingProjectInfos(ctx, projectFetchSize, lastProjectID) if err != nil { - return database.DefaultProjectID, nil, err + return database.DefaultProjectID, nil, fmt.Errorf("failed to find cycling project infos: %w", err) } var candidates []*database.ClientInfo diff --git a/server/config.go b/server/config.go index 3f6a91568..8e73ef0fc 100644 --- a/server/config.go +++ b/server/config.go @@ -42,7 +42,7 @@ const ( DefaultHousekeepingIntervalDeactivateCandidates = 30 * time.Second DefaultHousekeepingIntervalDeleteDocuments = 30 * time.Second - DefaultHousekeepingDocumentHardDeletionGracefulPeriod = 24 * time.Hour + DefaultHousekeepingDocumentHardDeletionGracefulPeriod = 14 * 24 * time.Hour DefaultHousekeepingClientDeactivationCandidateLimitPerProject = 500 DefaultHousekeepingDocumentHardDeletionCandidateLimitPerProject = 500 DefaultHousekeepingProjectFetchSize = 100 diff --git a/server/config.sample.yml b/server/config.sample.yml index d75118068..b2c75201e 100644 --- a/server/config.sample.yml +++ b/server/config.sample.yml @@ -36,8 +36,8 @@ Housekeeping: # IntervalDeleteDocuments is the time between housekeeping runs (default: 1m). IntervalDeleteDocuments: 1m - # HousekeepingDocumentHardDeletionGracefulPeriod finds documents whose removed_at time is older than that time. (default: 24h). - HousekeepingDocumentHardDeletionGracefulPeriod: 24h + # HousekeepingDocumentHardDeletionGracefulPeriod finds documents whose removed_at time is older than that time. (default: 336h). + HousekeepingDocumentHardDeletionGracefulPeriod: 336h # ClientDeactivationCandidateLimitPerProject is the maximum number of candidates to be returned per project (default: 100). ClientDeactivationCandidateLimitPerProject: 100 From 6cc0e199cc7723c381ac85a1a8df6d3784f694dd Mon Sep 17 00:00:00 2001 From: yeongha Date: Sat, 3 Aug 2024 00:29:21 +0900 Subject: [PATCH 22/24] Resolving race conditions and separating gocron task code --- server/backend/housekeeping/housekeeping.go | 11 ++++++----- server/server.go | 7 ++++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/server/backend/housekeeping/housekeeping.go b/server/backend/housekeeping/housekeeping.go index 0209d02d0..d600ee584 100644 --- a/server/backend/housekeeping/housekeeping.go +++ b/server/backend/housekeeping/housekeeping.go @@ -50,30 +50,31 @@ func New(conf *Config) (*Housekeeping, error) { func (h *Housekeeping) RegisterTask( intervalDeactivateCandidates time.Duration, intervalDeleteDocuments time.Duration, - task func(ctx context.Context) error, + taskDeactivateCandidates func(ctx context.Context) error, + taskDeleteDocuments func(ctx context.Context) error, ) error { if _, err := h.scheduler.NewJob( gocron.DurationJob(intervalDeactivateCandidates), gocron.NewTask(func() { ctx := context.Background() - if err := task(ctx); err != nil { + if err := taskDeactivateCandidates(ctx); err != nil { logging.From(ctx).Error(err) } }), ); err != nil { - return fmt.Errorf("scheduler new job: %w", err) + return fmt.Errorf("scheduler new job for deactivating candidates: %w", err) } if _, err := h.scheduler.NewJob( gocron.DurationJob(intervalDeleteDocuments), gocron.NewTask(func() { ctx := context.Background() - if err := task(ctx); err != nil { + if err := taskDeleteDocuments(ctx); err != nil { logging.From(ctx).Error(err) } }), ); err != nil { - return fmt.Errorf("scheduler new job: %w", err) + return fmt.Errorf("scheduler new job for deleting documents: %w", err) } return nil diff --git a/server/server.go b/server/server.go index 5f69cf5af..5793f3417 100644 --- a/server/server.go +++ b/server/server.go @@ -186,8 +186,10 @@ func (r *Yorkie) RegisterHousekeepingTasks(be *backend.Backend) error { if err != nil { return err } - - // Second task: Document hard deletes + housekeepingLastDeactivateInactivesProjectID = lastProjectDeactivateInactivesID + return nil + }, + func(ctx context.Context) error { lastProjectDeleteDocumentID, err := clients.DeleteDocument( ctx, be, @@ -200,7 +202,6 @@ func (r *Yorkie) RegisterHousekeepingTasks(be *backend.Backend) error { return err } - housekeepingLastDeactivateInactivesProjectID = lastProjectDeactivateInactivesID housekeepingLastDeleteDocumentProjectID = lastProjectDeleteDocumentID return nil }) From 7d636a38cc77a5e6451c5017c9c2847fb33670f9 Mon Sep 17 00:00:00 2001 From: yeongha Date: Sat, 3 Aug 2024 13:29:13 +0900 Subject: [PATCH 23/24] testConfig ProjectFetchSize change --- server/backend/housekeeping/config_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/backend/housekeeping/config_test.go b/server/backend/housekeeping/config_test.go index 6317663d7..120729a50 100644 --- a/server/backend/housekeeping/config_test.go +++ b/server/backend/housekeeping/config_test.go @@ -57,7 +57,7 @@ func TestConfig(t *testing.T) { assert.Error(t, conf5.Validate()) conf6 := validConf - conf6.ProjectFetchSize = -1 + conf6.ProjectFetchSize = 0 assert.Error(t, conf6.Validate()) }) From 16d8749d7651e8bd34482d38f09b488fa24f568b Mon Sep 17 00:00:00 2001 From: yeongha Date: Thu, 5 Sep 2024 00:22:14 +0900 Subject: [PATCH 24/24] Comment reflection, large-scale editing --- cmd/yorkie/server.go | 16 ++-- server/backend/database/database.go | 4 +- server/backend/database/memory/database.go | 16 ++-- server/backend/database/memory/indexes.go | 14 +-- server/backend/database/mongo/client.go | 35 +------- .../backend/database/testcases/testcases.go | 35 ++++---- server/backend/housekeeping/config.go | 16 ++-- server/backend/housekeeping/config_test.go | 8 +- server/backend/housekeeping/housekeeping.go | 24 ++---- server/clients/housekeeping.go | 15 ++-- server/config.go | 8 +- server/config.sample.yml | 8 +- server/rpc/server_test.go | 4 +- server/server.go | 86 ++++++++++--------- test/helper/helper.go | 8 +- test/sharding/server_test.go | 4 +- 16 files changed, 136 insertions(+), 165 deletions(-) diff --git a/cmd/yorkie/server.go b/cmd/yorkie/server.go index 9cf227862..2bca53098 100644 --- a/cmd/yorkie/server.go +++ b/cmd/yorkie/server.go @@ -39,8 +39,8 @@ var ( flagLogLevel string adminTokenDuration time.Duration - housekeepingIntervalDeactivateCandidates time.Duration - housekeepingIntervalDeleteDocuments time.Duration + housekeepingDeactivateCandidatesInterval time.Duration + housekeepingDeleteDocumentsInterval time.Duration documentHardDeletionGracefulPeriod time.Duration clientDeactivateThreshold string @@ -71,8 +71,8 @@ func newServerCmd() *cobra.Command { conf.Backend.AuthWebhookCacheUnauthTTL = authWebhookCacheUnauthTTL.String() conf.Backend.ProjectInfoCacheTTL = projectInfoCacheTTL.String() - conf.Housekeeping.IntervalDeactivateCandidates = housekeepingIntervalDeactivateCandidates.String() - conf.Housekeeping.IntervalDeleteDocuments = housekeepingIntervalDeleteDocuments.String() + conf.Housekeeping.DeactivateCandidatesInterval = housekeepingDeactivateCandidatesInterval.String() + conf.Housekeeping.DeleteDocumentsInterval = housekeepingDeleteDocumentsInterval.String() conf.Housekeeping.DocumentHardDeletionGracefulPeriod = documentHardDeletionGracefulPeriod if mongoConnectionURI != "" { @@ -198,15 +198,15 @@ func init() { "Enable runtime profiling data via HTTP server.", ) cmd.Flags().StringVar( - &conf.Housekeeping.IntervalDeactivateCandidates, + &conf.Housekeeping.DeactivateCandidatesInterval, "housekeeping-interval-Deactivate-Candidates", - server.DefaultHousekeepingIntervalDeactivateCandidates.String(), + server.DefaultHousekeepingDeactivateCandidatesInterval.String(), "housekeeping Interval deactivate candidates between housekeeping runs", ) cmd.Flags().StringVar( - &conf.Housekeeping.IntervalDeleteDocuments, + &conf.Housekeeping.DeleteDocumentsInterval, "housekeeping-interval-Delete-Documents", - server.DefaultHousekeepingIntervalDeleteDocuments.String(), + server.DefaultHousekeepingDeleteDocumentsInterval.String(), "housekeeping Interval delete documents between housekeeping runs", ) cmd.Flags().DurationVar( diff --git a/server/backend/database/database.go b/server/backend/database/database.go index 1dfbe1f07..aaf6291d0 100644 --- a/server/backend/database/database.go +++ b/server/backend/database/database.go @@ -172,8 +172,8 @@ type Database interface { documentHardDeletionGracefulPeriod gotime.Duration, ) ([]*DocInfo, error) - // DeleteDocument Document complete deletion in progress - DeleteDocument( + // DeleteDocuments deletes document of the given key + DeleteDocuments( ctx context.Context, candidates []*DocInfo, ) (int64, error) diff --git a/server/backend/database/memory/database.go b/server/backend/database/memory/database.go index 98df2944b..992569588 100644 --- a/server/backend/database/memory/database.go +++ b/server/backend/database/memory/database.go @@ -680,30 +680,30 @@ func (d *DB) FindDocumentHardDeletionCandidatesPerProject( candidatesLimit int, documentHardDeletionGracefulPeriod gotime.Duration, ) ([]*database.DocInfo, error) { - txn := d.db.Txn(false) defer txn.Abort() + offset := gotime.Now().Add(-documentHardDeletionGracefulPeriod) + var documents []*database.DocInfo - iterator, err := txn.Get( + iterator, err := txn.ReverseLowerBound( tblDocuments, - "project_id", + "project_id_removed_at", project.ID.String(), + offset, ) if err != nil { return nil, fmt.Errorf("fetch hard deletion candidates: %w", err) } - currentTime := gotime.Now() - conditionDocumentHardDeletionGracefulPeriod := currentTime.Add(-documentHardDeletionGracefulPeriod) for raw := iterator.Next(); raw != nil; raw = iterator.Next() { document := raw.(*database.DocInfo) if candidatesLimit <= len(documents) && candidatesLimit != 0 { break } - if !document.RemovedAt.After(conditionDocumentHardDeletionGracefulPeriod) { + if !document.RemovedAt.After(offset) { documents = append(documents, document) } } @@ -755,8 +755,8 @@ func (d *DB) FindDeactivateCandidatesPerProject( return infos, nil } -// DeleteDocument Deletes the documents completely. -func (d *DB) DeleteDocument( +// DeleteDocuments Deletes the documents completely. +func (d *DB) DeleteDocuments( _ context.Context, candidates []*database.DocInfo, ) (int64, error) { diff --git a/server/backend/database/memory/indexes.go b/server/backend/database/memory/indexes.go index 4d7f1c996..d494a9a3f 100644 --- a/server/backend/database/memory/indexes.go +++ b/server/backend/database/memory/indexes.go @@ -117,11 +117,6 @@ var schema = &memdb.DBSchema{ Unique: true, Indexer: &memdb.StringFieldIndex{Field: "ID"}, }, - "project_id": { - Name: "project_id", - Unique: true, - Indexer: &memdb.StringFieldIndex{Field: "ProjectID"}, - }, "project_id_id": { Name: "project_id_id", Unique: true, @@ -141,6 +136,15 @@ var schema = &memdb.DBSchema{ }, }, }, + "project_id_removed_at": { + Name: "project_id_removed_at", + Indexer: &memdb.CompoundIndex{ + Indexes: []memdb.Indexer{ + &memdb.StringFieldIndex{Field: "ProjectID"}, + &memdb.TimeFieldIndex{Field: "RemovedAt"}, + }, + }, + }, "project_id_key_removed_at": { Name: "project_id_key_removed_at", Indexer: &memdb.CompoundIndex{ diff --git a/server/backend/database/mongo/client.go b/server/backend/database/mongo/client.go index 32da93466..77b6f8441 100644 --- a/server/backend/database/mongo/client.go +++ b/server/backend/database/mongo/client.go @@ -227,8 +227,8 @@ func (c *Client) CreateProjectInfo( return info, nil } -// DeleteDocument Deletes the documents completely. -func (c *Client) DeleteDocument( +// DeleteDocuments Deletes the documents completely. +func (c *Client) DeleteDocuments( ctx context.Context, candidates []*database.DocInfo, ) (int64, error) { @@ -766,37 +766,6 @@ func (c *Client) FindDeactivateCandidatesPerProject( return clientInfos, nil } -// FindDeactivateCandidates finds the clients that need housekeeping. -func (c *Client) FindDeactivateCandidates( - ctx context.Context, - documentHardDeletionCandidateLimitPerProject int, - projectFetchSize int, - lastProjectID types.ID, -) (types.ID, []*database.ClientInfo, error) { - projects, err := c.FindNextNCyclingProjectInfos(ctx, projectFetchSize, lastProjectID) - if err != nil { - return database.DefaultProjectID, nil, fmt.Errorf("failed to find cycling project infos: %w", err) - } - - var candidates []*database.ClientInfo - for _, project := range projects { - clientInfos, err := c.FindDeactivateCandidatesPerProject(ctx, project, documentHardDeletionCandidateLimitPerProject) - if err != nil { - return database.DefaultProjectID, nil, err - } - - candidates = append(candidates, clientInfos...) - } - - var topProjectID types.ID - if len(projects) < projectFetchSize { - topProjectID = database.DefaultProjectID - } else { - topProjectID = projects[len(projects)-1].ID - } - return topProjectID, candidates, nil -} - // FindDocInfoByKeyAndOwner finds the document of the given key. If the // createDocIfNotExist condition is true, create the document if it does not // exist. diff --git a/server/backend/database/testcases/testcases.go b/server/backend/database/testcases/testcases.go index afb342bc0..1e420bf8c 100644 --- a/server/backend/database/testcases/testcases.go +++ b/server/backend/database/testcases/testcases.go @@ -1411,37 +1411,41 @@ func AssertKeys(t *testing.T, expectedKeys []key.Key, infos []*database.DocInfo) assert.EqualValues(t, expectedKeys, keys) } -// RunDocumentHardDeletionTest runs Delete document permanently +// RunDocumentHardDeletionTest runs the DocumentHardDeletion tests for the given db func RunDocumentHardDeletionTest(t *testing.T, db database.Database) { t.Run("housekeeping DocumentHardDeletion test", func(t *testing.T) { ctx := context.Background() + docKey := helper.TestDocKey(t) + + // 00. Create a project projectInfo, err := db.CreateProjectInfo(ctx, t.Name(), dummyOwnerID, clientDeactivateThreshold) assert.NoError(t, err) - projectID := projectInfo.ID - // Create a client and two documents - clientInfo, err := db.ActivateClient(ctx, projectID, t.Name()) + // 01. Create a client and a document then attach the document to the client. + clientInfo, err := db.ActivateClient(ctx, projectInfo.ID, t.Name()) assert.NoError(t, err) - docInfo, err := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), helper.TestDocKey(t), true) + docInfo, err := db.FindDocInfoByKeyAndOwner(ctx, clientInfo.RefKey(), docKey, true) assert.NoError(t, err) + docRefKey := docInfo.RefKey() assert.NoError(t, clientInfo.AttachDocument(docInfo.ID, false)) assert.NoError(t, db.UpdateClientInfoAfterPushPull(ctx, clientInfo, docInfo)) - assert.NoError(t, clientInfo.RemoveDocument(docInfo.ID)) - doc := document.New(key.Key(t.Name())) pack := doc.CreateChangePack() - err = db.CreateChangeInfos(ctx, projectID, docInfo, 0, pack.Changes, true) - assert.NoError(t, err) - fetchSize := 100 - lastProjectID := database.DefaultProjectID + // 02. Set removed_at in docInfo and store changes + assert.NoError(t, clientInfo.RemoveDocument(docInfo.ID)) + err = db.CreateChangeInfos(ctx, projectInfo.ID, docInfo, 0, pack.Changes, true) + assert.NoError(t, err) + // 03. Set the grace period to 0 seconds. var candidates []*database.DocInfo - GracePeriod := "0s" + GracePeriod := "-1s" documentHardDeletionGracefulPeriod, err := gotime.ParseDuration(GracePeriod) assert.NoError(t, err) + // 04. Find documents whose deleted_at time is less than or equal to current time minus GracePeriod. + fetchSize := 100 candidates, err = db.FindDocumentHardDeletionCandidatesPerProject( ctx, projectInfo, @@ -1449,13 +1453,14 @@ func RunDocumentHardDeletionTest(t *testing.T, db database.Database) { documentHardDeletionGracefulPeriod, ) assert.NoError(t, err) - assert.Equal(t, database.DefaultProjectID, lastProjectID) - deletedDocumentsCount, err := db.DeleteDocument(ctx, candidates) + // 05. Deletes document of the given key + // Compare the number of candidates for deletion with the number of deleted documents. + deletedDocumentsCount, err := db.DeleteDocuments(ctx, candidates) assert.NoError(t, err) assert.Equal(t, int(deletedDocumentsCount), len(candidates)) - _, err = db.FindDocInfoByRefKey(ctx, docInfo.RefKey()) + _, err = db.FindDocInfoByRefKey(ctx, docRefKey) assert.ErrorIs(t, err, database.ErrDocumentNotFound) }) diff --git a/server/backend/housekeeping/config.go b/server/backend/housekeeping/config.go index c19be42c4..aab2e8301 100644 --- a/server/backend/housekeeping/config.go +++ b/server/backend/housekeeping/config.go @@ -25,11 +25,11 @@ import ( // Config is the configuration for the housekeeping service. type Config struct { - // IntervalDeactivateCandidates is the time between housekeeping runs for deactivate candidates. - IntervalDeactivateCandidates string `yaml:"IntervalDeactivateCandidates"` + // DeactivateCandidatesInterval is the time between housekeeping runs for deactivate candidates. + DeactivateCandidatesInterval string `yaml:"DeactivateCandidatesInterval"` - // IntervalDeleteDocuments is the time between housekeeping runs for document deletion. - IntervalDeleteDocuments string `yaml:"IntervalDeleteDocuments"` + // DeleteDocumentsInterval is the time between housekeeping runs for document deletion. + DeleteDocumentsInterval string `yaml:"DeleteDocumentsInterval"` // DocumentHardDeletionGracefulPeriod finds documents whose removed_at time is older than that time. DocumentHardDeletionGracefulPeriod time.Duration `yaml:"HousekeepingDocumentHardDeletionGracefulPeriod"` @@ -46,18 +46,18 @@ type Config struct { // Validate validates the configuration. func (c *Config) Validate() error { - if _, err := time.ParseDuration(c.IntervalDeactivateCandidates); err != nil { + if _, err := time.ParseDuration(c.DeactivateCandidatesInterval); err != nil { return fmt.Errorf( `invalid argument %s for "--housekeeping-interval-deactivate-candidates" flag: %w`, - c.IntervalDeactivateCandidates, + c.DeactivateCandidatesInterval, err, ) } - if _, err := time.ParseDuration(c.IntervalDeleteDocuments); err != nil { + if _, err := time.ParseDuration(c.DeleteDocumentsInterval); err != nil { return fmt.Errorf( `invalid argument %s for "--housekeeping-interval-delete-documents" flag: %w`, - c.IntervalDeleteDocuments, + c.DeleteDocumentsInterval, err, ) } diff --git a/server/backend/housekeeping/config_test.go b/server/backend/housekeeping/config_test.go index 120729a50..058ca83a0 100644 --- a/server/backend/housekeeping/config_test.go +++ b/server/backend/housekeeping/config_test.go @@ -27,8 +27,8 @@ import ( func TestConfig(t *testing.T) { t.Run("validate test", func(t *testing.T) { validConf := housekeeping.Config{ - IntervalDeactivateCandidates: "1m", - IntervalDeleteDocuments: "1m", + DeactivateCandidatesInterval: "1m", + DeleteDocumentsInterval: "1m", DocumentHardDeletionGracefulPeriod: 60, ClientDeactivationCandidateLimitPerProject: 100, DocumentHardDeletionCandidateLimitPerProject: 100, @@ -37,11 +37,11 @@ func TestConfig(t *testing.T) { assert.NoError(t, validConf.Validate()) conf1 := validConf - conf1.IntervalDeactivateCandidates = "hour" + conf1.DeactivateCandidatesInterval = "hour" assert.Error(t, conf1.Validate()) conf2 := validConf - conf2.IntervalDeleteDocuments = "minute" + conf2.DeleteDocumentsInterval = "minute" assert.Error(t, conf2.Validate()) conf3 := validConf diff --git a/server/backend/housekeeping/housekeeping.go b/server/backend/housekeeping/housekeeping.go index d600ee584..1892c8a4a 100644 --- a/server/backend/housekeeping/housekeeping.go +++ b/server/backend/housekeeping/housekeeping.go @@ -48,33 +48,19 @@ func New(conf *Config) (*Housekeeping, error) { // RegisterTask registers task the housekeeping service. func (h *Housekeeping) RegisterTask( - intervalDeactivateCandidates time.Duration, - intervalDeleteDocuments time.Duration, - taskDeactivateCandidates func(ctx context.Context) error, - taskDeleteDocuments func(ctx context.Context) error, + interval time.Duration, + task func(ctx context.Context) error, ) error { if _, err := h.scheduler.NewJob( - gocron.DurationJob(intervalDeactivateCandidates), + gocron.DurationJob(interval), gocron.NewTask(func() { ctx := context.Background() - if err := taskDeactivateCandidates(ctx); err != nil { + if err := task(ctx); err != nil { logging.From(ctx).Error(err) } }), ); err != nil { - return fmt.Errorf("scheduler new job for deactivating candidates: %w", err) - } - - if _, err := h.scheduler.NewJob( - gocron.DurationJob(intervalDeleteDocuments), - gocron.NewTask(func() { - ctx := context.Background() - if err := taskDeleteDocuments(ctx); err != nil { - logging.From(ctx).Error(err) - } - }), - ); err != nil { - return fmt.Errorf("scheduler new job for deleting documents: %w", err) + return fmt.Errorf("scheduler new job: %w", err) } return nil diff --git a/server/clients/housekeeping.go b/server/clients/housekeeping.go index 2209bab82..930a55ee3 100644 --- a/server/clients/housekeeping.go +++ b/server/clients/housekeeping.go @@ -26,9 +26,10 @@ import ( "github.com/yorkie-team/yorkie/server/logging" ) +// Identification key for distributed work const ( - deactivateCandidatesKey = "housekeeping/deactivateCandidates" - documentHardDeletionLockKey = "housekeeping/DocumentHardDeletionLock" + DocumentHardDeletionLockKey = "housekeeping/documentHardDeletionLock" + DeactivateCandidatesKey = "housekeeping/deactivateCandidates" ) // DeactivateInactives deactivates clients that have not been active for a @@ -42,7 +43,7 @@ func DeactivateInactives( ) (types.ID, error) { start := time.Now() - locker, err := be.Coordinator.NewLocker(ctx, deactivateCandidatesKey) + locker, err := be.Coordinator.NewLocker(ctx, DeactivateCandidatesKey) if err != nil { return database.DefaultProjectID, err } @@ -122,8 +123,8 @@ func FindDeactivateCandidates( return topProjectID, candidates, nil } -// DeleteDocument deletes a document -func DeleteDocument( +// DeleteDocuments deletes a document +func DeleteDocuments( ctx context.Context, be *backend.Backend, documentHardDeletionCandidateLimitPerProject int, @@ -133,7 +134,7 @@ func DeleteDocument( ) (types.ID, error) { start := time.Now() - locker, err := be.Coordinator.NewLocker(ctx, documentHardDeletionLockKey) + locker, err := be.Coordinator.NewLocker(ctx, DocumentHardDeletionLockKey) if err != nil { return database.DefaultProjectID, err } @@ -161,7 +162,7 @@ func DeleteDocument( return database.DefaultProjectID, err } - deletedDocumentsCount, err := be.DB.DeleteDocument(ctx, candidates) + deletedDocumentsCount, err := be.DB.DeleteDocuments(ctx, candidates) if err != nil { return database.DefaultProjectID, err diff --git a/server/config.go b/server/config.go index 8e73ef0fc..a2fa494ae 100644 --- a/server/config.go +++ b/server/config.go @@ -40,8 +40,8 @@ const ( DefaultProfilingPort = 8081 - DefaultHousekeepingIntervalDeactivateCandidates = 30 * time.Second - DefaultHousekeepingIntervalDeleteDocuments = 30 * time.Second + DefaultHousekeepingDeactivateCandidatesInterval = 30 * time.Second + DefaultHousekeepingDeleteDocumentsInterval = 30 * time.Second DefaultHousekeepingDocumentHardDeletionGracefulPeriod = 14 * 24 * time.Hour DefaultHousekeepingClientDeactivationCandidateLimitPerProject = 500 DefaultHousekeepingDocumentHardDeletionCandidateLimitPerProject = 500 @@ -232,8 +232,8 @@ func newConfig(port int, profilingPort int) *Config { Port: profilingPort, }, Housekeeping: &housekeeping.Config{ - IntervalDeactivateCandidates: DefaultHousekeepingIntervalDeactivateCandidates.String(), - IntervalDeleteDocuments: DefaultHousekeepingIntervalDeleteDocuments.String(), + DeactivateCandidatesInterval: DefaultHousekeepingDeactivateCandidatesInterval.String(), + DeleteDocumentsInterval: DefaultHousekeepingDeleteDocumentsInterval.String(), DocumentHardDeletionGracefulPeriod: DefaultHousekeepingDocumentHardDeletionGracefulPeriod, ClientDeactivationCandidateLimitPerProject: DefaultHousekeepingClientDeactivationCandidateLimitPerProject, DocumentHardDeletionCandidateLimitPerProject: DefaultHousekeepingDocumentHardDeletionCandidateLimitPerProject, diff --git a/server/config.sample.yml b/server/config.sample.yml index b2c75201e..9290c886e 100644 --- a/server/config.sample.yml +++ b/server/config.sample.yml @@ -30,11 +30,11 @@ Profiling: # Housekeeping is the configuration for the housekeeping. Housekeeping: - # IntervalDeactivateCandidates is the time between housekeeping runs (default: 1m). - IntervalDeactivateCandidates: 1m + # DeactivateCandidatesInterval is the time between housekeeping runs (default: 1m). + DeactivateCandidatesInterval: 1m - # IntervalDeleteDocuments is the time between housekeeping runs (default: 1m). - IntervalDeleteDocuments: 1m + # DeleteDocumentsInterval is the time between housekeeping runs (default: 1m). + DeleteDocumentsInterval: 1m # HousekeepingDocumentHardDeletionGracefulPeriod finds documents whose removed_at time is older than that time. (default: 336h). HousekeepingDocumentHardDeletionGracefulPeriod: 336h diff --git a/server/rpc/server_test.go b/server/rpc/server_test.go index 40d0e5a5d..ac86e9022 100644 --- a/server/rpc/server_test.go +++ b/server/rpc/server_test.go @@ -83,8 +83,8 @@ func TestMain(m *testing.M) { ConnectionTimeout: helper.MongoConnectionTimeout, PingTimeout: helper.MongoPingTimeout, }, &housekeeping.Config{ - IntervalDeactivateCandidates: helper.HousekeepingIntervalDeactivateCandidates.String(), - IntervalDeleteDocuments: helper.HousekeepingIntervalDeleteDocuments.String(), + DeactivateCandidatesInterval: helper.HousekeepingDeactivateCandidatesInterval.String(), + DeleteDocumentsInterval: helper.HousekeepingDeleteDocumentsInterval.String(), DocumentHardDeletionGracefulPeriod: helper.HousekeepingDocumentHardDeletionGracefulPeriod, ClientDeactivationCandidateLimitPerProject: helper.HousekeepingClientDeactivationCandidateLimitPerProject, DocumentHardDeletionCandidateLimitPerProject: helper.HousekeepingDocumentHardDeletionCandidateLimitPerProject, diff --git a/server/server.go b/server/server.go index 5793f3417..1be5039d9 100644 --- a/server/server.go +++ b/server/server.go @@ -94,7 +94,11 @@ func (r *Yorkie) Start() error { r.lock.Lock() defer r.lock.Unlock() - if err := r.RegisterHousekeepingTasks(r.backend); err != nil { + if err := r.RegisterDeactivateInactivesTasks(r.backend); err != nil { + return err + } + + if err := r.RegisterDeleteDocumentsTasks(r.backend); err != nil { return err } @@ -157,54 +161,56 @@ func (r *Yorkie) DeactivateClient(ctx context.Context, c1 *client.Client) error return err } -// RegisterHousekeepingTasks registers housekeeping tasks. -func (r *Yorkie) RegisterHousekeepingTasks(be *backend.Backend) error { - intervalDeactivateCandidates, err := - be.Housekeeping.Config.ParseInterval(be.Housekeeping.Config.IntervalDeactivateCandidates) +// RegisterDeactivateInactivesTasks registers deactivate inactives housekeeping tasks. +func (r *Yorkie) RegisterDeactivateInactivesTasks(be *backend.Backend) error { + deactivateCandidatesInterval, err := + be.Housekeeping.Config.ParseInterval(be.Housekeeping.Config.DeactivateCandidatesInterval) if err != nil { return err } - intervalDeleteDocuments, err := - be.Housekeeping.Config.ParseInterval(be.Housekeeping.Config.IntervalDeleteDocuments) + housekeepingLastDeactivateInactivesProjectID := database.DefaultProjectID + return be.Housekeeping.RegisterTask(deactivateCandidatesInterval, func(ctx context.Context) error { + lastProjectDeactivateInactivesID, err := clients.DeactivateInactives( + ctx, + be, + be.Housekeeping.Config.ClientDeactivationCandidateLimitPerProject, + be.Housekeeping.Config.ProjectFetchSize, + housekeepingLastDeactivateInactivesProjectID, + ) + if err != nil { + return err + } + housekeepingLastDeactivateInactivesProjectID = lastProjectDeactivateInactivesID + return nil + }) +} + +// RegisterDeleteDocumentsTasks registers document hard delete housekeeping tasks. +func (r *Yorkie) RegisterDeleteDocumentsTasks(be *backend.Backend) error { + deleteDocumentsInterval, err := + be.Housekeeping.Config.ParseInterval(be.Housekeeping.Config.DeleteDocumentsInterval) if err != nil { return err } - housekeepingLastDeactivateInactivesProjectID := database.DefaultProjectID housekeepingLastDeleteDocumentProjectID := database.DefaultProjectID - return be.Housekeeping.RegisterTask( - intervalDeactivateCandidates, intervalDeleteDocuments, - func(ctx context.Context) error { - lastProjectDeactivateInactivesID, err := clients.DeactivateInactives( - ctx, - be, - be.Housekeeping.Config.ClientDeactivationCandidateLimitPerProject, - be.Housekeeping.Config.ProjectFetchSize, - housekeepingLastDeactivateInactivesProjectID, - ) - if err != nil { - return err - } - housekeepingLastDeactivateInactivesProjectID = lastProjectDeactivateInactivesID - return nil - }, - func(ctx context.Context) error { - lastProjectDeleteDocumentID, err := clients.DeleteDocument( - ctx, - be, - be.Housekeeping.Config.DocumentHardDeletionCandidateLimitPerProject, - be.Housekeeping.Config.DocumentHardDeletionGracefulPeriod, - be.Housekeeping.Config.ProjectFetchSize, - housekeepingLastDeleteDocumentProjectID, - ) - if err != nil { - return err - } - - housekeepingLastDeleteDocumentProjectID = lastProjectDeleteDocumentID - return nil - }) + return be.Housekeeping.RegisterTask(deleteDocumentsInterval, func(ctx context.Context) error { + lastProjectDeleteDocumentID, err := clients.DeleteDocuments( + ctx, + be, + be.Housekeeping.Config.DocumentHardDeletionCandidateLimitPerProject, + be.Housekeeping.Config.DocumentHardDeletionGracefulPeriod, + be.Housekeeping.Config.ProjectFetchSize, + housekeepingLastDeleteDocumentProjectID, + ) + if err != nil { + return err + } + + housekeepingLastDeleteDocumentProjectID = lastProjectDeleteDocumentID + return nil + }) } // DefaultProject returns the default project. diff --git a/test/helper/helper.go b/test/helper/helper.go index 65f7832c2..717462621 100644 --- a/test/helper/helper.go +++ b/test/helper/helper.go @@ -66,8 +66,8 @@ var ( AdminPassword = server.DefaultAdminPassword AdminPasswordForSignUp = AdminPassword + "123!" UseDefaultProject = true - HousekeepingIntervalDeactivateCandidates = 10 * gotime.Second - HousekeepingIntervalDeleteDocuments = 10 * gotime.Second + HousekeepingDeactivateCandidatesInterval = 10 * gotime.Second + HousekeepingDeleteDocumentsInterval = 10 * gotime.Second HousekeepingDocumentHardDeletionGracefulPeriod = 10 * gotime.Second HousekeepingClientDeactivationCandidateLimitPerProject = 10 HousekeepingDocumentHardDeletionCandidateLimitPerProject = 10 @@ -239,8 +239,8 @@ func TestConfig() *server.Config { Port: ProfilingPort + portOffset, }, Housekeeping: &housekeeping.Config{ - IntervalDeactivateCandidates: HousekeepingIntervalDeactivateCandidates.String(), - IntervalDeleteDocuments: HousekeepingIntervalDeleteDocuments.String(), + DeactivateCandidatesInterval: HousekeepingDeactivateCandidatesInterval.String(), + DeleteDocumentsInterval: HousekeepingDeleteDocumentsInterval.String(), DocumentHardDeletionGracefulPeriod: HousekeepingDocumentHardDeletionGracefulPeriod, ClientDeactivationCandidateLimitPerProject: HousekeepingClientDeactivationCandidateLimitPerProject, DocumentHardDeletionCandidateLimitPerProject: HousekeepingDocumentHardDeletionCandidateLimitPerProject, diff --git a/test/sharding/server_test.go b/test/sharding/server_test.go index 656d6b0dd..861e9c663 100644 --- a/test/sharding/server_test.go +++ b/test/sharding/server_test.go @@ -78,8 +78,8 @@ func TestMain(m *testing.M) { ConnectionTimeout: helper.MongoConnectionTimeout, PingTimeout: helper.MongoPingTimeout, }, &housekeeping.Config{ - IntervalDeactivateCandidates: helper.HousekeepingIntervalDeactivateCandidates.String(), - IntervalDeleteDocuments: helper.HousekeepingIntervalDeleteDocuments.String(), + DeactivateCandidatesInterval: helper.HousekeepingDeactivateCandidatesInterval.String(), + DeleteDocumentsInterval: helper.HousekeepingDeleteDocumentsInterval.String(), DocumentHardDeletionGracefulPeriod: helper.HousekeepingDocumentHardDeletionGracefulPeriod, ClientDeactivationCandidateLimitPerProject: helper.HousekeepingClientDeactivationCandidateLimitPerProject, DocumentHardDeletionCandidateLimitPerProject: helper.HousekeepingDocumentHardDeletionCandidateLimitPerProject,

    2 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