Mark sessions empty on final client removal
ci / test (push) Waiting to run
ci / fuzz-smoke (push) Waiting to run
ci / windows-client (push) Waiting to run
ci / package-release (linux-x86_64, ubuntu-latest) (push) Waiting to run
ci / package-release (macos-aarch64, macos-14) (push) Waiting to run
ci / package-release (macos-x86_64, macos-13) (push) Waiting to run
ci / package-release (windows-x86_64, windows-latest) (push) Waiting to run
ci / publish-gitea-release (push) Blocked by required conditions
ci / remote-bench (push) Waiting to run

This commit is contained in:
DuProcess
2026-07-12 21:55:50 -04:00
parent 0a05c68e94
commit efddd1544e
+14 -1
View File
@@ -719,7 +719,11 @@ impl ServerState {
if let Some(session_name) = self.client_index.remove(client_id) if let Some(session_name) = self.client_index.remove(client_id)
&& let Some(session) = self.sessions.get_mut(&session_name) && let Some(session) = self.sessions.get_mut(&session_name)
{ {
return session.clients.remove(client_id).is_some(); let removed = session.clients.remove(client_id).is_some();
if removed && session.clients.is_empty() {
session.empty_since.get_or_insert_with(Instant::now);
}
return removed;
} }
false false
} }
@@ -4536,6 +4540,15 @@ mod tests {
assert!(state.lookup_client(&client_id).is_none()); assert!(state.lookup_client(&client_id).is_none());
assert!(state.client_mut(&client_id).is_none()); assert!(state.client_mut(&client_id).is_none());
assert!(!state.sessions["work"].clients.contains_key(&client_id)); assert!(!state.sessions["work"].clients.contains_key(&client_id));
assert!(
state.sessions["work"].empty_since.is_none(),
"removing one of multiple clients must not mark the session empty"
);
assert!(state.remove_client_everywhere(&[7u8; 16]));
assert!(
state.sessions["work"].empty_since.is_some(),
"removing the final client should start empty-session cleanup grace immediately"
);
// Removing an absent client is a no-op. // Removing an absent client is a no-op.
assert!(!state.remove_client_everywhere(&client_id)); assert!(!state.remove_client_everywhere(&client_id));
} }