hcengineering/platform · info
Closed workspace
Error message
Closed workspace
What it means
TSessionManager logs 'Closed workspace' after successfully calling workspace.close(this.ctx), deleting the workspace from this.workspaces, ending its context, and publishing a workspace down event. It confirms an idle (zero-session) workspace was fully torn down. It is informational, and marks the point after which pending operations targeting that workspace will fail because it no longer exists.
Source
Thrown at foundations/server/packages/server/src/sessionManager.ts:1280
await this.workspaceProducer.close()
await this.usersProducer.close()
}
private async performWorkspaceCloseCheck (workspace: Workspace): Promise<void> {
const uuid = workspace.wsId.uuid
const logParams = { uuid, url: workspace.wsId.url }
if (workspace.sessions.size === 0) {
if (LOGGING_ENABLED) {
this.ctx.warn('no sessions for workspace', logParams)
}
try {
if (workspace.sessions.size === 0) {
await workspace.close(this.ctx)
this.workspaces.delete(uuid)
workspace.context.end()
if (LOGGING_ENABLED) {
this.ctx.warn('Closed workspace', logParams)
}
await this.workspaceProducer.send(this.ctx, workspace.wsId.uuid, [workspaceEvents.down()])
}
} catch (err: any) {
Analytics.handleError(err)
this.workspaces.delete(uuid)
if (LOGGING_ENABLED) {
this.ctx.error('failed', { ...logParams, error: err })
}
}
} else {
if (LOGGING_ENABLED) {
this.ctx.info('few sessions for workspace, close skipped', {
...logParams,
sessions: workspace.sessions.size
})
}View on GitHub (pinned to 63e28dc964)
Solutions
- No action needed - this is a success-path log confirming cleanup.
- If clients still need the workspace, reconnect before it idles out or keep a session open.
- Verify clients handle workspace-down events (from workspaceProducer) by reattaching/reopening the workspace.
- If workspace.close throws, check the catch block (Analytics.handleError) to see the underlying failure.
Defensive patterns
Strategy: fallback
Validate before calling
// After seeing 'Closed workspace', confirm the workspace is gone before reusing the reference
if (!manager.hasWorkspace(uuid)) {
await reopenWorkspace(uuid)
}
Type guard
function workspaceExists (workspaces: Map<string, unknown>, uuid: string): boolean {
return workspaces.has(uuid)
}
Prevention
- Handle workspaceEvents.down() on the consumer side to reattach clients.
- Reconnect with backoff after workspace down events.
- Avoid caching workspace references across idle shutdowns.
When it happens
Trigger: The close check path in performWorkspaceCloseCheck completes: workspace.sessions.size === 0, workspace.close resolves without throwing, and LOGGING_ENABLED is true.
Common situations: Operator logs showing workspace shutdown during maintenance or idle cleanup; clients attempting to reconnect to a workspace that was just torn down; server load reduction closing unused workspaces.
Related errors
- no sessions for workspace
- open workspace
- Workspace closed...
- closing workspace, no users
- reconnect workspace in upgrade switch
AI-assisted analysis of hcengineering/platform@63e28dc964 (2026-08-29).
Data as JSON: /api/errors/90729bb10380d19e.
Report an issue: GitHub.