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

Small Offers Fixes #2881

Merged
merged 3 commits into from
Mar 13, 2024
Merged

Conversation

TheBlueMatt
Copy link
Collaborator

Went to go try to pay an offer with ldk-sample (lightningdevkit/ldk-sample#129) and found some minor things worth fixing. Sadly, it seems CLN can't respond to my invoice_request, not sure why but I imagine its not doing response path introduction_point direct connecting, which is causing it to fail.

@TheBlueMatt TheBlueMatt added this to the 0.0.122 milestone Feb 7, 2024
Copy link

coderabbitai bot commented Feb 7, 2024

Walkthrough

The recent updates bring improvements to both the channel manager and onion message handling. The channel manager now utilizes _persistence_guard for enhanced notification management, while onion message logging includes interpolated node IDs for better message tracking and handling details.

Changes

File Path Change Summary
.../ln/channelmanager.rs
.../onion_message/messenger.rs
Added _persistence_guard for payment notifications in the channel manager. Updated onion message logging to include interpolated node IDs for clearer message tracking.

🐇✨
Changes afoot in the code we weave,
Logs now clearer, with less to grieve.
Persistence guarded, in payments we trust,
CodeRabbit's updates, truly a must. 🚀✨

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-tests 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 tests 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 tests.
    • @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.
  • The JSON schema for the configuration file is available here.
  • 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/coderabbit-overrides.v2.json

CodeRabbit Discord Community

Join our Discord Community to get help, request features, and share feedback.

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.

Review Status

Actionable comments generated: 5

Configuration used: CodeRabbit UI

Commits Files that changed from the base of the PR and between 36429e8 and 8502490.
Files selected for processing (2)
  • lightning/src/ln/channelmanager.rs (2 hunks)
  • lightning/src/onion_message/messenger.rs (3 hunks)
Additional comments: 3
lightning/src/onion_message/messenger.rs (1)
  • 756-756: Verify the logic for incrementing ticks in timer_tick_occurred to ensure it aligns with the intended behavior for handling pending connections.
lightning/src/ln/channelmanager.rs (2)
  • 7775-7776: The introduction of _persistence_guard using PersistenceNotifierGuard::notify_on_drop(self) is correctly implemented to ensure that persistence notifications are triggered upon dropping. This change enhances the reliability of outbound payment handling by ensuring that necessary notifications are not missed.
  • 7838-7839: Similarly, the addition of _persistence_guard in the context of inbound payments is correctly implemented. By using PersistenceNotifierGuard::notify_on_drop(self), this change ensures that persistence notifications are triggered upon dropping, enhancing the reliability of inbound payment handling.

lightning/src/onion_message/messenger.rs Outdated Show resolved Hide resolved
lightning/src/onion_message/messenger.rs Outdated Show resolved Hide resolved
lightning/src/onion_message/messenger.rs Outdated Show resolved Hide resolved
@codecov-commenter
Copy link

codecov-commenter commented Feb 7, 2024

Codecov Report

Attention: Patch coverage is 66.66667% with 10 lines in your changes are missing coverage. Please review.

Project coverage is 89.19%. Comparing base (aa334d5) to head (29984a7).

Files Patch % Lines
lightning/src/onion_message/messenger.rs 58.33% 9 Missing and 1 partial ⚠️

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2881      +/-   ##
==========================================
- Coverage   89.23%   89.19%   -0.04%     
==========================================
  Files         117      117              
  Lines       95496    95513      +17     
  Branches    95496    95513      +17     
==========================================
- Hits        85216    85195      -21     
- Misses       7801     7835      +34     
- Partials     2479     2483       +4     

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

lightning/src/ln/channelmanager.rs Show resolved Hide resolved
lightning/src/onion_message/messenger.rs Outdated Show resolved Hide resolved
lightning/src/onion_message/messenger.rs Outdated Show resolved Hide resolved
@TheBlueMatt TheBlueMatt force-pushed the 2024-02-offers-tweak branch 2 times, most recently from c3b5188 to b047c4c Compare February 13, 2024 00:07
@TheBlueMatt
Copy link
Collaborator Author

Went ahead and squash-pushed because this is super trivial:

$ git diff-tree -U1 37d6c233 b047c4c88
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index ffe518fbf..eb3e1bb3a 100644
--- a/lightning/src/ln/channelmanager.rs
+++ b/lightning/src/ln/channelmanager.rs
@@ -7684,2 +7684,4 @@ where

+		let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
+
 		let expiration = StaleExpiration::AbsoluteTimeout(absolute_expiry);
diff --git a/lightning/src/onion_message/messenger.rs b/lightning/src/onion_message/messenger.rs
index fe0761ff9..7d4dca375 100644
--- a/lightning/src/onion_message/messenger.rs
+++ b/lightning/src/onion_message/messenger.rs
@@ -916,2 +916,3 @@ where
 	fn handle_onion_message(&self, peer_node_id: &PublicKey, msg: &OnionMessage) {
+		let logger = WithContext::from(&self.logger, Some(*peer_node_id), None);
 		match self.peel_onion_message(msg) {
@@ -919,3 +920,3 @@ where
 				log_trace!(
-					WithContext::from(&self.logger, Some(*peer_node_id), None),
+					logger,
 					"Received an onion message with path_id {:02x?} and {} reply_path: {:?}",
@@ -948,3 +949,3 @@ where
 					log_trace!(
-						WithContext::from(&self.logger, Some(*peer_node_id), None),
+						logger,
 						"Dropping forwarded onion message to peer {}: outbound buffer full",
@@ -964,6 +965,3 @@ where
 						e.get_mut().enqueue_message(onion_message);
-						log_trace!(
-							WithContext::from(&self.logger, Some(*peer_node_id), None),
-							"Forwarding an onion message to peer {}",
-							next_node_id);
+						log_trace!(logger, "Forwarding an onion message to peer {}", next_node_id);
 					},
@@ -971,3 +969,3 @@ where
 						log_trace!(
-							WithContext::from(&self.logger, Some(*peer_node_id), None),
+							logger,
 							"Dropping forwarded onion message to disconnected peer {}",
@@ -979,6 +977,3 @@ where
 			Err(e) => {
-				log_error!(
-					WithContext::from(&self.logger, Some(*peer_node_id), None),
-					"Failed to process onion message {:?}",
-					e);
+				log_error!(logger, "Failed to process onion message {:?}", e);
 			}

@@ -7833,6 +7837,8 @@ where
let amount_msats = refund.amount_msats();
let relative_expiry = DEFAULT_RELATIVE_EXPIRY.as_secs() as u32;

let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
Copy link
Contributor

Choose a reason for hiding this comment

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

Perhaps this just needs more clarification in the commit message, but why isn't this required in the OffersMessageHandler implementation? I might just not have a full grasp of the issue.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Hmm, I think we're okay. There's two cases where we care about the persistence-guard - (a) when we changed the ChannelManager and we need to write a fresh copy to disk, (b) when we have a new message that we need to send a peer, but only if its not a response (in which case the socket handler will prod the PeerManager for us).

Copy link
Contributor

@jkczyz jkczyz Mar 8, 2024

Choose a reason for hiding this comment

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

Somewhat related: I was chatting with @tnull about adding an InvoiceSent event to help with LDK Node managing inbound payments. We create the invoice in the OffersMessageHandler implementation, but we don't send it until it goes through the OnionMessenger. By the time the PeerManager sends it, the invoice is no longer accessible as it's inside the OnionMessage. Wondering what the best strategy would be for generating such an event?

  1. Generate it in ChannelManager before it is actually sent (thus needing persistence here)
  2. Generate it in OnionMessenger, which we avoided for ConnectionNeeded (but event not persisted then)
  3. Generate in PeerManager by pairing the OnionMessage with the (cloned) Bolt12Invoice payload (same, not persisted)

Seems like the options aren't that great. Any other alternatives?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Generate it in ChannelManager before it is actually sent (thus needing persistence here)

I think probably this? We can wake without persistence now, which IIRC will also see events.

lightning/src/onion_message/messenger.rs Outdated Show resolved Hide resolved
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.

Review Status

Actionable comments generated: 0

Configuration used: CodeRabbit UI

Commits Files that changed from the base of the PR and between 0c2a715 and 61dfc61.
Files selected for processing (2)
  • lightning/src/ln/channelmanager.rs (3 hunks)
  • lightning/src/onion_message/messenger.rs (6 hunks)
Additional comments: 12
lightning/src/onion_message/messenger.rs (9)
  • 738-738: The introduction of intro_node_logger using WithContext::from(&self.logger, Some(path.first_node()), None); is a significant improvement for contextual logging. This change allows for more detailed and context-aware logging, especially useful in a complex system like LDK where operations can span multiple nodes and paths. This enhancement aligns with best practices for logging in distributed systems, providing clearer insights into the flow of onion messages through the network.
  • 753-753: Using the intro_node_logger for logging buffered onion messages enhances the clarity of log messages by including the introduction node's context. This is a valuable addition for debugging and monitoring the onion message routing process.
  • 757-758: Similarly, logging buffered onion messages awaiting peer connection with the introduction node's context is a thoughtful improvement. It provides clear visibility into the state of onion messages that are pending due to connection issues, which is crucial for diagnosing and resolving routing delays or failures.
  • 917-918: The instantiation of logger with WithContext::from(&self.logger, Some(*peer_node_id), None); for logging within the handle_onion_message function is another excellent use of contextual logging. It ensures that log messages related to handling onion messages are associated with the peer node ID, improving the traceability of message handling events.
  • 922-923: The detailed logging for received onion messages, including path ID and reply path information, is beneficial for understanding the flow and processing of onion messages. This level of detail in logs aids in debugging and monitoring the handling of different types of onion messages.
  • 950-953: Logging the dropping of forwarded onion messages due to a full outbound buffer with the peer node ID context is crucial for identifying potential bottlenecks or issues in message forwarding. This log statement helps in pinpointing problems related to message congestion or capacity limits.
  • 970-973: Similarly, logging the dropping of forwarded onion messages to disconnected peers with the peer node ID context is important for diagnosing routing issues. It highlights scenarios where messages cannot be forwarded due to connectivity problems, aiding in the identification and resolution of network connectivity issues.
  • 979-979: The use of log_error! for logging failures in processing onion messages is appropriate. It ensures that such critical errors are prominently logged, facilitating quick identification and troubleshooting of issues in onion message processing.
  • 31-31: The import of WithContext from crate::util::logger is crucial for the logging improvements introduced in this PR. It ensures that the new contextual logging capabilities are available for use throughout the file. This change is a foundational part of enhancing logging detail and clarity in the handling of onion messages.
lightning/src/ln/channelmanager.rs (3)
  • 7685-7686: The introduction of _persistence_guard using PersistenceNotifierGuard::notify_on_drop(self) ensures that persistence notifications are managed upon dropping objects. This is a good practice for enhancing reliability in payment processes. However, it's crucial to ensure that the PersistenceNotifierGuard is tested thoroughly to handle all edge cases, especially in asynchronous environments where race conditions might occur.

Ensure that the implementation of PersistenceNotifierGuard::notify_on_drop(self) is robust against potential race conditions by reviewing its implementation and adding necessary tests if they are missing.

  • 7777-7778: Adding _persistence_guard in the context of handling invoice requests is appropriate for ensuring that persistence notifications are triggered upon object drops. This aligns with the PR's objective to enhance the reliability of payment processing. However, based on the previous comment by jkczyz, it's important to consider whether similar mechanisms are needed in other areas, such as create_refund_builder, to maintain consistency and reliability across the codebase.
Verification successful

The verification process revealed multiple instances of PersistenceNotifierGuard::notify_on_drop being used across various functions within channelmanager.rs, indicating a consistent implementation of the persistence guard mechanism to enhance reliability in payment processing and channel management. However, there was no specific mention of create_refund_builder using this mechanism, which could imply that either the function does not exist or does not employ the persistence guard in the same manner. Given the widespread and consistent use of this mechanism in other areas, the implementation strategy aligns with the PR's objective, even if create_refund_builder specifically does not use or does not exist with this mechanism.

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Verify if similar persistence guard mechanisms are implemented in `create_refund_builder` and other relevant areas.
grep -C3 "PersistenceNotifierGuard::notify_on_drop" lightning/src/ln/channelmanager.rs

Length of output: 13647

* 7840-7841: The addition of `_persistence_guard` here is consistent with the PR's goal to improve persistence notification handling. The discussion between `jkczyz` and `TheBlueMatt` raises an important point about the necessity of such mechanisms in different contexts, specifically in the `OffersMessageHandler` implementation. It's crucial to ensure that the use of `_persistence_guard` is consistent and justified across different parts of the code, considering the scenarios outlined by `TheBlueMatt`.

@tnull
Copy link
Contributor

tnull commented Mar 8, 2024

Seems CI is unhappy

@TheBlueMatt
Copy link
Collaborator Author

Sorry, fixed.

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.

Review Status

Actionable comments generated: 0

Configuration used: CodeRabbit UI

Commits Files that changed from the base of the PR and between aa3dbe8 and 8646a8c.
Files selected for processing (2)
  • lightning/src/ln/channelmanager.rs (3 hunks)
  • lightning/src/onion_message/messenger.rs (6 hunks)
Files skipped from review as they are similar to previous changes (2)
  • lightning/src/ln/channelmanager.rs
  • lightning/src/onion_message/messenger.rs

Comment on lines 738 to 739
let intro_node_logger =
WithContext::from(&self.logger, Some(destination.first_node()), None);
Copy link
Contributor

Choose a reason for hiding this comment

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

Hmmm... it's not clear to me we want to use destination.first_node(). With DefaultMessageRouter it will either be our peer or soon-to-be peer, which I believe is what we want. But a different MessageRouter may return a partial path back from destination, in which case the peer (or soon-to-be peer) in question would not be the introduction node.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Oops, duh, sorry.

Copy link
Contributor

@jkczyz jkczyz left a comment

Choose a reason for hiding this comment

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

LGTM. Feel free to squash.

The `Debug` serialization of `PublicKey`s includes both the X and Y
coordinate, which isn't something most of our users deal with.
Instead, logging using `Display` gives users the keys they're used
to.
@TheBlueMatt
Copy link
Collaborator Author

Rebased and squashed after addressing the last comment.

@jkczyz
Copy link
Contributor

jkczyz commented Mar 13, 2024

Rebased and squashed after addressing the last comment.

Will need to update now to use $self now that some changes are inside macros.

This resolves an issue where offer and refund payments get delayed
while we wait for the `invoice_request`/`invoice` onion messages to
get sent. It further ensures we're likely to have the
`ChannelManager` persisted with the new payment info after
initiating the send/receive.
@TheBlueMatt
Copy link
Collaborator Author

Oops, apologies, fixed now.

@@ -7937,6 +7941,8 @@ where
return Err(Bolt12SemanticError::UnsupportedChain);
}

let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
Copy link
Contributor

Choose a reason for hiding this comment

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

Might be a bit better to put this after all the potential error paths/right before we push into self.pending_offers_messages, but that's a very minor optimization.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Yea, not sure it matters much and it reads simpler here, less chance we add something and forget to move the persistence lock.

@TheBlueMatt TheBlueMatt merged commit f5ee8c2 into lightningdevkit:main Mar 13, 2024
15 of 16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants