Avoid `poll`ing completed futures in the `background-processor` 2023-03-future-poll-panic
authorMatt Corallo <git@bluematt.me>
Tue, 7 Mar 2023 18:06:12 +0000 (18:06 +0000)
committerMatt Corallo <git@bluematt.me>
Tue, 7 Mar 2023 18:06:12 +0000 (18:06 +0000)
`poll`ing completed futures invokes undefined behavior in Rust
(panics, etc, obviously not memory corruption as its not unsafe).
Sadly, in our futures-based version of
`lightning-background-processor` we have one case where we can
`poll` a completed future - if the timer for the network graph
prune + persist completes without a network graph to prune +
persist we'll happily poll the same future over and over again,
likely panicing in user code.

lightning-background-processor/src/lib.rs

index a6de0a62fb07583ae29741b87d209c0e66ee7c5d..d5b6d3f2c8d33d7607abdd7cf512ec8f4f083db6 100644 (file)
@@ -349,9 +349,9 @@ macro_rules! define_run_body {
                                                log_error!($logger, "Error: Failed to persist network graph, check your disk and permissions {}", e)
                                        }
 
-                                       last_prune_call = $get_timer(NETWORK_PRUNE_TIMER);
                                        have_pruned = true;
                                }
+                               last_prune_call = $get_timer(NETWORK_PRUNE_TIMER);
                        }
 
                        if $timer_elapsed(&mut last_scorer_persist_call, SCORER_PERSIST_TIMER) {