Commit f2905b7
authored
feat(bigtable): state-based classification for abnormal session close (#20243)
## Summary
Bring the Go client's abnormal session-close classification in line with
Java by keying on the pre-close `State`, and stamp a `StreamEnd:<code>`
close-reason so sessionz surfaces exit codes that would otherwise land
in the \"Unspecified\" bucket.
- **`refactor(bigtable): state-based abnormal-close classification (Java
parity)`** — `noteAbnormalCloseIfAny` now consults
`Session.prevStateAtClose`. Any session whose prior state was NOT
`StateWaitServerClose` counts as abnormal; sessions that gracefully
entered `WAIT_SERVER_CLOSE` (client-initiated `CloseSession` → server
ACK) do not. Matches Java's `SessionImpl.handleAbnormalClose` gating on
`prevState != WAIT_SERVER_CLOSE`. Heartbeat-miss sessions (ForceClose
from `Ready` → `prev=Ready`) correctly still count as abnormal.
- **`observe(bigtable): stamp StreamEnd:<code> close-reason in
handleClose`** — the terminal `handleClose` path CAS-stamps a
`StreamEnd:<grpc-code>` reason so a bare stream error no longer renders
as \"Unspecified\" on sessionz. Upstream stampers (`GoAway`,
`MissedHeartbeat`, `Error`, `User`) still win the CAS because
`setCloseReason` is one-shot — they run first and this stamp is a strict
fallback.
- **`fix(bigtable): special-case io.EOF in StreamEnd close-reason`** —
Igor caught during review: `status.Code(io.EOF) == codes.Unknown`, so
the default arm rendered a graceful server-side shutdown as
`\"StreamEnd:Unknown\"` — hiding a distinct-and-common signal.
Special-cases `errors.Is(err, io.EOF)` → `\"StreamEnd:EOF\"` before
falling through.
## Test plan
- [ ] `go test ./bigtable/internal/transport/ -count=1 -race -short
-timeout=120s`
- [ ] Manual sessionz check: run a workload where the server GOAWAYs a
session; confirm `close_reason` renders as `GoAway` (not
`StreamEnd:EOF`), i.e. the upstream GoAway stamper still wins the CAS.
- [ ] Manual sessionz check: run a workload where an in-flight session
sees a plain graceful stream close; confirm `close_reason =
StreamEnd:EOF` (not `Unspecified`, not `StreamEnd:Unknown`).
- [ ] Heartbeat-miss path: kill a session's inbound frames; confirm
`MissedHeartbeat` still wins the CAS (this PR doesn't change that path,
but verify no regression).
## Reviewer notes
Three reviewers ran clean: `session-reviewer` (behavioral — 4 specs),
`session-component-review` (boundaries — Part B + Part C),
`igor-reviewer` (persona). No spec drift; `setCloseReason` remains
CAS-once and no upstream stampers are demoted.1 parent 3b8d30a commit f2905b7
4 files changed
Lines changed: 86 additions & 112 deletions
File tree
- bigtable/internal/transport
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
156 | 156 | | |
157 | 157 | | |
158 | 158 | | |
159 | | - | |
160 | | - | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
161 | 173 | | |
162 | 174 | | |
163 | 175 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
100 | 100 | | |
101 | 101 | | |
102 | 102 | | |
| 103 | + | |
103 | 104 | | |
104 | 105 | | |
105 | 106 | | |
| |||
226 | 227 | | |
227 | 228 | | |
228 | 229 | | |
229 | | - | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
230 | 233 | | |
231 | 234 | | |
232 | 235 | | |
| |||
279 | 282 | | |
280 | 283 | | |
281 | 284 | | |
282 | | - | |
283 | | - | |
284 | | - | |
285 | | - | |
286 | | - | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
287 | 289 | | |
288 | 290 | | |
289 | 291 | | |
| |||
446 | 448 | | |
447 | 449 | | |
448 | 450 | | |
449 | | - | |
450 | | - | |
451 | | - | |
452 | | - | |
453 | | - | |
| 451 | + | |
| 452 | + | |
| 453 | + | |
| 454 | + | |
454 | 455 | | |
455 | | - | |
| 456 | + | |
| 457 | + | |
456 | 458 | | |
457 | 459 | | |
| 460 | + | |
458 | 461 | | |
459 | 462 | | |
460 | 463 | | |
461 | 464 | | |
462 | 465 | | |
463 | | - | |
464 | | - | |
465 | | - | |
466 | | - | |
467 | | - | |
468 | | - | |
469 | | - | |
470 | | - | |
471 | | - | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
472 | 482 | | |
| 483 | + | |
473 | 484 | | |
474 | 485 | | |
475 | 486 | | |
476 | 487 | | |
477 | 488 | | |
478 | 489 | | |
479 | 490 | | |
480 | | - | |
481 | | - | |
| 491 | + | |
| 492 | + | |
482 | 493 | | |
483 | 494 | | |
484 | 495 | | |
485 | 496 | | |
486 | 497 | | |
487 | | - | |
488 | | - | |
489 | | - | |
490 | | - | |
491 | | - | |
492 | | - | |
493 | | - | |
494 | | - | |
495 | | - | |
496 | | - | |
497 | | - | |
498 | | - | |
499 | | - | |
500 | | - | |
501 | | - | |
502 | | - | |
503 | | - | |
504 | | - | |
505 | | - | |
506 | | - | |
507 | | - | |
508 | | - | |
509 | | - | |
510 | | - | |
511 | | - | |
512 | | - | |
513 | | - | |
514 | | - | |
515 | | - | |
516 | | - | |
517 | | - | |
518 | | - | |
519 | | - | |
520 | | - | |
521 | | - | |
522 | | - | |
523 | | - | |
524 | | - | |
525 | | - | |
526 | | - | |
527 | | - | |
528 | | - | |
529 | | - | |
530 | | - | |
531 | | - | |
532 | | - | |
533 | | - | |
534 | | - | |
535 | | - | |
536 | | - | |
537 | | - | |
538 | | - | |
539 | | - | |
540 | | - | |
541 | | - | |
542 | | - | |
543 | | - | |
544 | | - | |
545 | | - | |
546 | | - | |
547 | | - | |
548 | | - | |
549 | | - | |
550 | | - | |
551 | | - | |
552 | | - | |
553 | | - | |
554 | 498 | | |
555 | 499 | | |
556 | 500 | | |
| |||
Lines changed: 13 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
51 | 51 | | |
52 | 52 | | |
53 | 53 | | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
54 | 60 | | |
55 | 61 | | |
56 | 62 | | |
| |||
94 | 100 | | |
95 | 101 | | |
96 | 102 | | |
97 | | - | |
98 | | - | |
99 | | - | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
100 | 107 | | |
101 | 108 | | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
102 | 112 | | |
103 | 113 | | |
104 | 114 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
356 | 356 | | |
357 | 357 | | |
358 | 358 | | |
359 | | - | |
360 | | - | |
361 | | - | |
362 | | - | |
363 | | - | |
364 | | - | |
365 | | - | |
366 | | - | |
367 | | - | |
368 | | - | |
369 | | - | |
370 | | - | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
371 | 372 | | |
372 | 373 | | |
373 | 374 | | |
| |||
377 | 378 | | |
378 | 379 | | |
379 | 380 | | |
380 | | - | |
381 | | - | |
382 | | - | |
383 | | - | |
384 | | - | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
385 | 392 | | |
386 | 393 | | |
| 394 | + | |
387 | 395 | | |
388 | 396 | | |
389 | 397 | | |
| |||
0 commit comments