Merge pull request #1953 from arik-so/2023-01-debug-gossip-heisenbug
authorMatt Corallo <649246+TheBlueMatt@users.noreply.github.com>
Sat, 14 Jan 2023 22:43:26 +0000 (22:43 +0000)
committerGitHub <noreply@github.com>
Sat, 14 Jan 2023 22:43:26 +0000 (22:43 +0000)
lightning/src/routing/gossip.rs

index d0682d47d7ed15d475791956ac55022825595813..d31d08f5ffb9c72466cc8825472109d1f8849b19 100644 (file)
@@ -1541,6 +1541,14 @@ impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
                #[cfg(not(feature = "std"))]
                let current_time_unix = None;
 
+               self.channel_failed_with_time(short_channel_id, is_permanent, current_time_unix)
+       }
+
+       /// Marks a channel in the graph as failed if a corresponding HTLC fail was sent.
+       /// If permanent, removes a channel from the local storage.
+       /// May cause the removal of nodes too, if this was their last channel.
+       /// If not permanent, makes channels unavailable for routing.
+       fn channel_failed_with_time(&self, short_channel_id: u64, is_permanent: bool, current_time_unix: Option<u64>) {
                let mut channels = self.channels.write().unwrap();
                if is_permanent {
                        if let Some(chan) = channels.remove(&short_channel_id) {
@@ -2537,18 +2545,18 @@ mod tests {
 
                        // Mark the channel as permanently failed. This will also remove the two nodes
                        // and all of the entries will be tracked as removed.
-                       network_graph.channel_failed(short_channel_id, true);
+                       network_graph.channel_failed_with_time(short_channel_id, true, Some(tracking_time));
 
                        // Should not remove from tracking if insufficient time has passed
                        network_graph.remove_stale_channels_and_tracking_with_time(
                                tracking_time + REMOVED_ENTRIES_TRACKING_AGE_LIMIT_SECS - 1);
-                       assert_eq!(network_graph.removed_channels.lock().unwrap().len(), 1);
+                       assert_eq!(network_graph.removed_channels.lock().unwrap().len(), 1, "Removed channel count ≠ 1 with tracking_time {}", tracking_time);
 
                        // Provide a later time so that sufficient time has passed
                        network_graph.remove_stale_channels_and_tracking_with_time(
                                tracking_time + REMOVED_ENTRIES_TRACKING_AGE_LIMIT_SECS);
-                       assert!(network_graph.removed_channels.lock().unwrap().is_empty());
-                       assert!(network_graph.removed_nodes.lock().unwrap().is_empty());
+                       assert!(network_graph.removed_channels.lock().unwrap().is_empty(), "Unexpectedly removed channels with tracking_time {}", tracking_time);
+                       assert!(network_graph.removed_nodes.lock().unwrap().is_empty(), "Unexpectedly removed nodes with tracking_time {}", tracking_time);
                }
 
                #[cfg(not(feature = "std"))]