diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2025-12-05 12:03:52 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2025-12-05 12:03:52 +0000 |
| commit | 339b0c02f2cec25ae804dc882f5ce7d1dd58b9a6 (patch) | |
| tree | e3d80676913de96c2ac75eb2dc9a8954c88ab633 /src | |
| parent | ef7ba7c59b8e0b6369f63b8a46e202693963d92b (diff) | |
rename sunc_bootstrap_relay_url
Diffstat (limited to 'src')
| -rw-r--r-- | src/config.rs | 10 | ||||
| -rw-r--r-- | src/http/nip11.rs | 6 | ||||
| -rw-r--r-- | src/main.rs | 8 | ||||
| -rw-r--r-- | src/sync/manager.rs | 33 |
4 files changed, 31 insertions, 26 deletions
diff --git a/src/config.rs b/src/config.rs index 07e67c8..69a160a 100644 --- a/src/config.rs +++ b/src/config.rs | |||
| @@ -84,9 +84,10 @@ pub struct Config { | |||
| 84 | #[arg(long = "metrics-top-n-repos", env = "NGIT_METRICS_TOP_N_REPOS", default_value_t = 10)] | 84 | #[arg(long = "metrics-top-n-repos", env = "NGIT_METRICS_TOP_N_REPOS", default_value_t = 10)] |
| 85 | pub metrics_top_n_repos: usize, | 85 | pub metrics_top_n_repos: usize, |
| 86 | 86 | ||
| 87 | /// URL of relay to sync kind 30617 events from (optional, enables proactive sync) | 87 | /// URL of bootstrap relay to sync from on startup (optional) |
| 88 | #[arg(long, env = "NGIT_SYNC_RELAY_URL")] | 88 | /// Sync discovers additional relays from repository announcements that list our service |
| 89 | pub sync_relay_url: Option<String>, | 89 | #[arg(long, env = "NGIT_SYNC_BOOTSTRAP_RELAY_URL")] |
| 90 | pub sync_bootstrap_relay_url: Option<String>, | ||
| 90 | 91 | ||
| 91 | /// Maximum backoff time in seconds for sync relay reconnection (default: 3600 = 1 hour) | 92 | /// Maximum backoff time in seconds for sync relay reconnection (default: 3600 = 1 hour) |
| 92 | #[arg(long, env = "NGIT_SYNC_MAX_BACKOFF_SECS", default_value_t = 3600)] | 93 | #[arg(long, env = "NGIT_SYNC_MAX_BACKOFF_SECS", default_value_t = 3600)] |
| @@ -163,11 +164,12 @@ impl Config { | |||
| 163 | metrics_enabled: true, | 164 | metrics_enabled: true, |
| 164 | metrics_connection_per_ip_abuse_threshold: 10, | 165 | metrics_connection_per_ip_abuse_threshold: 10, |
| 165 | metrics_top_n_repos: 10, | 166 | metrics_top_n_repos: 10, |
| 166 | sync_relay_url: None, | 167 | sync_bootstrap_relay_url: None, |
| 167 | sync_max_backoff_secs: 3600, | 168 | sync_max_backoff_secs: 3600, |
| 168 | sync_startup_delay_secs: 30, | 169 | sync_startup_delay_secs: 30, |
| 169 | sync_reconnect_delay_secs: 10, | 170 | sync_reconnect_delay_secs: 10, |
| 170 | sync_reconnect_lookback_days: 3, | 171 | sync_reconnect_lookback_days: 3, |
| 172 | sync_startup_jitter_ms: 10_000, | ||
| 171 | } | 173 | } |
| 172 | } | 174 | } |
| 173 | } | 175 | } |
diff --git a/src/http/nip11.rs b/src/http/nip11.rs index 5d362bb..80165ee 100644 --- a/src/http/nip11.rs +++ b/src/http/nip11.rs | |||
| @@ -105,11 +105,12 @@ mod tests { | |||
| 105 | metrics_enabled: true, | 105 | metrics_enabled: true, |
| 106 | metrics_connection_per_ip_abuse_threshold: 10, | 106 | metrics_connection_per_ip_abuse_threshold: 10, |
| 107 | metrics_top_n_repos: 10, | 107 | metrics_top_n_repos: 10, |
| 108 | sync_relay_url: None, | 108 | sync_bootstrap_relay_url: None, |
| 109 | sync_max_backoff_secs: 3600, | 109 | sync_max_backoff_secs: 3600, |
| 110 | sync_startup_delay_secs: 30, | 110 | sync_startup_delay_secs: 30, |
| 111 | sync_reconnect_delay_secs: 10, | 111 | sync_reconnect_delay_secs: 10, |
| 112 | sync_reconnect_lookback_days: 3, | 112 | sync_reconnect_lookback_days: 3, |
| 113 | sync_startup_jitter_ms: 10_000, | ||
| 113 | }; | 114 | }; |
| 114 | 115 | ||
| 115 | let doc = RelayInformationDocument::from_config(&config); | 116 | let doc = RelayInformationDocument::from_config(&config); |
| @@ -144,11 +145,12 @@ mod tests { | |||
| 144 | metrics_enabled: true, | 145 | metrics_enabled: true, |
| 145 | metrics_connection_per_ip_abuse_threshold: 10, | 146 | metrics_connection_per_ip_abuse_threshold: 10, |
| 146 | metrics_top_n_repos: 10, | 147 | metrics_top_n_repos: 10, |
| 147 | sync_relay_url: None, | 148 | sync_bootstrap_relay_url: None, |
| 148 | sync_max_backoff_secs: 3600, | 149 | sync_max_backoff_secs: 3600, |
| 149 | sync_startup_delay_secs: 30, | 150 | sync_startup_delay_secs: 30, |
| 150 | sync_reconnect_delay_secs: 10, | 151 | sync_reconnect_delay_secs: 10, |
| 151 | sync_reconnect_lookback_days: 3, | 152 | sync_reconnect_lookback_days: 3, |
| 153 | sync_startup_jitter_ms: 10_000, | ||
| 152 | }; | 154 | }; |
| 153 | 155 | ||
| 154 | let doc = RelayInformationDocument::from_config(&config); | 156 | let doc = RelayInformationDocument::from_config(&config); |
diff --git a/src/main.rs b/src/main.rs index 9273afd..f887e42 100644 --- a/src/main.rs +++ b/src/main.rs | |||
| @@ -52,17 +52,17 @@ async fn main() -> Result<()> { | |||
| 52 | ); | 52 | ); |
| 53 | 53 | ||
| 54 | // Start SyncManager for proactive sync (Phase 2: multi-relay support, Phase 3: health tracking) | 54 | // Start SyncManager for proactive sync (Phase 2: multi-relay support, Phase 3: health tracking) |
| 55 | // Even without initial sync_relay_url, SyncManager can discover relays from stored announcements | 55 | // Even without bootstrap relay, SyncManager discovers relays from stored announcements |
| 56 | let sync_manager = SyncManager::new( | 56 | let sync_manager = SyncManager::new( |
| 57 | config.sync_relay_url.clone(), | 57 | config.sync_bootstrap_relay_url.clone(), |
| 58 | config.domain.clone(), | 58 | config.domain.clone(), |
| 59 | relay_with_db.database.clone(), | 59 | relay_with_db.database.clone(), |
| 60 | relay_with_db.write_policy.clone(), | 60 | relay_with_db.write_policy.clone(), |
| 61 | &config, | 61 | &config, |
| 62 | ); | 62 | ); |
| 63 | 63 | ||
| 64 | if config.sync_relay_url.is_some() { | 64 | if config.sync_bootstrap_relay_url.is_some() { |
| 65 | info!("Starting proactive sync from: {:?}", config.sync_relay_url); | 65 | info!("Starting proactive sync with bootstrap relay: {:?}", config.sync_bootstrap_relay_url); |
| 66 | } else { | 66 | } else { |
| 67 | info!("Proactive sync enabled (will discover relays from stored announcements)"); | 67 | info!("Proactive sync enabled (will discover relays from stored announcements)"); |
| 68 | } | 68 | } |
diff --git a/src/sync/manager.rs b/src/sync/manager.rs index 6fcfcd7..96bf0f4 100644 --- a/src/sync/manager.rs +++ b/src/sync/manager.rs | |||
| @@ -60,8 +60,9 @@ fn get_sync_source_addr(bind_address: &str) -> SocketAddr { | |||
| 60 | 60 | ||
| 61 | /// Coordinates proactive sync from configured and discovered relays | 61 | /// Coordinates proactive sync from configured and discovered relays |
| 62 | pub struct SyncManager { | 62 | pub struct SyncManager { |
| 63 | /// Initial relay URL to sync from (from config) | 63 | /// Bootstrap relay URL for initial sync (from config) |
| 64 | initial_relay_url: Option<String>, | 64 | /// Additional relays are discovered from repository announcements that list our service |
| 65 | bootstrap_relay_url: Option<String>, | ||
| 65 | /// Our relay's domain (for filtering) | 66 | /// Our relay's domain (for filtering) |
| 66 | relay_domain: String, | 67 | relay_domain: String, |
| 67 | /// Database for storing accepted events | 68 | /// Database for storing accepted events |
| @@ -82,20 +83,20 @@ impl SyncManager { | |||
| 82 | /// Create a new SyncManager | 83 | /// Create a new SyncManager |
| 83 | /// | 84 | /// |
| 84 | /// # Arguments | 85 | /// # Arguments |
| 85 | /// * `initial_relay_url` - Optional initial relay URL from config | 86 | /// * `bootstrap_relay_url` - Optional bootstrap relay URL from config |
| 86 | /// * `relay_domain` - Our relay's domain (used to exclude self from sync) | 87 | /// * `relay_domain` - Our relay's domain (used to exclude self from sync) |
| 87 | /// * `database` - Shared database for storing events and querying announcements | 88 | /// * `database` - Shared database for storing events and querying announcements |
| 88 | /// * `write_policy` - Write policy for validating synced events | 89 | /// * `write_policy` - Write policy for validating synced events |
| 89 | /// * `config` - Configuration for health tracking settings | 90 | /// * `config` - Configuration for health tracking settings |
| 90 | pub fn new( | 91 | pub fn new( |
| 91 | initial_relay_url: Option<String>, | 92 | bootstrap_relay_url: Option<String>, |
| 92 | relay_domain: String, | 93 | relay_domain: String, |
| 93 | database: SharedDatabase, | 94 | database: SharedDatabase, |
| 94 | write_policy: Nip34WritePolicy, | 95 | write_policy: Nip34WritePolicy, |
| 95 | config: &Config, | 96 | config: &Config, |
| 96 | ) -> Self { | 97 | ) -> Self { |
| 97 | Self { | 98 | Self { |
| 98 | initial_relay_url, | 99 | bootstrap_relay_url, |
| 99 | relay_domain, | 100 | relay_domain, |
| 100 | database, | 101 | database, |
| 101 | write_policy, | 102 | write_policy, |
| @@ -109,14 +110,14 @@ impl SyncManager { | |||
| 109 | /// Create a new SyncManager with metrics | 110 | /// Create a new SyncManager with metrics |
| 110 | /// | 111 | /// |
| 111 | /// # Arguments | 112 | /// # Arguments |
| 112 | /// * `initial_relay_url` - Optional initial relay URL from config | 113 | /// * `bootstrap_relay_url` - Optional bootstrap relay URL from config |
| 113 | /// * `relay_domain` - Our relay's domain (used to exclude self from sync) | 114 | /// * `relay_domain` - Our relay's domain (used to exclude self from sync) |
| 114 | /// * `database` - Shared database for storing events and querying announcements | 115 | /// * `database` - Shared database for storing events and querying announcements |
| 115 | /// * `write_policy` - Write policy for validating synced events | 116 | /// * `write_policy` - Write policy for validating synced events |
| 116 | /// * `config` - Configuration for health tracking settings | 117 | /// * `config` - Configuration for health tracking settings |
| 117 | /// * `metrics` - Sync metrics for Prometheus | 118 | /// * `metrics` - Sync metrics for Prometheus |
| 118 | pub fn with_metrics( | 119 | pub fn with_metrics( |
| 119 | initial_relay_url: Option<String>, | 120 | bootstrap_relay_url: Option<String>, |
| 120 | relay_domain: String, | 121 | relay_domain: String, |
| 121 | database: SharedDatabase, | 122 | database: SharedDatabase, |
| 122 | write_policy: Nip34WritePolicy, | 123 | write_policy: Nip34WritePolicy, |
| @@ -124,7 +125,7 @@ impl SyncManager { | |||
| 124 | metrics: SyncMetrics, | 125 | metrics: SyncMetrics, |
| 125 | ) -> Self { | 126 | ) -> Self { |
| 126 | Self { | 127 | Self { |
| 127 | initial_relay_url, | 128 | bootstrap_relay_url, |
| 128 | relay_domain, | 129 | relay_domain, |
| 129 | database, | 130 | database, |
| 130 | write_policy, | 131 | write_policy, |
| @@ -137,14 +138,14 @@ impl SyncManager { | |||
| 137 | 138 | ||
| 138 | /// Create a SyncManager with a single relay URL (Phase 1 compatibility) | 139 | /// Create a SyncManager with a single relay URL (Phase 1 compatibility) |
| 139 | pub fn with_single_relay( | 140 | pub fn with_single_relay( |
| 140 | sync_relay_url: String, | 141 | bootstrap_url: String, |
| 141 | database: SharedDatabase, | 142 | database: SharedDatabase, |
| 142 | write_policy: Nip34WritePolicy, | 143 | write_policy: Nip34WritePolicy, |
| 143 | ) -> Self { | 144 | ) -> Self { |
| 144 | // Extract domain from URL for filtering | 145 | // Extract domain from URL for filtering |
| 145 | let relay_domain = extract_domain_from_url(&sync_relay_url).unwrap_or_default(); | 146 | let relay_domain = extract_domain_from_url(&bootstrap_url).unwrap_or_default(); |
| 146 | Self { | 147 | Self { |
| 147 | initial_relay_url: Some(sync_relay_url), | 148 | bootstrap_relay_url: Some(bootstrap_url), |
| 148 | relay_domain, | 149 | relay_domain, |
| 149 | database, | 150 | database, |
| 150 | write_policy, | 151 | write_policy, |
| @@ -176,9 +177,9 @@ impl SyncManager { | |||
| 176 | /// and processes incoming events. Runs indefinitely until cancelled. | 177 | /// and processes incoming events. Runs indefinitely until cancelled. |
| 177 | pub async fn run(self) { | 178 | pub async fn run(self) { |
| 178 | tracing::info!( | 179 | tracing::info!( |
| 179 | "Starting SyncManager (domain: {}, initial relay: {:?})", | 180 | "Starting SyncManager (domain: {}, bootstrap relay: {:?})", |
| 180 | self.relay_domain, | 181 | self.relay_domain, |
| 181 | self.initial_relay_url | 182 | self.bootstrap_relay_url |
| 182 | ); | 183 | ); |
| 183 | 184 | ||
| 184 | // Create the filter service | 185 | // Create the filter service |
| @@ -196,13 +197,13 @@ impl SyncManager { | |||
| 196 | // Collect all relays to connect to | 197 | // Collect all relays to connect to |
| 197 | let mut relays_to_connect: Vec<String> = Vec::new(); | 198 | let mut relays_to_connect: Vec<String> = Vec::new(); |
| 198 | 199 | ||
| 199 | // Start with initial relay if configured | 200 | // Start with bootstrap relay if configured |
| 200 | if let Some(ref url) = self.initial_relay_url { | 201 | if let Some(ref url) = self.bootstrap_relay_url { |
| 201 | if !self.is_own_relay(url) { | 202 | if !self.is_own_relay(url) { |
| 202 | relays_to_connect.push(url.clone()); | 203 | relays_to_connect.push(url.clone()); |
| 203 | active_relays.insert(url.clone()); | 204 | active_relays.insert(url.clone()); |
| 204 | } else { | 205 | } else { |
| 205 | tracing::info!("Skipping initial relay (is our own relay): {}", url); | 206 | tracing::info!("Skipping bootstrap relay (is our own relay): {}", url); |
| 206 | } | 207 | } |
| 207 | } | 208 | } |
| 208 | 209 | ||