Skip to content

fix(bigtable): treat PingAndWarm NotFound as a successful prime - #20219

Merged
sushanb merged 1 commit into
googleapis:mainfrom
sushanb:fix/bigtable-primer-notfound-benign
Jul 25, 2026
Merged

fix(bigtable): treat PingAndWarm NotFound as a successful prime#20219
sushanb merged 1 commit into
googleapis:mainfrom
sushanb:fix/bigtable-primer-notfound-benign

Conversation

@sushanb

@sushanb sushanb commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Empty Bigtable instances break client creation: PingAndWarm returns NotFound with "No tables found for instance ...", and the channel factory's prime-with-retry loop surfaces that as a fatal error after 3 attempts.
  • The primer now swallows codes.NotFound and logs at debug so admin flows (creating the first table, migrations) against otherwise-healthy but empty instances work again.
  • Typo'd instance names also produce NotFound but surface on the first real RPC, so nothing is silently masked.
  • The pingAndWarmDirectAccessChecker (which uses the same primer indirectly) is intentionally left as-is — DA compatibility has different failure semantics and its Prime error path already has a PermissionDenied fall-through of its own.

Fixes #20067

Test plan

  • New unit test TestPingAndWarmChannelPrimer_Prime_NotFoundIsBenign in bigtable/internal/transport/channel_primer_test.go stages the exact NotFound / "No tables found for instance ..." response and asserts Prime returns nil.
  • Existing TestPingAndWarmChannelPrimer_Prime and TestConnectionFactory_NilPrimerSkipsPriming continue to pass.
  • go test ./internal/transport/ -race -count=1 -timeout=30s clean locally.

The channel primer surfaced PingAndWarm's NotFound response
("No tables found for instance ...") as a fatal factory error,
blocking client creation against valid but empty instances. That
breaks legitimate admin flows (creating the first table, migrations)
against an otherwise-healthy service.

Swallow codes.NotFound in pingAndWarmChannelPrimer.Prime. Typos in
instance name also produce NotFound but surface on the first real
RPC, so nothing is silently masked. The DirectAccessChecker (which
uses the same primer) is intentionally left as-is — DA compatibility
has different failure semantics.
@sushanb
sushanb requested review from a team as code owners July 24, 2026 21:04
@product-auto-label product-auto-label Bot added the api: bigtable Issues related to the Bigtable API. label Jul 24, 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 updates the Bigtable channel primer to treat a NotFound gRPC status code during PingAndWarm as a successful priming operation, which prevents blocking client creation for valid but empty instances. A unit test was also added to verify this behavior. The feedback suggests passing the active context ctx instead of nil to btopt.Debugf to preserve context-bound metadata and prevent potential issues.

Comment thread bigtable/internal/transport/channel_primer.go

@nimf nimf 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.

LGTM

@sushanb
sushanb merged commit a1557ad into googleapis:main Jul 25, 2026
19 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.

bigtable: can't connect if no tables

2 participants