-
Notifications
You must be signed in to change notification settings - Fork 2.2k
itest: RegisterSpendNtfn detects reorgs #10083
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
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Summary of Changes
Hello @starius, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!
This pull request introduces a crucial integration test to validate the robustness of the RegisterSpendNtfn
RPC in handling blockchain reorgs. The new test case meticulously simulates a reorg event to ensure that clients watching for spending notifications are correctly informed when a confirmed transaction is invalidated and potentially replaced by an alternative transaction on the new chain. This enhances the reliability of chain monitoring within the system.
Highlights
- New Integration Test: I've added a new integration test,
testReorgNotifications
, to verify the behavior of theRegisterSpendNtfn
RPC during blockchain reorgs. This test ensures that the system correctly issues reorg notifications when a previously confirmed spending transaction is unconfirmed due to a chain reorganization. - Reorg Notification Verification: The test specifically simulates a scenario where an output is spent by one transaction (tx2b), which is then confirmed. After receiving the spending notification, a reorg is triggered that unconfirms tx2b. The test then asserts that a reorg notification is received by the
RegisterSpendNtfn
client. - Alternative Spending Confirmation: Following the reorg and the reorg notification, the test confirms an alternative transaction (tx2a) that also spends the same output. It then verifies that a new spending notification is correctly issued for this newly confirmed transaction.
Using Gemini Code Assist
The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.
Invoking Gemini
You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command>
or @gemini-code-assist <command>
. Below is a summary of the supported commands.
Feature | Command | Description |
---|---|---|
Code Review | /gemini review |
Performs a code review for the current pull request in its current state. |
Pull Request Summary | /gemini summary |
Provides a summary of the current pull request in its current state. |
Comment | @gemini-code-assist | Responds in comments when explicitly tagged, both in issue comments and review comments. |
Help | /gemini help |
Displays a list of available commands. |
Customization
To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/
folder in the base of the repository. Detailed instructions can be found here.
Limitations & Feedback
Gemini Code Assist is currently in preview and may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments to provide feedback.
You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.
Footnotes
-
Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. ↩
Warning Gemini encountered an error creating the review. You can try again by commenting |
cc44eb9
to
7c14269
Compare
7c14269
to
2e214d6
Compare
/gemini review |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
The code changes introduce an integration test to verify that RegisterSpendNtfn
behaves as expected during a reorg. The test logic is sound and covers the intended scenario well. I've suggested a refactoring to improve the test's readability and maintainability by reducing duplicated code. I've also pointed out some lines exceeding the 80-character limit.
itest/lnd_misc_test.go
Outdated
go func() { | ||
spendMsg, err := spendClient.Recv() | ||
require.NoError(ht, err) | ||
spendDetails := spendMsg.GetSpend() | ||
require.NotNil(ht, spendDetails) | ||
require.Equal(ht, txid2b[:], spendDetails.SpendingTxHash) | ||
close(spendReceived) | ||
}() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree with Gemini. I think we can extract this logic since it is being used 3 times, into a method that returns a SpendEvent
(without the additional checks), then perform additional checks, such as require.NotNil(ht, spendDetails)
, after calling the method.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I factored out the logic of receiving and waiting to function receiveSpendNotification
:
// receiveSpendNotification tries to receive a spend notification from a spend
// client until the context expires.
func receiveSpendNotification(ctx context.Context,
spendClient rpc.SpendClient) (*chainrpc.SpendEvent, error) {
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice addition! LGTM 🎉
// startHeight -1 means include only unconfirmed. | ||
StartHeight: -1, | ||
} | ||
var tx2aLnrpc *lnrpc.Transaction |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: imo readability would improve with a few added new lines. Right now code blocks feel a bit too tight.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added few new lines.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice 👌, I left a few questions/suggestions.
itest/lnd_misc_test.go
Outdated
// Make sure RegisterSpendNtfn noticed the spending. Give 10s to receive | ||
// the notification. | ||
spendReceived := make(chan struct{}) | ||
go func() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think if any error occurs inside this goroutine, it will panic, and the main test thread will hang without properly handling/reporting the error until the 10s timeout expires. Maybe we should consider creating an errChan
to properly report any issues?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I moved the goroutine to function receiveSpendNotification
. All the checks are done outside of the function (and the goroutine), so now it is safe in case of a failure.
itest/lnd_misc_test.go
Outdated
close(spendReceived) | ||
}() | ||
select { | ||
case <-time.After(10 * time.Second): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A 10s timeout might be insufficient and will likely cause flakiness at times, especially under system load or when the backend is slow. Perhaps a better alternative is to use wait.DefaultTimeout
, which uses different values based on platform, although I don't think it solves the problem entirely.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you! I used wait.DefaultTimeout
itest/lnd_misc_test.go
Outdated
go func() { | ||
spendMsg, err := spendClient.Recv() | ||
require.NoError(ht, err) | ||
spendDetails := spendMsg.GetSpend() | ||
require.NotNil(ht, spendDetails) | ||
require.Equal(ht, txid2b[:], spendDetails.SpendingTxHash) | ||
close(spendReceived) | ||
}() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree with Gemini. I think we can extract this logic since it is being used 3 times, into a method that returns a SpendEvent
(without the additional checks), then perform additional checks, such as require.NotNil(ht, spendDetails)
, after calling the method.
2e214d6
to
8dc3f97
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM 🚀
itest/lnd_misc_test.go
Outdated
|
||
// receiveSpendNotification tries to receive a spend notification from a spend | ||
// client until the context expires. | ||
func receiveSpendNotification(ctx context.Context, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: Maybe since this helper is specific to testReorgNotifications
, we should move there?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks! I moved the function inside.
Added itest "reorg_notifications" which tests that RegisterSpendNtfn behaves as expected during a reorg. A reorg notification is produced after a reorg affects the block which has produced a spending notification for this registration.
8dc3f97
to
8723113
Compare
Change Description
Added itest "reorg_notifications" which tests that RegisterSpendNtfn behaves as expected during a reorg. A reorg notification is produced after a reorg affects the block which has produced a spending notification for this registration.
Steps to Test
Pull Request Checklist
Testing
Code Style and Documentation
[skip ci]
in the commit message for small changes.📝 Please see our Contribution Guidelines for further guidance.