Skip to content

Commit 5d3e93e

Browse files
committed
Prefactor: Only update PaymentDetails fields if necessary
Here, we move updating fields via `PaymentDetailsUpdate` to `PaymentDetails::update`. This allows us to only update the fields that changed, keeping track *whether* something changed, and only updating the timestamp and persisting the entry *if* something changed. This is a nice improvement in general (as we want to reduce persist calls anyways), but we'll also use this for batch updates in the next commits.
1 parent 3cd1e98 commit 5d3e93e

File tree

1 file changed

+101
-53
lines changed

1 file changed

+101
-53
lines changed

src/payment/store.rs

Lines changed: 101 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,104 @@ impl PaymentDetails {
5959
.as_secs();
6060
Self { id, kind, amount_msat, direction, status, latest_update_timestamp }
6161
}
62+
63+
pub(crate) fn update(&mut self, update: &PaymentDetailsUpdate) -> bool {
64+
debug_assert_eq!(
65+
self.id, update.id,
66+
"We should only ever override payment data for the same payment id"
67+
);
68+
69+
let mut updated = false;
70+
71+
macro_rules! update_if_necessary {
72+
($val: expr, $update: expr) => {
73+
if $val != $update {
74+
$val = $update;
75+
updated = true;
76+
}
77+
};
78+
}
79+
80+
if let Some(hash_opt) = update.hash {
81+
match self.kind {
82+
PaymentKind::Bolt12Offer { ref mut hash, .. } => {
83+
debug_assert_eq!(
84+
self.direction,
85+
PaymentDirection::Outbound,
86+
"We should only ever override payment hash for outbound BOLT 12 payments"
87+
);
88+
update_if_necessary!(*hash, hash_opt);
89+
},
90+
PaymentKind::Bolt12Refund { ref mut hash, .. } => {
91+
debug_assert_eq!(
92+
self.direction,
93+
PaymentDirection::Outbound,
94+
"We should only ever override payment hash for outbound BOLT 12 payments"
95+
);
96+
update_if_necessary!(*hash, hash_opt);
97+
},
98+
_ => {
99+
// We can omit updating the hash for BOLT11 payments as the payment hash
100+
// will always be known from the beginning.
101+
},
102+
}
103+
}
104+
if let Some(preimage_opt) = update.preimage {
105+
match self.kind {
106+
PaymentKind::Bolt11 { ref mut preimage, .. } => {
107+
update_if_necessary!(*preimage, preimage_opt)
108+
},
109+
PaymentKind::Bolt11Jit { ref mut preimage, .. } => {
110+
update_if_necessary!(*preimage, preimage_opt)
111+
},
112+
PaymentKind::Bolt12Offer { ref mut preimage, .. } => {
113+
update_if_necessary!(*preimage, preimage_opt)
114+
},
115+
PaymentKind::Bolt12Refund { ref mut preimage, .. } => {
116+
update_if_necessary!(*preimage, preimage_opt)
117+
},
118+
PaymentKind::Spontaneous { ref mut preimage, .. } => {
119+
update_if_necessary!(*preimage, preimage_opt)
120+
},
121+
_ => {},
122+
}
123+
}
124+
125+
if let Some(secret_opt) = update.secret {
126+
match self.kind {
127+
PaymentKind::Bolt11 { ref mut secret, .. } => {
128+
update_if_necessary!(*secret, secret_opt)
129+
},
130+
PaymentKind::Bolt11Jit { ref mut secret, .. } => {
131+
update_if_necessary!(*secret, secret_opt)
132+
},
133+
PaymentKind::Bolt12Offer { ref mut secret, .. } => {
134+
update_if_necessary!(*secret, secret_opt)
135+
},
136+
PaymentKind::Bolt12Refund { ref mut secret, .. } => {
137+
update_if_necessary!(*secret, secret_opt)
138+
},
139+
_ => {},
140+
}
141+
}
142+
143+
if let Some(amount_opt) = update.amount_msat {
144+
update_if_necessary!(self.amount_msat, amount_opt);
145+
}
146+
147+
if let Some(status) = update.status {
148+
update_if_necessary!(self.status, status);
149+
}
150+
151+
if updated {
152+
self.latest_update_timestamp = SystemTime::now()
153+
.duration_since(UNIX_EPOCH)
154+
.unwrap_or(Duration::from_secs(0))
155+
.as_secs();
156+
}
157+
158+
updated
159+
}
62160
}
63161

64162
impl Writeable for PaymentDetails {
@@ -401,60 +499,10 @@ where
401499
let mut locked_payments = self.payments.lock().unwrap();
402500

403501
if let Some(payment) = locked_payments.get_mut(&update.id) {
404-
if let Some(hash_opt) = update.hash {
405-
match payment.kind {
406-
PaymentKind::Bolt12Offer { ref mut hash, .. } => {
407-
debug_assert_eq!(payment.direction, PaymentDirection::Outbound,
408-
"We should only ever override payment hash for outbound BOLT 12 payments");
409-
*hash = hash_opt
410-
},
411-
PaymentKind::Bolt12Refund { ref mut hash, .. } => {
412-
debug_assert_eq!(payment.direction, PaymentDirection::Outbound,
413-
"We should only ever override payment hash for outbound BOLT 12 payments");
414-
*hash = hash_opt
415-
},
416-
_ => {
417-
// We can omit updating the hash for BOLT11 payments as the payment hash
418-
// will always be known from the beginning.
419-
},
420-
}
502+
updated = payment.update(update);
503+
if updated {
504+
self.persist_info(&update.id, payment)?;
421505
}
422-
if let Some(preimage_opt) = update.preimage {
423-
match payment.kind {
424-
PaymentKind::Bolt11 { ref mut preimage, .. } => *preimage = preimage_opt,
425-
PaymentKind::Bolt11Jit { ref mut preimage, .. } => *preimage = preimage_opt,
426-
PaymentKind::Bolt12Offer { ref mut preimage, .. } => *preimage = preimage_opt,
427-
PaymentKind::Bolt12Refund { ref mut preimage, .. } => *preimage = preimage_opt,
428-
PaymentKind::Spontaneous { ref mut preimage, .. } => *preimage = preimage_opt,
429-
_ => {},
430-
}
431-
}
432-
433-
if let Some(secret_opt) = update.secret {
434-
match payment.kind {
435-
PaymentKind::Bolt11 { ref mut secret, .. } => *secret = secret_opt,
436-
PaymentKind::Bolt11Jit { ref mut secret, .. } => *secret = secret_opt,
437-
PaymentKind::Bolt12Offer { ref mut secret, .. } => *secret = secret_opt,
438-
PaymentKind::Bolt12Refund { ref mut secret, .. } => *secret = secret_opt,
439-
_ => {},
440-
}
441-
}
442-
443-
if let Some(amount_opt) = update.amount_msat {
444-
payment.amount_msat = amount_opt;
445-
}
446-
447-
if let Some(status) = update.status {
448-
payment.status = status;
449-
}
450-
451-
payment.latest_update_timestamp = SystemTime::now()
452-
.duration_since(UNIX_EPOCH)
453-
.unwrap_or(Duration::from_secs(0))
454-
.as_secs();
455-
456-
self.persist_info(&update.id, payment)?;
457-
updated = true;
458506
}
459507
Ok(updated)
460508
}

0 commit comments

Comments
 (0)