{"record":{"id":"a91759aecd491464","repo":"t8y2/dbx","slug":"agent-session-limit-reached-d-a91759","errorCode":null,"errorMessage":"agent session limit reached: %d","messagePattern":"agent session limit reached: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"agents/drivers/iotdb/main.go","lineNumber":251,"sourceCode":"\t\tsession, err := r.session(id)\n\t\tif err != nil {\n\t\t\treturn nil, false, err\n\t\t}\n\t\tsession.mu.Lock()\n\t\tdefer session.mu.Unlock()\n\t\treturn session.server.dispatch(method, params)\n\t}\n}\n\nfunc (r *runtimeServer) openSession(id string, params connectParams) error {\n\tr.mu.Lock()\n\tif _, exists := r.sessions[id]; exists {\n\t\tr.mu.Unlock()\n\t\treturn fmt.Errorf(\"agent session already exists: %s\", id)\n\t}\n\tif len(r.sessions) >= maxAgentSessions {\n\t\tr.mu.Unlock()\n\t\treturn fmt.Errorf(\"agent session limit reached: %d\", maxAgentSessions)\n\t}\n\tr.mu.Unlock()\n\n\tserver, err := newServer(params)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := server.validateConnection(); err != nil {\n\t\tserver.disconnect()\n\t\treturn err\n\t}\n\n\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\tif _, exists := r.sessions[id]; exists {\n\t\tserver.disconnect()\n\t\treturn fmt.Errorf(\"agent session already exists: %s\", id)\n\t}","sourceCodeStart":233,"sourceCodeEnd":269,"githubUrl":"https://github.com/t8y2/dbx/blob/c0390bff16418b651f4728520d99adf8ce48829a/agents/drivers/iotdb/main.go#L233-L269","documentation":"openSession enforces a global cap of maxAgentSessions concurrent registered sessions. When len(r.sessions) already reaches the cap, the new session is refused with 'agent session limit reached: %d', embedding the limit value.","triggerScenarios":"Opening an agent session when maxAgentSessions sessions are already registered; sessions leaking because clients never call closeSession/disconnect until the cap is hit.","commonSituations":"Long-running deployments where clients disconnect abruptly without cleanup; load tests opening hundreds of connections; maxAgentSessions tuned too low for expected concurrency.","solutions":["Close idle/finished sessions with closeSession to free slots.","Increase maxAgentSessions to match expected concurrency.","Add client-side cleanup (defer disconnect) so sessions don't leak on errors.","Monitor active session count and alert before hitting the cap."],"exampleFix":"// before\nrt.openSession(id, params) // never closed\n// after\nif err := rt.openSession(id, params); err != nil { return err }\ndefer rt.closeSession(id)","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"var err error\nfor i := 0; i < 3; i++ {\n    err = rt.openSession(id, params)\n    if err == nil || !strings.Contains(err.Error(), \"agent session limit reached\") {\n        break\n    }\n    time.Sleep(time.Duration(1<<i) * time.Second) // wait for slots to free\n}","preventionTips":["Always defer closeSession/disconnect for every opened session.","Size maxAgentSessions above peak expected concurrency.","Monitor active session counts and alert before hitting the cap.","Reap idle sessions periodically."],"tags":["go","resource-limit","session-management"],"backgroundTag":"resource-limit-exceeded","analyzedSha":"c0390bff16418b651f4728520d99adf8ce48829a","analyzedAt":"2026-09-05T23:05:10.900Z","contentChangedAt":"2026-09-05T23:05:10.900Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}