Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move clob hydration to preblocker #1412

Merged
merged 11 commits into from
Apr 29, 2024
Merged

Move clob hydration to preblocker #1412

merged 11 commits into from
Apr 29, 2024

Conversation

jayy04
Copy link
Contributor

@jayy04 jayy04 commented Apr 25, 2024

Changelist

[Describe or list the changes made in this PR]

Test Plan

[Describe how this PR was tested (if applicable)]

Author/Reviewer Checklist

  • If this PR has changes that result in a different app state given the same prior state and transaction list, manually add the state-breaking label.
  • If the PR has breaking postgres changes to the indexer add the indexer-postgres-breaking label.
  • If this PR isn't state-breaking but has changes that modify behavior in PrepareProposal or ProcessProposal, manually add the label proposal-breaking.
  • If this PR is one of many that implement a specific feature, manually label them all feature:[feature-name].
  • If you wish to for mergify-bot to automatically create a PR to backport your change to a release branch, manually add the label backport/[branch-name].
  • Manually add any of the following labels: refactor, chore, bug.

Copy link

coderabbitai bot commented Apr 25, 2024

Walkthrough

The recent updates primarily focus on enhancing initialization and state management within the clob modules of a Go application. New functionalities for checking and setting initialization status have been added across various components. Moreover, the restructuring of the initialization process and the addition of new methods streamline operations and improve the robustness of the system. These changes facilitate better management of order books and initialization states, contributing to a more organized and efficient codebase.

Changes

File Path Change Summary
protocol/app/app.go Refactored initialization process in App struct, added clobmoduletypes to SetOrderPreBlockers.
protocol/mocks/... Added Initialize and IsInitialized in ClobKeeper and MemClob.
protocol/x/clob/abci.go Added PreBlocker function to execute ABCI PreBlock logic.
protocol/x/clob/ante/... Added checks in ClobDecorator for order processing based on hydration status.
protocol/x/clob/keeper/... Enhanced Keeper with new fields and methods for initialization checks, modified orderbook creation logic.
protocol/x/clob/memclob/... Added MaybeCreateOrderbook method in MemClobPriceTimePriority and MemClob interface.
protocol/x/clob/module.go Introduced PreBlock function with telemetry metrics.
protocol/x/clob/types/... Updated ClobKeeper interface with new methods, added ErrClobNotInitialized error.

Recent Review Details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits Files that changed from the base of the PR and between f8d83c3 and 9a42425.
Files selected for processing (1)
  • protocol/x/clob/e2e/app_test.go (3 hunks)
Additional Context Used
Path-based Instructions (1)
protocol/x/clob/e2e/app_test.go (1)

Pattern **/**: Do not include a walkthrough. For all comments on line changes that are longer than 15 lines, add a prefix to the comment of what lines you are commenting on (for example: "The changes from lines 100 to 200...". Add your comment to be on the last 15 lines of the chunk rather than adding your comment to the entire chunk.

Additional comments not posted (3)
protocol/x/clob/e2e/app_test.go (3)

319-389: LGTM! The test function TestHydrationInPreBlocker is well-structured and effectively tests the hydration process in the pre-blocker phase.


391-564: LGTM! The test function TestHydrationWithMatchPreBlocker effectively tests the hydration process with order matching in the pre-blocker phase.


316-575: > 📝 NOTE

This review was outside the diff hunks and was mapped to the diff hunk with the greatest overlap. Original lines [565-700]

LGTM! The test function TestConcurrentMatchesAndCancels effectively tests the system's ability to handle concurrent order placements and cancellations without data races.

Warning

Following problems were encountered

  • Git: Failed to clone repository. Please contact CodeRabbit support.

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
Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>.
    • 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.

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 a review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @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 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 for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Out of diff range and nitpick comments (1)
protocol/app/app.go (1)

Line range hint 739-739: Secure the gRPC server by adding SSL/TLS credentials.

- app.Server = daemonserver.NewServer(logger, grpc.NewServer(), &daemontypes.FileHandlerImpl{}, daemonFlags.Shared.SocketAddress)
+ creds, err := credentials.NewServerTLSFromFile("cert.pem", "cert.key")
+ if err != nil {
+     panic(err)
+ }
+ app.Server = daemonserver.NewServer(logger, grpc.NewServer(grpc.Creds(creds)), &daemontypes.FileHandlerImpl{}, daemonFlags.Shared.SocketAddress)

@vincentwschau
Copy link
Contributor

Non-blocking question, is this test-able in either an E2E test or the upgrade test?

@@ -60,6 +60,14 @@ func (cd ClobDecorator) AnteHandle(
return next(ctx, tx, simulate)
}

// Disable order placement and cancelation processing if the clob keeper is not hydrated.
if !cd.clobKeeper.IsHydrated() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: would it makes sense to name this field more generically? Hydration is one of the things that could be done here
something like IsInitialized? This pattern can be consistent across modules

@@ -111,6 +112,7 @@ func NewKeeper(
indexerEventManager: indexerEventManager,
streamingManager: grpcStreamingManager,
memStoreInitialized: &atomic.Bool{},
hydrated: &atomic.Bool{},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: readability, can we document this is initialize as false

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Out of diff range and nitpick comments (2)
protocol/x/clob/keeper/keeper.go (1)

48-48: Initialization of initialized and memStoreInitialized using atomic.Bool is appropriate for concurrency control. Consider adding documentation to these fields to clarify their purpose, as suggested in previous comments.

protocol/app/app.go (1)

Line range hint 739-739: Secure the gRPC server by adding SSL/TLS credentials.

The gRPC server is initialized without specifying SSL/TLS credentials, which could allow unencrypted connections. This is a security risk as it could allow an attacker to tamper with the gRPC messages. Consider using SSL/TLS to secure the connection.

- grpc.NewServer(),
+ grpc.NewServer(grpc.Creds(credentials.NewServerTLSFromFile("cert.pem", "cert.key"))),

Comment on lines +158 to +162
// maybeCreateOrderbook creates a new orderbook in the memclob.
func (k Keeper) maybeCreateOrderbook(ctx sdk.Context, clobPair types.ClobPair) {
// Create the corresponding orderbook in the memclob.
k.MemClob.MaybeCreateOrderbook(ctx, clobPair)
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

need maybe create orderbook here since orderbooks might have already been created by InitGenesis

Comment on lines 174 to 180
// Branch the context for hydration.
// This means that new order matches from hydration will get added to the operations
// queue but the corresponding state changes will be discarded.
// This is because we are currently in the deliver state so writing optimistic matches
// breaks consensus.
checkCtx, _ := ctx.CacheContext()
checkCtx = checkCtx.WithIsCheckTx(true)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

someone give me a quick sanity check here

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Logic / comment makes sense, however seems hard to track. Maybe an additional comment that this is currently only run in Preblocker which is why this is needed?

@@ -60,6 +60,14 @@ func (cd ClobDecorator) AnteHandle(
return next(ctx, tx, simulate)
}

// Disable order placement and cancelation processing if the clob keeper is not hydrated.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Replace hydrated with initialized.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Out of diff range and nitpick comments (1)
protocol/app/app.go (1)

Line range hint 740-740: Secure the gRPC server to prevent unauthorized access.

- app.Server = daemonserver.NewServer(logger, grpc.NewServer(), &daemontypes.FileHandlerImpl{}, daemonFlags.Shared.SocketAddress)
+ creds, err := credentials.NewServerTLSFromFile("cert.pem", "cert.key")
+ if err != nil {
+     panic(err)
+ }
+ app.Server = daemonserver.NewServer(logger, grpc.NewServer(grpc.Creds(creds)), &daemontypes.FileHandlerImpl{}, daemonFlags.Shared.SocketAddress)

The gRPC server is currently initialized without any credentials, which could expose it to unauthorized access and tampering. It's recommended to secure the server using SSL/TLS credentials.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Out of diff range and nitpick comments (2)
protocol/app/app.go (2)

Line range hint 740-740: Secure the gRPC server by adding SSL/TLS credentials.

- app.Server = daemonserver.NewServer(logger, grpc.NewServer(), &daemontypes.FileHandlerImpl{}, daemonFlags.Shared.SocketAddress)
+ creds, err := credentials.NewServerTLSFromFile("cert.pem", "cert.key")
+ if err != nil {
+     panic(err)
+ }
+ app.Server = daemonserver.NewServer(logger, grpc.NewServer(grpc.Creds(creds)), &daemontypes.FileHandlerImpl{}, daemonFlags.Shared.SocketAddress)

Ensure that the server uses SSL/TLS credentials to prevent unauthorized access and data tampering.


1623-1629: Ensure clarity in the comment about gas meter handling in PreBlocker.

The comment about setting the gas meter to a free infinite gas meter could be expanded to explain why this is necessary and what specific non-deterministic operations require this setting. This would help future maintainers understand the reasoning behind this design choice.

@jayy04
Copy link
Contributor Author

jayy04 commented Apr 29, 2024

@Mergifyio backport release/protocol/v5.x

Copy link
Contributor

mergify bot commented Apr 29, 2024

backport release/protocol/v5.x

✅ Backports have been created

@jayy04 jayy04 merged commit 20113d2 into main Apr 29, 2024
17 checks passed
@jayy04 jayy04 deleted the jy/hydration-preblocker branch April 29, 2024 20:54
mergify bot pushed a commit that referenced this pull request Apr 29, 2024
* Move clob hydration to preblocker

* updates

* comments

* nit

* reset gas meter; comments

* remove defer

* fix test

* fix test

* e2e test for hydration in preblocker (#1437)

* e2e test for hydration in preblocker

* fix lint

(cherry picked from commit 20113d2)
jayy04 added a commit that referenced this pull request Apr 29, 2024
* Move clob hydration to preblocker (#1412)

* Move clob hydration to preblocker

* updates

* comments

* nit

* reset gas meter; comments

* remove defer

* fix test

* fix test

* e2e test for hydration in preblocker (#1437)

* e2e test for hydration in preblocker

* fix lint

(cherry picked from commit 20113d2)

* move e2e test app instantiation to Build (#1422)

---------

Co-authored-by: jayy04 <103467857+jayy04@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants