t8y2/dbx · error

query session not found: %s

Error message

query session not found: %s

What it means

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.

Source

Thrown at agents/drivers/cassandra-go/query.go:107

		return result, nil
	}
	s.nextSessionID++
	id := fmt.Sprintf("cassandra-query-%d", s.nextSessionID)
	s.querySessions[id] = &querySession{
		sql:       trimStatementSQL(options.SQL),
		keyspace:  s.keyspaceForOptions(options),
		pageState: append([]byte(nil), nextState...),
		remaining: remaining,
	}
	result.SessionID = &id
	result.HasMore = true
	return result, nil
}

func (s *server) fetchQueryPage(id string, pageSize int) (queryPageResult, error) {
	state := s.querySessions[id]
	if state == nil {
		return queryPageResult{}, fmt.Errorf("query session not found: %s", id)
	}
	if pageSize <= 0 {
		pageSize = defaultPageSize
	}
	result, nextState, err := s.fetchCQLPage(state.sql, state.keyspace, state.pageState, pageSize, state.remaining, 0)
	if err != nil {
		return queryPageResult{}, err
	}
	state.remaining -= len(result.Rows)
	if len(nextState) == 0 || state.remaining <= 0 {
		delete(s.querySessions, id)
		result.HasMore = false
		result.Truncated = len(nextState) > 0 && state.remaining <= 0
		return result, nil
	}
	state.pageState = append(state.pageState[:0], nextState...)
	result.SessionID = &id
	result.HasMore = true

View on GitHub (pinned to c0390bff16)

Solutions

  1. Re-execute the original query to obtain a fresh query id, then paginate the new session
  2. Stop fetching once the page state indicates the result set is complete — do not reuse the final id
  3. Check that the same driver/server process that issued the query also serves the page fetch (state is in-memory)
  4. Handle the error by restarting pagination from the first page instead of surfacing it to end users

Example fix

// before
page, err := srv.FetchQueryPage(ctx, staleSessionID, 100) // error: query session not found
// after
result, err := srv.ExecuteQuery(ctx, originalSQL) // re-run to get a new session id
page, err := srv.FetchQueryPage(ctx, result.SessionID, 100)
Defensive patterns

Strategy: try-catch

Validate before calling

func validSession(id string) bool { return id != "" && sessionsActive[id] } // track ids issued and not yet drained

Try / catch

page, err := srv.FetchQueryPage(ctx, sessionID, size)
if err != nil {
	if strings.Contains(err.Error(), "query session not found") {
		// restart pagination with a fresh query
		result, err := srv.ExecuteQuery(ctx, sql)
		if err != nil { return err }
		page, err = srv.FetchQueryPage(ctx, result.SessionID, size)
	}
	if err != nil { return err }
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of t8y2/dbx@c0390bff16 (2026-09-05). Data as JSON: /api/errors/bf1804fd93b4fe35. Report an issue: GitHub.