yorkie-team / yorkie

Yorkie is a document store for collaborative applications.
https://yorkie.dev
Apache License 2.0
748 stars 133 forks source link

Fix miscalculation of tree size in concurrent editing #891

Closed raararaara closed 1 month ago

raararaara commented 1 month ago

What this PR does / why we need it?

Fix miscalculation of tree size in concurrent editing

This commit addresses the issue where the updateAncestorsSize method subtracts the size of a tombstoned node from its ancestors' sizes when the node is removed. However, the previous logic did not consider cases where ancestors node are tombstoned. In such cases, the update should not propagate to the parent's ancestors. This commit introduces recursive checks on ancestors and stops updating process if a tombstoned ancestor is encountered.

Furthermore, the PR ensures consistency between the size maintenance policies of updateDescendantsSize and updateAncestorsSize.

Any background context you want to provide?

What are the relevant tickets?

Address https://github.com/yorkie-team/yorkie/issues/889 Related to https://github.com/yorkie-team/yorkie-js-sdk/pull/846

Checklist:

Summary by CodeRabbit

coderabbitai[bot] commented 1 month ago

[!WARNING]

Review failed

The pull request is closed.

Walkthrough

The recent changes address tree structure and size consistency in the TreeNode and Node structs within the document collaboration system. Updates simplify ancestor size management, modify descendant size handling, and introduce new test cases to ensure tree consistency during concurrent edits. Additionally, debug print statements have been added to the ApplyChanges function for specific index values.

Changes

Files Change Summary
pkg/document/crdt/tree.go Simplified logic in TreeNode's remove method for updating ancestors' size and parent's length.
pkg/document/internal_document.go Added fmt import and a debug print statement in ApplyChanges for index 158.
pkg/index/tree.go Updated UpdateAncestorsSize to break loop if parent's value is removed; modified UpdateDescendantsSize to skip removed nodes.
test/integration/tree_test.go Added imports for converter and crdt packages; introduced new test cases for concurrent editing and tree consistency.

Sequence Diagram(s) (Beta)

No sequence diagrams provided as the changes are primarily logical simplifications and enhancements.

Assessment against linked issues

Objective (Issue #889) Addressed Explanation
Ensure size for index calculation in XML Tree is consistent
Ensure attributes of Trees generated by Changes and Snapshot match

Poem

In the code, the trees now stand, Ancestors' sizes, simplified, grand. Descendants skip the nodes removed, A smoother process, finely tuned. Debug prints for index keen, Collaboration flows, pristine. 🌳✨


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share - [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai) - [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai) - [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai) - [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)
Tips ### Chat There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai): - Review comments: Directly reply to a review comment made by CodeRabbit. Example: - `I pushed a fix in commit .` - `Generate unit testing code for this file.` - `Open a follow-up GitHub issue for this discussion.` - Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples: - `@coderabbitai generate unit testing code for this file.` - `@coderabbitai modularize this function.` - PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples: - `@coderabbitai generate interesting stats about this repository and render them as a table.` - `@coderabbitai show all the console.log statements in this repository.` - `@coderabbitai read src/utils.ts and generate unit testing code.` - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.` - `@coderabbitai help me debug CodeRabbit configuration file.` Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. ### CodeRabbit Commands (invoked as PR comments) - `@coderabbitai pause` to pause the reviews on a PR. - `@coderabbitai resume` to resume the paused reviews. - `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository. - `@coderabbitai full review` to do a full review from scratch and review all the files again. - `@coderabbitai summary` to regenerate the summary of the PR. - `@coderabbitai resolve` resolve all the CodeRabbit review comments. - `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository. - `@coderabbitai help` to get help. Additionally, you can add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed. ### CodeRabbit Configration File (`.coderabbit.yaml`) - You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository. - Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information. - If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json` ### Documentation and Community - Visit our [Documentation](https://coderabbit.ai/docs) for detailed information on how to use CodeRabbit. - Join our [Discord Community](https://discord.com/invite/GsXnASn26c) to get help, request features, and share feedback. - Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.
codecov[bot] commented 1 month ago

Codecov Report

Attention: Patch coverage is 11.11111% with 8 lines in your changes missing coverage. Please review.

Project coverage is 50.64%. Comparing base (ef70028) to head (49081a0).

Files Patch % Lines
pkg/index/tree.go 0.00% 7 Missing and 1 partial :warning:
Additional details and impacted files ```diff @@ Coverage Diff @@ ## main #891 +/- ## ========================================== - Coverage 50.67% 50.64% -0.03% ========================================== Files 70 70 Lines 10471 10466 -5 ========================================== - Hits 5306 5301 -5 + Misses 4638 4637 -1 - Partials 527 528 +1 ```

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.

hackerwins commented 1 month ago

@raararaara Thanks for your contribution.