{"record":{"id":"bf1804fd93b4fe35","repo":"t8y2/dbx","slug":"query-session-not-found-s","errorCode":null,"errorMessage":"query session not found: %s","messagePattern":"query session not found: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"agents/drivers/cassandra-go/query.go","lineNumber":107,"sourceCode":"\t\treturn result, nil\n\t}\n\ts.nextSessionID++\n\tid := fmt.Sprintf(\"cassandra-query-%d\", s.nextSessionID)\n\ts.querySessions[id] = &querySession{\n\t\tsql:       trimStatementSQL(options.SQL),\n\t\tkeyspace:  s.keyspaceForOptions(options),\n\t\tpageState: append([]byte(nil), nextState...),\n\t\tremaining: remaining,\n\t}\n\tresult.SessionID = &id\n\tresult.HasMore = true\n\treturn result, nil\n}\n\nfunc (s *server) fetchQueryPage(id string, pageSize int) (queryPageResult, error) {\n\tstate := s.querySessions[id]\n\tif state == nil {\n\t\treturn queryPageResult{}, fmt.Errorf(\"query session not found: %s\", id)\n\t}\n\tif pageSize <= 0 {\n\t\tpageSize = defaultPageSize\n\t}\n\tresult, nextState, err := s.fetchCQLPage(state.sql, state.keyspace, state.pageState, pageSize, state.remaining, 0)\n\tif err != nil {\n\t\treturn queryPageResult{}, err\n\t}\n\tstate.remaining -= len(result.Rows)\n\tif len(nextState) == 0 || state.remaining <= 0 {\n\t\tdelete(s.querySessions, id)\n\t\tresult.HasMore = false\n\t\tresult.Truncated = len(nextState) > 0 && state.remaining <= 0\n\t\treturn result, nil\n\t}\n\tstate.pageState = append(state.pageState[:0], nextState...)\n\tresult.SessionID = &id\n\tresult.HasMore = true","sourceCodeStart":89,"sourceCodeEnd":125,"githubUrl":"https://github.com/t8y2/dbx/blob/c0390bff16418b651f4728520d99adf8ce48829a/agents/drivers/cassandra-go/query.go#L89-L125","documentation":"The driver paginates query results by keeping per-query session state in a map keyed by a query id. fetchQueryPage looks up s.querySessions[id]; if the id is unknown (or the session was already consumed/expired) it returns this error instead of a page of rows.","triggerScenarios":"Calling FetchQueryPage (or the next-page API) with a query id that was never returned, or reusing an id after the result set was fully consumed; server restart wiping in-memory querySessions; passing an id from a different driver instance.","commonSituations":"Client retry logic re-sending an already-drained page request; driver/server process restarted between page fetches; long-running result sets whose session state was evicted; copying session ids between connections.","solutions":["Re-execute the original query to obtain a fresh query id, then paginate the new session","Stop fetching once the page state indicates the result set is complete — do not reuse the final id","Check that the same driver/server process that issued the query also serves the page fetch (state is in-memory)","Handle the error by restarting pagination from the first page instead of surfacing it to end users"],"exampleFix":"// before\npage, err := srv.FetchQueryPage(ctx, staleSessionID, 100) // error: query session not found\n// after\nresult, err := srv.ExecuteQuery(ctx, originalSQL) // re-run to get a new session id\npage, err := srv.FetchQueryPage(ctx, result.SessionID, 100)","handlingStrategy":"try-catch","validationCode":"func validSession(id string) bool { return id != \"\" && sessionsActive[id] } // track ids issued and not yet drained","typeGuard":null,"tryCatchPattern":"page, err := srv.FetchQueryPage(ctx, sessionID, size)\nif err != nil {\n\tif strings.Contains(err.Error(), \"query session not found\") {\n\t\t// restart pagination with a fresh query\n\t\tresult, err := srv.ExecuteQuery(ctx, sql)\n\t\tif err != nil { return err }\n\t\tpage, err = srv.FetchQueryPage(ctx, result.SessionID, size)\n\t}\n\tif err != nil { return err }\n}","preventionTips":["Never reuse a query id after the final page (state is deleted once drained)","Re-execute the query after a server/driver restart instead of continuing pagination","Always take session ids from the response object of the same driver instance","Set page-state-aware pagination loops that stop on empty page state"],"tags":["cassandra","pagination","session","state"],"backgroundTag":"query-session-not-found","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"}