upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/sync/mod.rs
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2025-12-11 12:36:51 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2025-12-11 12:36:51 +0000
commit83844a528365e657cd5f4d2cda51d72ced9900da (patch)
tree023052e0c7709341aa30ee7d40a62a26e2368cea /src/sync/mod.rs
parentb0ea9aa56c90fe36604e56707498261d761b9a56 (diff)
fix: wire up relay disconnection detection for metrics
- Add periodic health check in RelayConnection::run_event_loop that polls nostr-sdk's relay.is_connected() every second to detect dead connections - When event channel closes without explicit Closed/Shutdown, send DisconnectNotification to SyncManager (fixes case where TCP drops silently) - Enable test_relay_connected_status test which validates the ngit_sync_relay_connected metric correctly reflects connection state The issue was that when a remote relay stops abruptly, nostr-sdk's notification receiver blocks indefinitely waiting for data. TCP disconnect detection without keepalive can take minutes. The health check polls nostr-sdk's internal relay status which detects disconnection promptly.
Diffstat (limited to 'src/sync/mod.rs')
-rw-r--r--src/sync/mod.rs19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/sync/mod.rs b/src/sync/mod.rs
index c62b478..15c89e3 100644
--- a/src/sync/mod.rs
+++ b/src/sync/mod.rs
@@ -1251,6 +1251,9 @@ impl SyncManager {
1251 let metrics_clone = self.metrics.clone(); // Clone metrics for the spawned task 1251 let metrics_clone = self.metrics.clone(); // Clone metrics for the spawned task
1252 let is_bootstrap_clone = is_bootstrap; // Clone is_bootstrap for the spawned task 1252 let is_bootstrap_clone = is_bootstrap; // Clone is_bootstrap for the spawned task
1253 tokio::spawn(async move { 1253 tokio::spawn(async move {
1254 // Track whether we've already sent a disconnect notification
1255 let mut disconnect_sent = false;
1256
1254 while let Some(relay_event) = event_rx.recv().await { 1257 while let Some(relay_event) = event_rx.recv().await {
1255 match relay_event { 1258 match relay_event {
1256 RelayEvent::Event(event) => { 1259 RelayEvent::Event(event) => {
@@ -1297,6 +1300,7 @@ impl SyncManager {
1297 relay_url: relay_url_clone.clone(), 1300 relay_url: relay_url_clone.clone(),
1298 }) 1301 })
1299 .await; 1302 .await;
1303 disconnect_sent = true;
1300 break; 1304 break;
1301 } 1305 }
1302 RelayEvent::Shutdown => { 1306 RelayEvent::Shutdown => {
@@ -1307,10 +1311,25 @@ impl SyncManager {
1307 relay_url: relay_url_clone.clone(), 1311 relay_url: relay_url_clone.clone(),
1308 }) 1312 })
1309 .await; 1313 .await;
1314 disconnect_sent = true;
1310 break; 1315 break;
1311 } 1316 }
1312 } 1317 }
1313 } 1318 }
1319
1320 // If the event channel closed without a Closed/Shutdown event
1321 // (e.g., connection dropped unexpectedly), still notify SyncManager
1322 if !disconnect_sent {
1323 tracing::info!(
1324 relay = %relay_url_clone,
1325 "Event channel closed, notifying SyncManager of disconnect"
1326 );
1327 let _ = disconnect_tx
1328 .send(DisconnectNotification {
1329 relay_url: relay_url_clone.clone(),
1330 })
1331 .await;
1332 }
1314 }); 1333 });
1315 1334
1316 tracing::info!( 1335 tracing::info!(