44
55//! Internal Relay
66
7+ use std:: cmp;
78use std:: collections:: { HashMap , HashSet } ;
89use std:: sync:: atomic:: { AtomicBool , Ordering } ;
910use std:: sync:: Arc ;
@@ -19,8 +20,7 @@ use nostr::message::MessageHandleError;
1920use nostr:: nips:: nip01:: Coordinate ;
2021#[ cfg( feature = "nip11" ) ]
2122use nostr:: nips:: nip11:: RelayInformationDocument ;
22- #[ cfg( not( target_arch = "wasm32" ) ) ]
23- use nostr:: secp256k1:: rand;
23+ use nostr:: secp256k1:: rand:: { self , Rng } ;
2424use nostr:: {
2525 ClientMessage , Event , EventId , Filter , JsonUtil , Kind , MissingPartialEvent , PartialEvent ,
2626 RawRelayMessage , RelayMessage , SubscriptionId , Timestamp , Url ,
@@ -34,8 +34,8 @@ use super::filtering::{CheckFiltering, RelayFiltering};
3434use super :: flags:: AtomicRelayServiceFlags ;
3535use super :: options:: {
3636 FilterOptions , NegentropyOptions , RelayOptions , RelaySendOptions , SubscribeAutoCloseOptions ,
37- SubscribeOptions , NEGENTROPY_BATCH_SIZE_DOWN , NEGENTROPY_HIGH_WATER_UP ,
38- NEGENTROPY_LOW_WATER_UP ,
37+ SubscribeOptions , MAX_ADJ_RETRY_SEC , MIN_RETRY_SEC , NEGENTROPY_BATCH_SIZE_DOWN ,
38+ NEGENTROPY_HIGH_WATER_UP , NEGENTROPY_LOW_WATER_UP ,
3939} ;
4040use super :: stats:: RelayConnectionStats ;
4141use super :: { Error , Reconciliation , RelayNotification , RelayStatus } ;
@@ -513,7 +513,8 @@ impl InternalRelay {
513513 } ;
514514
515515 // Sleep
516- let retry_sec: u64 = relay. opts . get_retry_sec ( ) ;
516+ let retry_sec: u64 = relay. calculate_retry_sec ( ) ;
517+ tracing:: trace!( "{} retry time set to {retry_sec} secs" , relay. url) ;
517518 thread:: sleep ( Duration :: from_secs ( retry_sec) ) . await ;
518519 }
519520 } ) ;
@@ -526,6 +527,25 @@ impl InternalRelay {
526527 }
527528 }
528529
530+ /// Depending on attempts and success, use default or incremental retry time
531+ fn calculate_retry_sec ( & self ) -> u64 {
532+ if self . opts . get_adjust_retry_sec ( ) {
533+ // diff = attempts - success
534+ let diff: u64 = self . stats . attempts ( ) . saturating_sub ( self . stats . success ( ) ) as u64 ;
535+
536+ // Use incremental retry time if diff >= 3
537+ if diff >= 3 {
538+ let retry_interval: i64 =
539+ cmp:: min ( MIN_RETRY_SEC * ( 1 + diff) , MAX_ADJ_RETRY_SEC ) as i64 ;
540+ let jitter: i64 = rand:: thread_rng ( ) . gen_range ( -1 ..=1 ) ;
541+ return retry_interval. saturating_add ( jitter) as u64 ;
542+ }
543+ }
544+
545+ // Use default retry time
546+ self . opts . get_retry_sec ( )
547+ }
548+
529549 #[ cfg( feature = "nip11" ) ]
530550 fn request_nip11_document ( & self ) {
531551 let ( allowed, proxy) = match self . opts . connection_mode {
0 commit comments