-
Notifications
You must be signed in to change notification settings - Fork 438
ChannelManager read refactor follow ups #4374
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
ChannelManager read refactor follow ups #4374
Conversation
|
👋 Thanks for assigning @valentinewallace as a reviewer! |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #4374 +/- ##
==========================================
+ Coverage 85.99% 86.01% +0.01%
==========================================
Files 156 156
Lines 102766 102846 +80
Branches 102766 102846 +80
==========================================
+ Hits 88378 88463 +85
+ Misses 11879 11873 -6
- Partials 2509 2510 +1
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
valentinewallace
left a comment
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.
Care to throw in any of these mentioned updates? #4332 (comment) Seems like a good opportunity
lightning/src/ln/channelmanager.rs
Outdated
| testing_dnssec_proof_offer_resolution_override: Mutex::new(new_hash_map()), | ||
| }; | ||
|
|
||
| // Step 7: Replay pending claims and fail HTLCs. |
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.
In my experience using step numbers in ldk-sample main, it's kinda annoying to have to update all of them when something changes. Maybe that's not as much of a risk here
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 thought it might help a bit with navigation in this huge function. In other languages one would quickly extract methods, but in my experience that isn't always in Rust. Would you prefer that? I can try it.
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 wouldn't really prefer extracting methods. Just wanted to point it out, we can keep the numbers
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.
Made it unnumbered headings
|
👋 The first review has been submitted! Do you think this PR is ready for a second reviewer? If so, click here to assign a second reviewer. |
13a8a3f to
b4429bb
Compare
Done |
valentinewallace
left a comment
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 cleanups here!
lightning/src/ln/channelmanager.rs
Outdated
| // consistency. Channels that are behind their monitors are force-closed. Channels without | ||
| // monitors (except those awaiting initial persistence) are rejected. Monitors without |
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 don't think it's true that channels without monitors will be rejected -- instead, we'll DecodeError::InvalidValue on the entire manager read. Were these comments added by Claude? I'm kinda not sold on them, they add to the review quite a bit and seem error prone/at risk of becoming out-of-date
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.
Yes, clauded indeed. Unfortunate. First I went and corrected them, but I also felt what you mention about becoming out-of-date. In my opinion, there aren't enough comments in the code base, but comments that are located a bit further away from the code aren't ideal. Dropped the commit.
lightning/src/ln/channelmanager.rs
Outdated
| .into_iter() | ||
| .zip(onion_fields) | ||
| .map(|((hash, htlcs), onion)| (hash, htlcs, onion)) | ||
| .collect() |
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.
Hmm, we introduce an intermediate allocation here. Wonder if the whole creation of claimable_payments can move here, to avoid it? It feels somewhat fitting.
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've considered that, but it would need the keys for the legacy handling branch. But perhaps that's ok? The distinction between stage 1 and 2 isn't carved in stone.
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.
Updated the commit with this. It's seem better indeed.
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 like this update 👌
| .unwrap_or_else(new_hash_map), | ||
| inbound_payment_id_secret, | ||
| in_flight_monitor_updates, | ||
| in_flight_monitor_updates: in_flight_monitor_updates.unwrap_or_default(), |
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.
Will this use HashMap::new() or new_hash_map (which I think is what we want)? CI seems fine though...
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 it is the same?
HashMap::default() -> creates HashMap with RandomState::default() -> which calls RandomState::new() which is what new_hash_map does too?
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.
If true, we could replace all new_hash_map calls with HashMap::default(), to make it look slightly less custom.
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.
new_hash_map calls a different RandomState impl based on whether we're in std or no-std 🤔 It seems different, seems like a bug that CI is passing, potentially. Pretty sure there's a reason we'd have a custom call to new_hash_map everywhere. Here's the commit where it was added: 3096061
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 we should double-check this, but landed since it conflicts with #4303 and we can do another minor follow-up if it's an issue.
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.
Ok, will look into it
Reorder the struct fields to place all three `_legacy` fields together at the end, allowing the explanatory comment to appear once instead of being duplicated three times. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Initialize pending_claiming_payments and monitor_update_blocked_actions_per_peer with None and resolve with unwrap_or_else, matching the pattern used for other optional hash map fields like pending_intercepted_htlcs_legacy. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Since there is no semantic difference between None and Some(empty vec) for peer_storage_dir, simplify the type to Vec and use unwrap_or_default() when reading from TLV fields. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Move the reconstruction of claimable_payments from the main ChannelManager::read into ChannelManagerData::read. This removes the separate claimable_htlc_purposes and claimable_htlc_onion_fields fields from ChannelManagerData, replacing them with the combined claimable_payments HashMap. This requires adding a node_signer parameter to ChannelManagerDataReadArgs to support verification of legacy hop data when reconstructing payment purposes for very old serialized data (pre-0.0.107). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Since there is no semantic difference between None and Some(empty map) for in_flight_monitor_updates, simplify the type to HashMap and use unwrap_or_default() when reading from TLV fields. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
b4429bb to
b509c4a
Compare
| } else { | ||
| // LDK versions prior to 0.0.107 did not write a `pending_htlc_purposes`, but do | ||
| // include a `_legacy_hop_data` in the `OnionPayload`. | ||
| for (payment_hash, htlcs) in claimable_htlcs_list.into_iter() { |
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's a few minor differences in the code move, like this goes from drain to into_iter here. Maybe it's fine for this PR but in general it's best to keep a pure code move in its own commit.
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 indeed verified before pushing using git diff -M, and from what I saw that was the only change. True that I could have kept that as is.
lightning/src/ln/channelmanager.rs
Outdated
| .into_iter() | ||
| .zip(onion_fields) | ||
| .map(|((hash, htlcs), onion)| (hash, htlcs, onion)) | ||
| .collect() |
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 like this update 👌
|
Landed since this conflicts with #4303 but should look into whether we need to switch to a |
Followup commits to improve the readability and maintainability of the
ChannelManagerdeserialization code.