t8y2/dbx · error

query session not found

Error message

query session not found

What it means

fetchQueryPage() looks up the paged-query session by sessionID in server.querySessions after expiring idle sessions. If no state exists for the ID — because it never existed, already completed, or was expired/evicted — this error is returned. Sessions are server-side and finite-lived.

Source

Thrown at agents/drivers/hive-go/query.go:184

			HasMore:         false,
		}, nil
	}
	return queryPageResult{
		Columns:         columns,
		ColumnTypes:     columnTypes,
		Rows:            page,
		ExecutionTimeMS: time.Since(started).Milliseconds(),
		Truncated:       false,
		SessionID:       &sessionID,
		HasMore:         true,
	}, nil
}

func (server *server) fetchQueryPage(sessionID string, requestedPageSize int) (queryPageResult, error) {
	server.expireIdleQuerySessions(time.Now())
	state := server.querySessions[sessionID]
	if state == nil {
		return queryPageResult{}, errors.New("query session not found")
	}
	pageSize := requestedPageSize
	if pageSize <= 0 {
		pageSize = defaultPageSize
	}
	ctx := context.Background()
	server.setActiveOperation(state.cancel)
	page, hasMore, truncated, err := server.readQuerySessionPage(ctx, state, pageSize)
	server.activeMu.Lock()
	server.activeCancel = nil
	server.activeMu.Unlock()
	if err != nil {
		server.closeQuerySession(sessionID)
		return queryPageResult{}, err
	}
	var resultSessionID *string
	if hasMore {
		resultSessionID = &sessionID

View on GitHub (pinned to c0390bff16)

Solutions

  1. Re-run the original query with executeQueryPage to create a fresh session, then continue paging from the new sessionID.
  2. Fetch subsequent pages promptly, within the idle-session TTL, to avoid expiry.
  3. Use sticky routing / a single driver instance so page fetches hit the same server that started the query.
  4. Handle this error by transparently restarting the query rather than surfacing it to end users.

Example fix

// before
page, err := fetchQueryPage(oldSessionID, 100) // may be expired
// after
page, err := fetchQueryPage(sessionID, 100)
if err != nil && err.Error() == "query session not found" {
    page, err = executeQueryPage(originalSQL, 100) // restart query
}
Defensive patterns

Strategy: retry

Validate before calling

// Go — check you hold a live sessionID from executeQueryPage before fetching
if sessionID == "" { return errors.New("no active query session") }

Try / catch

page, err := srv.FetchPage(sessionID, pageSize)
if err != nil && strings.Contains(err.Error(), "query session not found") {
    // restart the query transparently
    page, err = srv.DispatchPaged(queryOptions{SQL: originalSQL}, pageSize)
}

Prevention

When it happens

Trigger: Calling fetchQueryPage with a sessionID that was never created (executeQueryPage not called first), a typo'd or stale ID, or an ID whose session expired via expireIdleQuerySessions after the idle timeout.

Common situations: Client retries fetching the next page long after the idle TTL elapsed; server restarted, losing in-memory querySessions while the client kept its cursor; load-balanced deployments routing page requests to a different server instance than the one holding the session.

Related errors


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