Skip to content

Commit 0411604

Browse files
committed
add timing logs
1 parent edd82ba commit 0411604

5 files changed

Lines changed: 101 additions & 13 deletions

File tree

lightning-liquidity/src/lsps4/client.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ use std::string::String;
2828

2929
use core::default::Default;
3030
use core::ops::Deref;
31+
use std::time::Instant;
3132

3233
use crate::lsps4::msgs::{
3334
RegisterNodeRequest, RegisterNodeResponse, LSPS4Message, LSPS4Request,
@@ -89,14 +90,19 @@ where
8990
pub fn register_node(
9091
&self, counterparty_node_id: PublicKey
9192
) -> Result<LSPSRequestId, APIError> {
93+
let fn_start = Instant::now();
94+
eprintln!("TIMING: [LSPS4 Client] register_node START for peer {}", counterparty_node_id);
95+
9296
let request_id = crate::utils::generate_request_id(&self.entropy_source);
9397

9498
{
99+
let step_start = Instant::now();
95100
let mut outer_state_lock = self.per_peer_state.write().unwrap();
96101
let inner_state_lock = outer_state_lock
97102
.entry(counterparty_node_id)
98103
.or_insert(Mutex::new(PeerState::new()));
99104
let mut peer_state_lock = inner_state_lock.lock().unwrap();
105+
eprintln!("TIMING: [LSPS4 Client] register_node state lock acquisition took {}ms", step_start.elapsed().as_millis());
100106

101107
if !peer_state_lock
102108
.pending_register_node_requests
@@ -114,13 +120,17 @@ where
114120
let mut message_queue_notifier = self.pending_messages.notifier();
115121
message_queue_notifier.enqueue(&counterparty_node_id, msg);
116122

123+
eprintln!("TIMING: [LSPS4 Client] register_node TOTAL took {}ms", fn_start.elapsed().as_millis());
117124
Ok(request_id)
118125
}
119126

120127

121128
fn handle_register_node_response(
122129
&self, request_id: LSPSRequestId, counterparty_node_id: &PublicKey, result: RegisterNodeResponse,
123130
) -> Result<(), LightningError> {
131+
let fn_start = Instant::now();
132+
eprintln!("TIMING: [LSPS4 Client] handle_register_node_response START from peer {} with SCID {:?}", counterparty_node_id, result.jit_channel_scid);
133+
124134
let outer_state_lock = self.per_peer_state.read().unwrap();
125135
match outer_state_lock.get(counterparty_node_id) {
126136
Some(inner_state_lock) => {
@@ -146,6 +156,7 @@ where
146156
cltv_expiry_delta: result.lsp_cltv_expiry_delta,
147157
},
148158
));
159+
eprintln!("TIMING: [LSPS4 Client] handle_register_node_response TOTAL took {}ms - InvoiceParametersReady event enqueued with SCID {}", fn_start.elapsed().as_millis(), intercept_scid);
149160
} else {
150161
return Err(LightningError {
151162
err: format!(

lightning-liquidity/src/lsps4/service.rs

Lines changed: 56 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ const HTLC_EXPIRY_THRESHOLD_SECS: u64 = 10;
5353
use crate::utils::async_poll::dummy_waker;
5454
use core::task;
5555
use std::future::Future;
56+
use std::time::Instant;
5657

5758
/// Action to forward a specific HTLC through a channel
5859
#[derive(Debug)]
@@ -147,18 +148,21 @@ where
147148
&self, intercept_scid: u64, intercept_id: InterceptId, expected_outbound_amount_msat: u64,
148149
payment_hash: PaymentHash,
149150
) -> Result<(), APIError> {
151+
let fn_start = Instant::now();
150152
log_info!(
151153
self.logger,
152-
"[LSPS4] HTLC intercepted - SCID: {}, intercept_id: {:?}, amount: {} msat, payment_hash: {}",
154+
"TIMING: [LSPS4] htlc_intercepted START - SCID: {}, intercept_id: {:?}, amount: {} msat, payment_hash: {}",
153155
intercept_scid,
154156
intercept_id,
155157
expected_outbound_amount_msat,
156158
payment_hash
157159
);
160+
let step_start = Instant::now();
158161
if let Some(counterparty_node_id) = self.scid_store.get_peer(intercept_scid) {
159162
log_info!(
160163
self.logger,
161-
"[LSPS4] SCID {} matched to peer {}, processing HTLC",
164+
"TIMING: [LSPS4] htlc_intercepted scid_store.get_peer() took {}ms - SCID {} matched to peer {}",
165+
step_start.elapsed().as_millis(),
162166
intercept_scid,
163167
counterparty_node_id
164168
);
@@ -173,35 +177,43 @@ where
173177
if !self.is_peer_connected(&counterparty_node_id) {
174178
log_debug!(
175179
self.logger,
176-
"[htlc_intercepted] Peer {} not connected, storing HTLC and sending webhook",
180+
"TIMING: [htlc_intercepted] Peer {} not connected, storing HTLC and sending webhook",
177181
counterparty_node_id
178182
);
183+
let store_start = Instant::now();
179184
self.htlc_store.insert(htlc).unwrap(); // TODO: handle persistence failures
185+
log_info!(self.logger, "TIMING: [LSPS4] htlc_intercepted htlc_store.insert() took {}ms", store_start.elapsed().as_millis());
180186
let mut event_queue_notifier = self.pending_events.notifier();
181187
event_queue_notifier.enqueue(crate::events::LiquidityEvent::LSPS4Service(LSPS4ServiceEvent::SendWebhook {
182188
counterparty_node_id: counterparty_node_id.clone(),
183189
}));
184190
} else {
185191
log_debug!(
186192
self.logger,
187-
"[htlc_intercepted] Peer {} connected, processing HTLC immediately",
193+
"TIMING: [htlc_intercepted] Peer {} connected, processing HTLC immediately",
188194
counterparty_node_id
189195
);
196+
let calc_start = Instant::now();
190197
let actions =
191198
self.calculate_htlc_actions_for_peer(counterparty_node_id, vec![htlc.clone()]);
199+
log_info!(self.logger, "TIMING: [LSPS4] htlc_intercepted calculate_htlc_actions_for_peer() took {}ms", calc_start.elapsed().as_millis());
192200

193201
if actions.new_channel_needed_msat.is_some() {
202+
let store_start = Instant::now();
194203
self.htlc_store.insert(htlc).unwrap(); // TODO: handle persistence failures
204+
log_info!(self.logger, "TIMING: [LSPS4] htlc_intercepted htlc_store.insert() took {}ms", store_start.elapsed().as_millis());
195205
}
196206

197207
log_debug!(
198208
self.logger,
199-
"[htlc_intercepted] Calculated actions for peer {}: {:?}",
209+
"TIMING: [htlc_intercepted] Calculated actions for peer {}: {:?}",
200210
counterparty_node_id,
201211
actions
202212
);
203213

214+
let exec_start = Instant::now();
204215
self.execute_htlc_actions(actions, counterparty_node_id.clone());
216+
log_info!(self.logger, "TIMING: [LSPS4] htlc_intercepted execute_htlc_actions() took {}ms", exec_start.elapsed().as_millis());
205217
}
206218
} else {
207219
log_error!(
@@ -211,9 +223,10 @@ where
211223
intercept_id
212224
);
213225
}
214-
log_debug!(
226+
log_info!(
215227
self.logger,
216-
"[htlc_intercepted] Finalizing htlc_intercepted for intercept_scid {}",
228+
"TIMING: [LSPS4] htlc_intercepted TOTAL took {}ms for intercept_scid {}",
229+
fn_start.elapsed().as_millis(),
217230
intercept_scid
218231
);
219232

@@ -295,31 +308,42 @@ where
295308
fn handle_register_node_request(
296309
&self, request_id: LSPSRequestId, counterparty_node_id: &PublicKey, _params: RegisterNodeRequest,
297310
) -> Result<(), LightningError> {
311+
let fn_start = Instant::now();
298312
log_info!(
299313
self.logger,
300-
"[LSPS4] Received RegisterNodeRequest from {} with request_id {:?}",
314+
"TIMING: [LSPS4] handle_register_node_request START from {} with request_id {:?}",
301315
counterparty_node_id,
302316
request_id
303317
);
304318

319+
let step_start = Instant::now();
305320
let intercept_scid = match self.scid_store.get_scid(counterparty_node_id) {
306321
Some(intercept_scid) => {
307322
log_info!(
308323
self.logger,
309-
"[LSPS4] Found existing intercept SCID {} for peer {}",
324+
"TIMING: [LSPS4] handle_register_node_request scid_store.get_scid() took {}ms - Found existing intercept SCID {} for peer {}",
325+
step_start.elapsed().as_millis(),
310326
intercept_scid,
311327
counterparty_node_id
312328
);
313329
intercept_scid
314330
},
315331
None => {
332+
log_info!(
333+
self.logger,
334+
"TIMING: [LSPS4] handle_register_node_request scid_store.get_scid() took {}ms - No existing SCID",
335+
step_start.elapsed().as_millis()
336+
);
337+
let gen_start = Instant::now();
316338
let intercept_scid = self.channel_manager.get_cm().get_intercept_scid();
317339
log_info!(
318340
self.logger,
319-
"[LSPS4] Generated NEW intercept SCID {} for peer {}",
341+
"TIMING: [LSPS4] handle_register_node_request get_intercept_scid() took {}ms - Generated NEW intercept SCID {} for peer {}",
342+
gen_start.elapsed().as_millis(),
320343
intercept_scid,
321344
counterparty_node_id
322345
);
346+
let store_start = Instant::now();
323347
self.scid_store.add_intercepted_scid(intercept_scid, counterparty_node_id.clone())
324348
.map_err(|e| {
325349
log_error!(
@@ -336,7 +360,8 @@ where
336360
})?;
337361
log_info!(
338362
self.logger,
339-
"[LSPS4] Successfully stored intercept SCID {} for peer {}",
363+
"TIMING: [LSPS4] handle_register_node_request scid_store.add_intercepted_scid() took {}ms - Successfully stored intercept SCID {} for peer {}",
364+
store_start.elapsed().as_millis(),
340365
intercept_scid,
341366
counterparty_node_id
342367
);
@@ -360,7 +385,8 @@ where
360385

361386
log_info!(
362387
self.logger,
363-
"[LSPS4] RegisterNodeResponse enqueued successfully for peer {}",
388+
"TIMING: [LSPS4] handle_register_node_request TOTAL took {}ms for peer {}",
389+
fn_start.elapsed().as_millis(),
364390
counterparty_node_id
365391
);
366392

@@ -474,6 +500,9 @@ where
474500
pub(crate) fn execute_htlc_actions(
475501
&self, actions: HtlcProcessingActions, their_node_id: PublicKey,
476502
) {
503+
let fn_start = Instant::now();
504+
log_info!(self.logger, "TIMING: [LSPS4] execute_htlc_actions START for peer {} with {} forwards", their_node_id, actions.forwards.len());
505+
477506
// Execute forwards
478507
for forward_action in actions.forwards {
479508
log_debug!(
@@ -485,6 +514,7 @@ where
485514
forward_action.skimmed_fee_msat
486515
);
487516

517+
let fwd_start = Instant::now();
488518
if let Err(e) = self.channel_manager.get_cm().forward_intercepted_htlc(
489519
forward_action.htlc.id(),
490520
&forward_action.channel_id,
@@ -493,18 +523,21 @@ where
493523
) {
494524
log_error!(self.logger, "Failed to forward intercepted HTLC: {:?}", e);
495525
}
526+
log_info!(self.logger, "TIMING: [LSPS4] execute_htlc_actions forward_intercepted_htlc() took {}ms", fwd_start.elapsed().as_millis());
496527

497528
// Remove the HTLC from store after forwarding
529+
let rm_start = Instant::now();
498530
if let Err(e) = self.htlc_store.remove(&forward_action.htlc.id()) {
499531
log_error!(self.logger, "Failed to remove intercepted HTLC from store: {}", e);
500532
}
533+
log_info!(self.logger, "TIMING: [LSPS4] execute_htlc_actions htlc_store.remove() took {}ms", rm_start.elapsed().as_millis());
501534
}
502535

503536
// Handle new channel opening
504537
if let Some(channel_size_msat) = actions.new_channel_needed_msat {
505538
log_info!(
506539
self.logger,
507-
"Need a new channel with peer {} for {}msat to forward HTLCs",
540+
"TIMING: [LSPS4] execute_htlc_actions Need a new channel with peer {} for {}msat to forward HTLCs",
508541
their_node_id,
509542
channel_size_msat
510543
);
@@ -516,18 +549,27 @@ where
516549
channel_count: actions.channel_count,
517550
}));
518551
}
552+
553+
log_info!(self.logger, "TIMING: [LSPS4] execute_htlc_actions TOTAL took {}ms", fn_start.elapsed().as_millis());
519554
}
520555

521556
/// Convenience function that calculates and executes HTLC actions in one call
522557
pub(crate) fn process_htlcs_for_peer(
523558
&self, their_node_id: PublicKey, htlcs: Vec<InterceptedHtlc>,
524559
) {
560+
let fn_start = Instant::now();
561+
let htlc_count = htlcs.len();
562+
log_info!(self.logger, "TIMING: [LSPS4] process_htlcs_for_peer START for peer {} with {} HTLCs", their_node_id, htlc_count);
563+
564+
let calc_start = Instant::now();
525565
let actions = self.calculate_htlc_actions_for_peer(their_node_id, htlcs);
566+
log_info!(self.logger, "TIMING: [LSPS4] process_htlcs_for_peer calculate_htlc_actions_for_peer() took {}ms", calc_start.elapsed().as_millis());
526567

527568
log_info!(self.logger, "Calculated actions for peer {}: {:?}", their_node_id, actions);
528569

529570
if actions.is_empty() {
530571
log_debug!(self.logger, "No HTLCs to process for peer {}", their_node_id);
572+
log_info!(self.logger, "TIMING: [LSPS4] process_htlcs_for_peer TOTAL took {}ms (no actions)", fn_start.elapsed().as_millis());
531573
return;
532574
}
533575

@@ -542,6 +584,7 @@ where
542584
}
543585

544586
self.execute_htlc_actions(actions, their_node_id);
587+
log_info!(self.logger, "TIMING: [LSPS4] process_htlcs_for_peer TOTAL took {}ms", fn_start.elapsed().as_millis());
545588
}
546589

547590
/// Persists the state of the service handler towards the given [`KVStore`] implementation.

lightning/src/ln/channelmanager.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,8 @@ use core::ops::Deref;
184184
use core::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
185185
use core::time::Duration;
186186
use core::{cmp, mem};
187+
#[cfg(feature = "std")]
188+
use crate::util::time::Instant;
187189
// Re-export this for use in the public API.
188190
#[cfg(any(test, feature = "_externalize_tests"))]
189191
pub(crate) use crate::ln::outbound_payment::PaymentSendFailure;
@@ -7093,6 +7095,9 @@ where
70937095
/// Users implementing their own background processing logic should call this in irregular,
70947096
/// randomly-distributed intervals.
70957097
pub fn process_pending_htlc_forwards(&self) {
7098+
#[cfg(feature = "std")]
7099+
let fn_start = Instant::now();
7100+
70967101
if self
70977102
.pending_htlc_forwards_processor
70987103
.compare_exchange(false, true, Ordering::Acquire, Ordering::Relaxed)
@@ -7106,6 +7111,9 @@ where
71067111
});
71077112

71087113
self.pending_htlc_forwards_processor.store(false, Ordering::Release);
7114+
7115+
#[cfg(feature = "std")]
7116+
log_trace!(self.logger, "TIMING: process_pending_htlc_forwards() took {}ms", fn_start.elapsed().as_millis());
71097117
}
71107118

71117119
// Returns whether or not we need to re-persist.

lightning/src/ln/outbound_payment.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1426,6 +1426,10 @@ where
14261426
L::Target: Logger,
14271427
IH: Fn() -> InFlightHtlcs,
14281428
{
1429+
#[cfg(feature = "std")]
1430+
let fn_start = Instant::now();
1431+
log_trace!(self.logger, "TIMING: find_initial_route() START payment_id={} final_value_msat={}", payment_id, route_params.final_value_msat);
1432+
14291433
#[cfg(feature = "std")] {
14301434
if has_expired(&route_params) {
14311435
log_error!(self.logger, "Payment with id {} and hash {} had expired before we started paying",
@@ -1443,6 +1447,8 @@ where
14431447
RetryableSendFailure::OnionPacketSizeExceeded
14441448
})?;
14451449

1450+
#[cfg(feature = "std")]
1451+
let route_start = Instant::now();
14461452
let mut route = router.find_route_with_id(
14471453
&node_signer.get_node_id(Recipient::Node).unwrap(), route_params,
14481454
Some(&first_hops.iter().collect::<Vec<_>>()), inflight_htlcs(),
@@ -1452,6 +1458,8 @@ where
14521458
payment_id, payment_hash);
14531459
RetryableSendFailure::RouteNotFound
14541460
})?;
1461+
#[cfg(feature = "std")]
1462+
log_trace!(self.logger, "TIMING: find_initial_route() router.find_route_with_id() took {}ms", route_start.elapsed().as_millis());
14551463

14561464
if route.route_params.as_ref() != Some(route_params) {
14571465
debug_assert!(false,
@@ -1460,6 +1468,8 @@ where
14601468
route.route_params = Some(route_params.clone());
14611469
}
14621470

1471+
#[cfg(feature = "std")]
1472+
log_trace!(self.logger, "TIMING: find_initial_route() TOTAL took {}ms paths={}", fn_start.elapsed().as_millis(), route.paths.len());
14631473
Ok(route)
14641474
}
14651475

lightning/src/routing/router.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ use crate::util::ser::{Readable, ReadableArgs, Writeable, Writer};
3939

4040
use crate::io;
4141
use crate::prelude::*;
42+
use crate::util::time::Instant;
4243
use alloc::collections::BinaryHeap;
4344
use core::ops::Deref;
4445
use core::{cmp, fmt};
@@ -2423,10 +2424,24 @@ pub fn find_route<L: Deref, GL: Deref, S: ScoreLookUp>(
24232424
scorer: &S, score_params: &S::ScoreParams, random_seed_bytes: &[u8; 32]
24242425
) -> Result<Route, &'static str>
24252426
where L::Target: Logger, GL::Target: Logger {
2427+
let fn_start = Instant::now();
2428+
log_trace!(logger, "TIMING: find_route() START final_value_msat={}", route_params.final_value_msat);
2429+
2430+
let step_start = Instant::now();
24262431
let graph_lock = network_graph.read_only();
2432+
let graph_lock_time = step_start.elapsed().as_millis();
2433+
2434+
let step_start = Instant::now();
24272435
let mut route = get_route(our_node_pubkey, &route_params, &graph_lock, first_hops, logger,
24282436
scorer, score_params, random_seed_bytes)?;
2437+
let get_route_time = step_start.elapsed().as_millis();
2438+
24292439
add_random_cltv_offset(&mut route, &route_params.payment_params, &graph_lock, random_seed_bytes);
2440+
let total_time = fn_start.elapsed().as_millis();
2441+
let path_count = route.paths.len();
2442+
2443+
#[cfg(feature = "std")]
2444+
eprintln!("TIMING: find_route() network_graph.read_only() took {}ms, get_route() took {}ms, TOTAL took {}ms paths={}", graph_lock_time, get_route_time, total_time, path_count);
24302445
Ok(route)
24312446
}
24322447

@@ -3722,6 +3737,7 @@ where L::Target: Logger {
37223737
}
37233738

37243739
log_info!(logger, "Got route: {}", log_route!(route));
3740+
log_trace!(logger, "TIMING: get_route() completed with {} paths", route.paths.len());
37253741
Ok(route)
37263742
}
37273743

0 commit comments

Comments
 (0)