4
4
5
5
//! Internal Relay
6
6
7
+ use std:: cmp;
7
8
use std:: collections:: { HashMap , HashSet } ;
8
9
use std:: sync:: atomic:: { AtomicBool , Ordering } ;
9
10
use std:: sync:: Arc ;
@@ -19,8 +20,7 @@ use nostr::message::MessageHandleError;
19
20
use nostr:: nips:: nip01:: Coordinate ;
20
21
#[ cfg( feature = "nip11" ) ]
21
22
use nostr:: nips:: nip11:: RelayInformationDocument ;
22
- #[ cfg( not( target_arch = "wasm32" ) ) ]
23
- use nostr:: secp256k1:: rand;
23
+ use nostr:: secp256k1:: rand:: { self , Rng } ;
24
24
use nostr:: {
25
25
ClientMessage , Event , EventId , Filter , JsonUtil , Kind , MissingPartialEvent , PartialEvent ,
26
26
RawRelayMessage , RelayMessage , SubscriptionId , Timestamp , Url ,
@@ -34,8 +34,8 @@ use super::filtering::{CheckFiltering, RelayFiltering};
34
34
use super :: flags:: AtomicRelayServiceFlags ;
35
35
use super :: options:: {
36
36
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 ,
39
39
} ;
40
40
use super :: stats:: RelayConnectionStats ;
41
41
use super :: { Error , Reconciliation , RelayNotification , RelayStatus } ;
@@ -513,7 +513,8 @@ impl InternalRelay {
513
513
} ;
514
514
515
515
// 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) ;
517
518
thread:: sleep ( Duration :: from_secs ( retry_sec) ) . await ;
518
519
}
519
520
} ) ;
@@ -526,6 +527,25 @@ impl InternalRelay {
526
527
}
527
528
}
528
529
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
+
529
549
#[ cfg( feature = "nip11" ) ]
530
550
fn request_nip11_document ( & self ) {
531
551
let ( allowed, proxy) = match self . opts . connection_mode {
0 commit comments