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

RFQ Quoter: generate quotes in parallel #2847

Merged
merged 6 commits into from
Jul 6, 2024
Merged

Conversation

dwasse
Copy link
Collaborator

@dwasse dwasse commented Jul 5, 2024

Summary by CodeRabbit

  • New Features

    • Improved quote generation by enabling parallel processing for faster performance.
  • Bug Fixes

    • Enhanced error handling in quote generation to ensure smoother and more reliable operations.

Copy link
Contributor

coderabbitai bot commented Jul 5, 2024

Walkthrough

The updates to services/rfq/relayer/quoter/quoter.go enhance the codebase by adding concurrency and improving error management. This involves using synchronization mechanisms (sync.Mutex, sync/atomic), implementing parallel quote generation with errgroup, and optimizing error handling. These refinements ensure that quote generation is both efficient and resilient to errors.

Changes

File Path Change Summary
services/rfq/relayer/quoter/... Added synchronization using sync.Mutex and sync/atomic. Implemented parallel quote generation with errgroup and enhanced error handling in quote generation.

Poem

In the code a change so bright,
Mutex in hand, it takes flight.
With atomic care and threads in dance,
Quotes are now swift, they race, they prance.
Errors caught, no longer free,
In this realm of concurrency.
🌟🐰✨


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.
    • @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 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.

@github-actions github-actions bot added go Pull requests that update Go code size/xs labels Jul 5, 2024
Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

PR Summary

  • Introduced parallel processing for quote generation using goroutines
  • Added mutex for synchronization during quote generation

1 file(s) reviewed, no comment(s)
Edit PR Review Bot Settings

Copy link

codecov bot commented Jul 5, 2024

Codecov Report

Attention: Patch coverage is 54.16667% with 11 lines in your changes missing coverage. Please review.

Project coverage is 25.84121%. Comparing base (f4589f1) to head (1c09d00).

Files Patch % Lines
services/rfq/relayer/quoter/quoter.go 54.16667% 9 Missing and 2 partials ⚠️
Additional details and impacted files
@@                 Coverage Diff                 @@
##              master       #2847         +/-   ##
===================================================
+ Coverage   25.66758%   25.84121%   +0.17362%     
===================================================
  Files            770         713         -57     
  Lines          55424       52811       -2613     
  Branches          80          80                 
===================================================
- Hits           14226       13647        -579     
+ Misses         39740       37769       -1971     
+ Partials        1458        1395         -63     
Flag Coverage Δ
cctp-relayer ?
opbot 0.18541% <ø> (ø)
promexporter ?
rfq 28.18829% <54.16667%> (+0.30634%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Copy link
Contributor

@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: 2

Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 48063a7 and e95d574.

Files selected for processing (1)
  • services/rfq/relayer/quoter/quoter.go (2 hunks)
Additional context used
GitHub Check: Lint (services/rfq)
services/rfq/relayer/quoter/quoter.go

[failure] 339-339:
Using the variable on range scope keyTokenID in function literal (scopelint)


[failure] 343-343:
Using the variable on range scope keyTokenID in function literal (scopelint)

Additional comments not posted (4)
services/rfq/relayer/quoter/quoter.go (4)

11-12: Concurrency and synchronization mechanisms added.

The addition of sync and sync/atomic packages is appropriate for managing concurrency and synchronization.


Line range hint 84-84:
Concurrency using errgroup added.

The use of errgroup to screen sender and recipient addresses in parallel is an excellent addition for improving performance.


Line range hint 245-245:
Concurrency and error handling improvements.

The changes to handle concurrency and error handling are well-implemented, ensuring efficient and reliable quote submission.


329-331: Concurrency using errgroup added.

The use of errgroup to generate quotes in parallel is an excellent addition for improving performance.

if quoteErr != nil {
// continue generating quotes even if one fails
span.AddEvent("error generating quote", trace.WithAttributes(
attribute.String("key_token_id", keyTokenID),
Copy link
Contributor

Choose a reason for hiding this comment

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

Fix variable scope issue in goroutine.

The variable keyTokenID from the range scope is used in the goroutine, which can lead to incorrect behavior.

-                        span.AddEvent("error generating quote", trace.WithAttributes(
-                            attribute.String("key_token_id", keyTokenID),
+                        span.AddEvent("error generating quote", trace.WithAttributes(
+                            attribute.String("key_token_id", keyToken),

Committable suggestion was skipped due to low confidence.

Tools
GitHub Check: Lint (services/rfq)

[failure] 343-343:
Using the variable on range scope keyTokenID in function literal (scopelint)

Comment on lines +338 to +339
g.Go(func() error {
quote, quoteErr := m.generateQuote(gctx, keyTokenID, chainID, address, balance, destRFQAddr)
Copy link
Contributor

Choose a reason for hiding this comment

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

Fix variable scope issue in goroutine.

The variable keyTokenID from the range scope is used in the goroutine, which can lead to incorrect behavior.

-        for _, tokenID := range itemTokenIDs {
-            if tokenID == destTokenID {
-                g.Go(func() error {
-                    quote, quoteErr := m.generateQuote(gctx, keyTokenID, chainID, address, balance, destRFQAddr)
+        for i := range itemTokenIDs {
+            if itemTokenIDs[i] == destTokenID {
+                keyToken := keyTokenID
+                g.Go(func() error {
+                    quote, quoteErr := m.generateQuote(gctx, keyToken, chainID, address, balance, destRFQAddr)
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
g.Go(func() error {
quote, quoteErr := m.generateQuote(gctx, keyTokenID, chainID, address, balance, destRFQAddr)
for i := range itemTokenIDs {
if itemTokenIDs[i] == destTokenID {
keyToken := keyTokenID
g.Go(func() error {
quote, quoteErr := m.generateQuote(gctx, keyToken, chainID, address, balance, destRFQAddr)
Tools
GitHub Check: Lint (services/rfq)

[failure] 339-339:
Using the variable on range scope keyTokenID in function literal (scopelint)

Copy link

cloudflare-workers-and-pages bot commented Jul 5, 2024

Deploying sanguine-fe with  Cloudflare Pages  Cloudflare Pages

Latest commit: 1c09d00
Status: ✅  Deploy successful!
Preview URL: https://7ab16090.sanguine-fe.pages.dev
Branch Preview URL: https://feat-parallel-quote-gen.sanguine-fe.pages.dev

View logs

Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

PR Summary

(updates since last review)

  • Modified services/rfq/relayer/quoter/quoter.go to generate quotes in parallel using goroutines and an error group
  • Enhanced error handling during quote generation for increased robustness
  • Improved performance and reliability of the quote generation process

1 file(s) reviewed, no comment(s)
Edit PR Review Bot Settings

Copy link
Contributor

@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

Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between e95d574 and cc9836d.

Files selected for processing (1)
  • services/rfq/relayer/quoter/quoter.go (2 hunks)
Additional comments not posted (7)
services/rfq/relayer/quoter/quoter.go (7)

11-11: Imports approved.

The new imports for synchronization and parallel processing are appropriate.


Line range hint 48-58:
Struct additions approved.

The added fields for managing relay state and recording metrics are appropriate.


Line range hint 75-99:
Function changes approved.

The initialization of relayPaused and quoteAmountGauge is appropriate.


Line range hint 106-134:
Function changes approved.

The use of relayPaused and errgroup for parallel processing enhances error handling and efficiency.


Line range hint 184-208:
Function changes approved.

The use of relayPaused for error management is appropriate.


Line range hint 213-248:
Function changes approved.

The use of errgroup for parallel quote generation enhances efficiency.


329-360: Function changes approved.

The use of errgroup for parallel quote generation and sync.Mutex for synchronization enhances efficiency and thread safety.

Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

PR Summary

(updates since last review)

  • Added rfqRefund command in contrib/opbot/botmd/commands.go for refunding quote requests.
  • Updated contrib/opbot/botmd/botmd.go to initialize RPC client, signer, and transaction submitter.
  • Introduced new configuration fields in contrib/opbot/config/config.go for RFQ API, OmniRPC, Signer, Submitter, and Database.
  • Enhanced tracing middleware in contrib/opbot/botmd/middleware.go for better context propagation.
  • Updated services/rfq/api/rest/server.go to add a new API endpoint for retrieving contract addresses.

45 file(s) reviewed, no comment(s)
Edit PR Review Bot Settings

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
go Pull requests that update Go code size/xs
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants