Skip to content

Commit ebbf0b6

Browse files
authored
Fix disconnections on successful gateway resume (#3102)
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.
1 parent e37d7b8 commit ebbf0b6

File tree

1 file changed

+24
-16
lines changed

1 file changed

+24
-16
lines changed

src/gateway/sharding/shard_runner.rs

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,9 @@ impl ShardRunner {
141141
if let Some(action) = action {
142142
match action {
143143
ShardAction::Reconnect => {
144-
self.reconnect().await;
145-
return Ok(());
144+
if !self.reconnect().await {
145+
return Ok(());
146+
}
146147
},
147148
ShardAction::Heartbeat => {
148149
if let Err(e) = self.shard.heartbeat().await {
@@ -151,8 +152,9 @@ impl ShardRunner {
151152
self.shard.shard_info(),
152153
e
153154
);
154-
self.reconnect().await;
155-
return Ok(());
155+
if !self.reconnect().await {
156+
return Ok(());
157+
}
156158
}
157159
},
158160
ShardAction::Identify => {
@@ -162,8 +164,9 @@ impl ShardRunner {
162164
self.shard.shard_info(),
163165
e
164166
);
165-
self.reconnect().await;
166-
return Ok(());
167+
if !self.reconnect().await {
168+
return Ok(());
169+
}
167170
}
168171
},
169172
ShardAction::Dispatch(event) => {
@@ -442,22 +445,27 @@ impl ShardRunner {
442445
}
443446

444447
#[cfg_attr(feature = "tracing_instrument", instrument(skip(self)))]
445-
async fn reconnect(&mut self) {
448+
async fn reconnect(&mut self) -> bool {
446449
if self.shard.session_id().is_some() {
447-
if let Err(why) = self.shard.resume().await {
448-
warn!(
449-
"[ShardRunner {:?}] Resume failed, reidentifying: {:?}",
450-
self.shard.shard_info(),
451-
why,
452-
);
450+
match self.shard.resume().await {
451+
Ok(()) => true,
452+
Err(why) => {
453+
warn!(
454+
"[ShardRunner {:?}] Resume failed, reidentifying: {:?}",
455+
self.shard.shard_info(),
456+
why,
457+
);
453458

454-
// Don't spam reattempts on internet connection loss
455-
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
459+
// Don't spam reattempts on internet connection loss
460+
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
456461

457-
self.request_restart().await;
462+
self.request_restart().await;
463+
false
464+
},
458465
}
459466
} else {
460467
self.request_restart().await;
468+
false
461469
}
462470
}
463471

0 commit comments

Comments
 (0)