Skip to content

feat(bigtable): add ClientConfig.DisableSession to opt out of session backend - #20297

Merged
sushanb merged 1 commit into
googleapis:mainfrom
sushanb:feat/bigtable-clientconfig-disable-session
Aug 3, 2026
Merged

sushanb merged 1 commit into
googleapis:mainfrom
sushanb:feat/bigtable-clientconfig-disable-session

Conversation

@sushanb

@sushanb sushanb commented Aug 3, 2026 •

Copy link
Copy Markdown
Contributor
  1. This option will be deprecated.
  2. Keeping this ClientOption as a hatch in the client release. In future, we will create the session client regardless of this flag. so it should be fine.

… backend

Adds a DisableSession bool field to ClientConfig. When true,
NewClientWithConfig skips constructing the session data-plane client
(sessionImpl) and the per-resource TableAPI cache (sessionTables)
entirely. Every downstream reader (open.go's getOrCreateSession*,
Client.Close, sessionTableCache.close) already nil-guards on that
state — the preDialed path has been producing nil sessionImpl
since day one, so the DisableSession path piggybacks on the same
escape route.

Motivation. Session infrastructure is currently constructed
unconditionally by NewClientWithConfig — a second gRPC channel pool
plus per-channel background goroutines (transport reader/writer,
balancer, resolver, callback serializer, xDS outlier-detection,
RLS). Measured cost on a 100 R + 100 W QPS workload with
CBT_FORCE_SESSION unset (session traffic quiet, infra idle):

    +17 MB RSS
    +363 goroutines

vs the same workload against the released classic-only build.
Callers with specific reasons to opt out — running against a
backend that doesn't support session mode, benchmarking classic
baselines, resource-constrained environments — pay that cost for
infrastructure they never touch. DisableSession lets them skip it.

Effect on Table. Open() still builds a TableShim (Diverter is a
classic-side concern), but the shim's session TableAPI is nil, so
TableShim.useSession() reports false regardless of Diverter's
SessionLoad. Every Apply / ReadRow routes to the classic path
unconditionally. Same behavior as callers who pre-dial a custom
gRPC conn today.

Default (false). Behavior is unchanged: session client is
constructed by NewClientWithConfig as it has been.

Tests. Three unit tests in a new client_disable_session_test.go:
 - SkipsSessionInit — bufconn + WithContextDialer keeps preDialed
   false so ONLY the DisableSession gate can be responsible for
   sessionImpl being nil. Asserts sessionImpl == nil and
   sessionTables == nil.
 - ClientCloseWorks — DisableSession client's Close is clean,
   idempotent on the nil-sessionImpl path.
 - OpenTableRoutesClassicOnly — even with Diverter.SessionLoad
   force-set to 1.0, TableShim.useSession() reports false because
   shim.session is nil.
@sushanb
sushanb requested review from a team as code owners August 3, 2026 15:31
@product-auto-label product-auto-label Bot added the api: bigtable Issues related to the Bigtable API. label Aug 3, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a DisableSession option to ClientConfig in the Bigtable client, allowing callers to opt out of constructing the session data-plane client and run classic-only to save resources. Comprehensive tests have been added to verify that session initialization is skipped, client closure is safe, and table operations route classic-only. The review feedback suggests removing an unnecessary defensive nil-guard on c.diverter in the tests, as it is guaranteed to be non-nil by construction.

Comment thread bigtable/client_disable_session_test.go
@sushanb
sushanb merged commit 7ee5e44 into googleapis:main Aug 3, 2026
20 of 21 checks passed
sushanb pushed a commit that referenced this pull request Aug 3, 2026
🤖 I have created a release *beep* *boop*
---


##
[1.52.0](bigtable/v1.51.0...bigtable/v1.52.0)
(2026-08-03)


### Features

* **bigtable:** Add AFE picker (Simple / LeastInFlight / LeastLatency)
([#20204](#20204))
([bcbf714](bcbf714))
* **bigtable:** Add ClientConfig.DisableSession to opt out of session
backend
([#20297](#20297))
([7ee5e44](7ee5e44))
* **bigtable:** Add getClientConfigDirectAccessChecker for session pools
([#20209](#20209))
([3b8d30a](3b8d30a))
* **bigtable:** Add NoOpChannelPrimer for session channel pools
([#20208](#20208))
([d055a8a](d055a8a))
* **bigtable:** Add per-AFE sessionList for the two-tier session pool
([#20224](#20224))
([dbf0c3f](dbf0c3f))
* **bigtable:** Add protoRowToRow conversion helper for TableShim
([#20257](#20257))
([1297143](1297143))
* **bigtable:** Add Session debug surface (observability fields +
methods)
([#20211](#20211))
([d8d3e16](d8d3e16))
* **bigtable:** Add Session lifecycle (Start, Close, ForceClose,
readLoop, heartBeatLoop)
([#20215](#20215))
([b9e53c6](b9e53c6))
* **bigtable:** Add Session struct + state machine
([#20117](#20117))
([09acbb3](09acbb3))
* **bigtable:** Add session.Config.EnableDebug to gate sessionz debug
state
([#20247](#20247))
([ce74c31](ce74c31))
* **bigtable:** Add SessionClient + SessionTable + lazyPool
([#20228](#20228))
([ab2c96c](ab2c96c))
* **bigtable:** Add SessionPoolImpl (two-tier pool + scaling + debug)
([#20225](#20225))
([683eda8](683eda8))
* **bigtable:** Rename session pool display to
<resource-id>-<PERM>
([#20248](#20248))
([35e146e](35e146e))
* **bigtable:** Route Client.Open()-returned *Table through the Diverter
([#20273](#20273))
([2b81c7d](2b81c7d))
* **bigtable:** State-based classification for abnormal session close
([#20243](#20243))
([f2905b7](f2905b7))
* **bigtable:** TableShim fallback to classic on session UNIMPLEMENTED
([#20269](#20269))
([36540af](36540af))
* **bigtable:** TTL-on-idle cache for per-resource session.TableAPI
([#20263](#20263))
([00b2a49](00b2a49))
* **bigtable:** Wire Diverter on Client and route Open* via TableShim
([#20256](#20256))
([b32fbd7](b32fbd7))


### Bug Fixes

* **bigtable:** AFE picker latency signal — subtract poolWait and
compute TransportLatency = wire − backend at source
([#20281](#20281))
([bb8c4d5](bb8c4d5))
* **bigtable:** Guard NewStream OnFinish against grpc-go double-fire
([#20295](#20295))
([b51da29](b51da29))
* **bigtable:** Real per-resource pool teardown on sessionTable.Close +
cache close-race gate
([#20264](#20264))
([599aea9](599aea9))
* **bigtable:** Session.durations / session.uptime — set explicit
histogram bucket boundaries
([#20276](#20276))
([97eee22](97eee22))
* **bigtable:** SessionTableHandle self-heals across cache eviction
([#20296](#20296))
([0dd98cd](0dd98cd))
* **bigtable:** Translate ctx errors to gRPC status on session vRPC
([#20299](#20299))
([0f3b2a5](0f3b2a5))
* **bigtable:** Treat PingAndWarm NotFound as a successful prime
([#20219](#20219))
([a1557ad](a1557ad))


### Performance Improvements

* **bigtable:** Delete periodic Tick loop; sizing is event-driven
([#20285](#20285))
([2c096bd](2c096bd))
* **bigtable:** Drop pick_lost_race debug tag from CheckoutSession hot
path
([#20280](#20280))
([bd0e400](bd0e400))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

api: bigtable Issues related to the Bigtable API.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants