hcengineering/platform · warning
high degraded sessions
Error message
high degraded sessions
What it means
This is a health-check warning (not a thrown exception) emitted by TSessionManager.checkHealth when the percentage of hung sessions exceeds hungSessionsWarnPercent but not hungSessionsFailPercent, causing the server to report status 'degraded'. A session counts as hung when its last request is older than hangSessionTimeoutSeconds, or when a large fraction of its in-flight requests exceed hangRequestTimeoutSeconds. The library emits it so operators can react before the server becomes fully unhealthy.
Source
Thrown at foundations/server/packages/server/src/sessionManager.ts:548
}
const hungRequestsPercent = totalRequests > 0 ? (100 * hungRequests) / totalRequests : 0
if (hungRequestsPercent > this.hungRequestsFailPercent) {
hungSessions += 1
}
}
this.ctx.measure('sessions-hung', hungSessions, true)
const hungSessionsPercent = totalSessions > 0 ? (100 * hungSessions) / totalSessions : 0
if (hungSessionsPercent > this.hungSessionsFailPercent) {
this.ctx.warn('high hung sessions', { hungSessionsPercent })
return 'unhealthy'
}
if (hungSessionsPercent > this.hungSessionsWarnPercent) {
this.ctx.warn('high degraded sessions', { hungSessionsPercent })
return 'degraded'
}
return 'healthy'
}
tickCounter = 0
@withContext('🧭 get-workspace')
async getWorkspace (
ctx: MeasureContext,
workspaceUuid: WorkspaceUuid,
workspaceInfo: LoginInfoWorkspace | undefined,
token: Token,
ws: ConnectionSocket
): Promise<{ workspace?: Workspace, resp?: GetWorkspaceResponse }> {
if (workspaceInfo === undefined) {
return { resp: { error: new Error('Workspace not found or not available'), terminate: true } }View on GitHub (pinned to 63e28dc964)
Solutions
- Inspect which sessions are hung via getStatistics and check their lastRequest timestamps and in-flight request durations.
- Check downstream dependencies (database, storage, queue) for latency or lock contention slowing requests.
- Tune hangSessionWarnPercent / hangSessionTimeoutSeconds / hangRequestTimeoutSeconds configuration if the workload legitimately has long requests.
- Restart or drain the affected sessions/workspaces; if degradation persists, investigate for memory leaks or stuck event-loop tasks.
Example fix
// before: defaults too tight for a migration-heavy workload
sessionManager = new TSessionManager(ctx, ..., { hangSessionTimeoutSeconds: 30 })
// after
sessionManager = new TSessionManager(ctx, ..., { hangSessionTimeoutSeconds: 300, hangRequestTimeoutSeconds: 120 }) Defensive patterns
Strategy: validation
Validate before calling
const stats = await sessionManager.getStatistics()
const health = await sessionManager.checkHealth()
if (health !== 'healthy') {
console.warn('server degraded before accepting load:', health)
} Type guard
function isHealthy(status: string): boolean {
return status === 'healthy'
} Try / catch
try {
const status = await sessionManager.checkHealth()
if (status !== 'healthy') await alertOps(status)
} catch (err) {
logger.error('health check failed', { err })
} Prevention
- Monitor the sessions-hung metric and alert before warn thresholds are crossed.
- Set hangSessionTimeoutSeconds/hangRequestTimeoutSeconds consistent with your real request latency profile.
- Watch downstream dependency latency (DB, storage) with dashboards.
- Load-test long-running operations to see if they trip the hang detection.
When it happens
Trigger: checkHealth (invoked by health, getStatistics, status endpoints) computes hungSessionsPercent > this.hungSessionsWarnPercent while hungSessionsPercent <= this.hungSessionsFailPercent. Sessions are counted hung if Date.now() - session.lastRequest > hangSessionTimeoutSeconds * 1000, or if >hungRequestsFailPercent of a session's live requests have run longer than hangRequestTimeoutSeconds. System-account sessions are excluded.
Common situations: Long-running CPU-heavy operations (builds, migrations) blocking client requests; clients that went idle/disconnected without their sessions being cleaned; a backend dependency (DB, storage) slowing requests past hangRequestTimeoutSeconds; timeouts configured too aggressively for the workload.
Related errors
AI-assisted analysis of hcengineering/platform@63e28dc964 (2026-08-29).
Data as JSON: /api/errors/868e45638fab9eff.
Report an issue: GitHub.