@@ -59,7 +59,7 @@ const DEFAULT_SYNC_INTERVAL: Duration = Duration::from_secs(5);
5959const DEFAULT_RETRY_INTERVAL : Duration = Duration :: from_secs ( 1 ) ;
6060const DEFAULT_RETRIES : usize = 3 ;
6161
62- const DEFAULT_REBUILD_RING_INTERVAL : Duration = Duration :: from_secs ( 10 ) ;
62+ const DEFAULT_REBUILD_RING_INTERVAL : Duration = Duration :: from_secs ( 5 ) ;
6363
6464const DEFAULT_MEMBER_DEADLINE : Duration = Duration :: from_secs ( 30 ) ;
6565
@@ -329,9 +329,16 @@ impl GossipState {
329329 }
330330
331331 fn rebuild_ring ( & self ) {
332- let members = self . membership . read ( ) . unwrap ( ) ;
332+ // Ensure the current node is alive
333+ let mut membership = self . membership . write ( ) . unwrap ( ) ;
334+ membership. update_member ( MemberState {
335+ info : self . current ( ) ,
336+ status : MemberStatus :: Alive ,
337+ heartbeat : Timestamp :: now ( ) ,
338+ } ) ;
333339
334- * self . ring . write ( ) . unwrap ( ) = Arc :: new ( HashRing :: from ( members. members ( ) . keys ( ) . cloned ( ) ) ) ;
340+ * self . ring . write ( ) . unwrap ( ) =
341+ Arc :: new ( HashRing :: from ( membership. members ( ) . keys ( ) . cloned ( ) ) ) ;
335342 }
336343
337344 fn mark_dead ( & self , peer : & NodeInfo ) {
@@ -429,6 +436,10 @@ async fn drive_gossip(state: Arc<GossipState>, runtime: &Runtime) -> Result<(),
429436 . iter ( )
430437 . nth ( random :: < usize > ( ) % membership. members ( ) . len ( ) )
431438 {
439+ if member. status == MemberStatus :: Dead {
440+ log:: debug!( "skipping dead member: {member:?}" ) ;
441+ continue ;
442+ }
432443 log:: debug!( "pinging member: {member:?}" ) ;
433444 state. ping ( member. info . clone ( ) ) . await ;
434445 } else {
@@ -452,6 +463,10 @@ async fn drive_gossip(state: Arc<GossipState>, runtime: &Runtime) -> Result<(),
452463 . iter ( )
453464 . nth ( random :: < usize > ( ) % membership. members ( ) . len ( ) )
454465 {
466+ if member. status == MemberStatus :: Dead {
467+ log:: debug!( "skipping dead member: {member:?}" ) ;
468+ continue ;
469+ }
455470 log:: debug!( "syncing member: {member:?}" ) ;
456471 state. sync ( member. info . clone ( ) ) . await ;
457472 } else {
0 commit comments