Skip to content

Commit

Permalink
Fix disconnections on successful gateway resume (#3102)
Browse files Browse the repository at this point in the history
A regression introduced by #3099 was that successful resumes will break
out of the loop inside `ShardRunner::run`, but they shouldn't (or
rather, didn't before). Therefore, only break out of the loop if the
resume failed and we had to fallback to reidentifying.
  • Loading branch information
mkrasnitski authored Feb 3, 2025
1 parent e37d7b8 commit ebbf0b6
Showing 1 changed file with 24 additions and 16 deletions.
40 changes: 24 additions & 16 deletions src/gateway/sharding/shard_runner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,9 @@ impl ShardRunner {
if let Some(action) = action {
match action {
ShardAction::Reconnect => {
self.reconnect().await;
return Ok(());
if !self.reconnect().await {
return Ok(());
}
},
ShardAction::Heartbeat => {
if let Err(e) = self.shard.heartbeat().await {
Expand All @@ -151,8 +152,9 @@ impl ShardRunner {
self.shard.shard_info(),
e
);
self.reconnect().await;
return Ok(());
if !self.reconnect().await {
return Ok(());
}
}
},
ShardAction::Identify => {
Expand All @@ -162,8 +164,9 @@ impl ShardRunner {
self.shard.shard_info(),
e
);
self.reconnect().await;
return Ok(());
if !self.reconnect().await {
return Ok(());
}
}
},
ShardAction::Dispatch(event) => {
Expand Down Expand Up @@ -442,22 +445,27 @@ impl ShardRunner {
}

#[cfg_attr(feature = "tracing_instrument", instrument(skip(self)))]
async fn reconnect(&mut self) {
async fn reconnect(&mut self) -> bool {
if self.shard.session_id().is_some() {
if let Err(why) = self.shard.resume().await {
warn!(
"[ShardRunner {:?}] Resume failed, reidentifying: {:?}",
self.shard.shard_info(),
why,
);
match self.shard.resume().await {
Ok(()) => true,
Err(why) => {
warn!(
"[ShardRunner {:?}] Resume failed, reidentifying: {:?}",
self.shard.shard_info(),
why,
);

// Don't spam reattempts on internet connection loss
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
// Don't spam reattempts on internet connection loss
tokio::time::sleep(std::time::Duration::from_secs(1)).await;

self.request_restart().await;
self.request_restart().await;
false
},
}
} else {
self.request_restart().await;
false
}
}

Expand Down

0 comments on commit ebbf0b6

Please sign in to comment.