Skip to content

Add TSO state machine#1150

Merged
bootjp merged 4 commits into
mainfrom
feature/tso-state-machine
Jul 23, 2026
Merged

Add TSO state machine#1150
bootjp merged 4 commits into
mainfrom
feature/tso-state-machine

Conversation

@bootjp

@bootjp bootjp commented Jul 22, 2026

Copy link
Copy Markdown
Owner

Summary

  • add a minimal TSOStateMachine for the dedicated timestamp-oracle Raft group
  • snapshot and restore the HLC physical ceiling as exact 8-byte state with malformed-input rejection
  • update the centralized TSO design doc status for the implemented FSM slice

Tests

  • go test ./kv -run 'TestTSOStateMachine|TestHLCLeaseRoundTrip|TestHLCNextBatchFenced|TestBatchAllocator|TestLocalTSOAllocator|TestShardedCoordinator.*Timestamp|TestCoordinateUsesTSOAllocator' -count=1\n- go test ./kv -count=1\n- golangci-lint --config=.golangci.yaml run ./kv --timeout=5m\n- git diff --check\n- commit hook: golangci-lint --config=.golangci.yaml run --fix

Summary by CodeRabbit

  • 新機能

    • 分散タイムスタンプ発行の基盤を追加し、確定済みの上限値を安全に管理できるようになりました。
    • 上限を使い切った場合に新しいタイムスタンプの発行を拒否し、重複や不整合を防止します。
    • 状態のスナップショット保存・復元に対応しました。
  • ドキュメント

    • リーダー切り替え時のタイムスタンプ安全性と実装状況を更新しました。
  • テスト

    • 上限到達、復元、異常データ処理などの検証を追加しました。

@gemini-code-assist

Copy link
Copy Markdown
Contributor

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

@coderabbitai

coderabbitai Bot commented Jul 22, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@bootjp, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 44 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: f6cf857b-a7cc-4320-b632-406bf3bdafbb

📥 Commits

Reviewing files that changed from the base of the PR and between fe2dc4c and 4ee268c.

📒 Files selected for processing (3)
  • kv/hlc.go
  • kv/tso_fsm.go
  • kv/tso_fsm_test.go
📝 Walkthrough

Walkthrough

TSO専用Raft FSM、HLC ceilingのフェンス処理、snapshot復元、関連テストと設計文書を更新しました。Redisストリーム互換性テストでは、シードおよびMVCC可視性判定の時刻計算を実際のコミット時刻基準に変更しました。

Changes

TSO ceiling管理

Layer / File(s) Summary
HLC ceilingフェンス処理
kv/hlc.go, kv/hlc_test.go, kv/tso_test.go
NextFencedNextBatchFencedのceiling判定を共通化し、論理ウィンドウ枯渇時のErrCeilingExpiredと拒否回数を検証します。
TSOStateMachineの適用とスナップショット
kv/tso_fsm.go
HLC leaseのceilingを単調更新し、HLCへ反映します。8バイトのsnapshot保存・復元とvolatile-only payload判定を追加します。
TSO動作検証と設計記録
kv/tso_fsm_test.go, docs/design/...
lease適用、payload検証、snapshot復元、ceiling枯渇、リーダー切替時の動作をテストと設計文書に反映します。

Redisストリーム互換性テスト

Layer / File(s) Summary
レガシーデータ時刻計算の更新
adapter/redis_compat_commands_stream_test.go
シード時刻をNextFenced()から取得し、削除後の読み取り時刻をLastCommitTS()+1から算出します。

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Raft
  participant TSOStateMachine
  participant HLC
  Raft->>TSOStateMachine: Apply HLC lease
  TSOStateMachine->>TSOStateMachine: Update committed ceiling
  TSOStateMachine->>HLC: Observe and SetPhysicalCeiling
  HLC-->>TSOStateMachine: Updated ceiling state
Loading

Possibly related PRs

  • bootjp/elastickv#620: 同じRedisストリーム互換性テストのレガシー挙動を更新しています。
  • bootjp/elastickv#1095: TSOStateMachineとHLC lease ceiling管理に直接関連します。
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed TSO専用のstate machine追加という主変更を簡潔に表しており、変更内容と一致しています。
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@bootjp

bootjp commented Jul 22, 2026

Copy link
Copy Markdown
Owner Author

@codex review

1 similar comment
@bootjp

bootjp commented Jul 23, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 518a3800b1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread kv/tso_fsm.go Outdated
Comment on lines +41 to +42
if f.hlc != nil && ceilingMs > 0 {
f.hlc.SetPhysicalCeiling(ceilingMs)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Advance the HLC floor when applying TSO leases

When group 0 is switched to this FSM, a replica that has only applied lease entries can later become the TSO leader with HLC.last still at zero; because this apply path only raises physicalCeiling, NextBatchFenced will floor to the same lease millisecond and start logical allocation at 0, reissuing timestamps the previous leader may already have handed out in that lease window. The existing KV FSM avoids this for data timestamps by observing applied commit timestamps, but the TSO-only FSM has no analogous full-HLC floor, so a leader transfer or restart before a fresh ceiling renewal can break timestamp uniqueness.

Useful? React with 👍 / 👎.

Comment thread kv/tso_fsm.go Outdated
Comment on lines +47 to +48
func (f *TSOStateMachine) Snapshot() (raftengine.Snapshot, error) {
return &tsoSnapshot{ceilingMs: hlcCeilingFromHLC(f.hlc)}, nil

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Persist only this group's committed TSO ceiling

When TSOStateMachine is constructed over the process-wide HLC used by the sharded coordinator, any data group can advance f.hlc.PhysicalCeiling() before group 0 snapshots. Snapshotting that shared value lets a group-0 snapshot persist a ceiling that was never committed in the group-0 Raft log; after restore, the TSO leader can issue timestamps under a lease only another group agreed to. Track the TSO group's applied ceiling separately and snapshot that instead.

AGENTS.md reference: AGENTS.md:L33-L35

Useful? React with 👍 / 👎.

@bootjp

bootjp commented Jul 23, 2026

Copy link
Copy Markdown
Owner Author

Updated signed head ea1e04c89713f88c320ba24e801772b418191108 addresses the two current-head TSO FSM findings.

Changes:

  • TSOStateMachine now tracks the group-0 Raft-applied ceiling independently from the shared process HLC and snapshots only that committed ceiling.
  • Applying/restoring a TSO lease now advances the shared HLC through the ceiling millisecond so the next fenced allocation cannot reuse logical values from the previous lease window.
  • Added focused coverage for allocation-floor advancement and for ignoring unrelated shared-HLC ceiling updates during TSO snapshots.

Validation:

  • go test ./kv -run 'TestTSOStateMachine|TestHLCNextBatchFenced' -count=1\n- go test ./kv -count=1\n- golangci-lint run ./kv --timeout=5m\n- go test ./... -run '^$'\n- git diff --check\n\n@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ea1e04c897

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread kv/tso_fsm.go Outdated
Comment on lines +75 to +76
f.hlc.SetPhysicalCeiling(ceilingMs)
f.hlc.Observe(tsoCeilingMaxTimestamp(ceilingMs))

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Don’t reuse the post-ceiling timestamp after failover

When dedicated TSO issuance uses this FSM, applying/restoring a lease with ceiling C now only snapshots C but advances the in-memory HLC to C|maxLogical, so the first fenced batch is C+1,0. If that TSO leader dies before a newer ceiling is committed, the replacement restores/replays the same committed ceiling C, runs the same Observe(C|maxLogical), and can hand out C+1,0 again. The post-ceiling floor has to be part of the Raft-committed/restored state or allocation must wait for a fresh committed lease above the restored ceiling.

Useful? React with 👍 / 👎.

Comment thread kv/tso_fsm.go Outdated
Comment on lines +75 to +76
f.hlc.SetPhysicalCeiling(ceilingMs)
f.hlc.Observe(tsoCeilingMaxTimestamp(ceilingMs))

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Close the lease-apply race before publishing the ceiling

While this FSM is applying a lease and the node is also serving timestamp allocations, SetPhysicalCeiling(C) becomes visible before Observe(C|maxLogical) fences off the logical values in that millisecond. A concurrent NextBatchFenced in that gap can see the new ceiling with the old last value and allocate C,0 (or another low logical value), defeating the handoff this change is trying to enforce when that ceiling millisecond was already used by the prior lease holder. Publish the observed floor before the ceiling, or add a single HLC operation that advances both atomically.

Useful? React with 👍 / 👎.

@github-actions

Copy link
Copy Markdown
Contributor

TLA+ spec divergence review (auto-triggered)

This PR touches files that the TLA+ safety spec has an anchor on (per
docs/design/2026_05_28_implemented_tla_safety_spec.md §3),
so an AI review is requested below to verify the implementation has not drifted
from the model.

Anchored files changed in this PR head (fe2dc4c):

  • kv/hlc.go
  • kv/hlc_test.go

What to check, by subsystem:

  • kv/hlc*.goNext() must respect the HLC-4 preconditions (i)/(ii)/(iii) from the design doc: bounded skew, logical-counter handoff on leader change (strategy (c) Observe(MaxAppliedHLC)), and the commit-time ceiling fence (fail-closed when wall_now >= physicalCeiling). Any change to the bit layout (48/16), the CAS loop, or the ceiling getter/setter is in scope.
  • kv/coordinator.go, kv/sharded_coordinator.goRunHLCLeaseRenewal, hlcRenewalInterval, hlcPhysicalWindowMs constants, and the new-term detection that calls Observe(fsm.MaxAppliedHLC()) (strategy (c)). Any change to renewal cadence, group selection, or fail-closed behaviour is in scope.
  • kv/transaction.go, kv/lock_resolver.go — OCC commit-ts assignment, lock-map encoding (key, lock_ts) -> start_ts, and the LockResolver action OCC-3 depends on. (M2 spec will land OCC-1..OCC-5; until then the spec doc §5.2 is the contract.)
  • kv/fsm.go — FSM apply of HLC lease entries (SetPhysicalCeiling), and any future MaxAppliedHLC() accessor that strategy (c) needs.
  • store/mvcc_store.go — version visibility, snapshot install, and the MVCC-1..MVCC-4 invariants (M3 scope).
  • distribution/** — route catalog versioning, SplitRange atomicity, and CatalogWatcher async fan-out (M4 scope).

If the change is correct but requires a spec update, edit tla/hlc/HLC.tla (or the corresponding M2..M5 module once landed) and the design doc in the same PR. The tla-check workflow runs the TLC model check on the same paths.


@claude review please verify TLA+ spec divergence per the checklist above.

@codex review please verify TLA+ spec divergence per the checklist above.

@chatgpt-codex-connector

Copy link
Copy Markdown

To use Codex here, create a Codex account and connect to github.

@bootjp

bootjp commented Jul 23, 2026

Copy link
Copy Markdown
Owner Author

Updated signed head fe2dc4c7b8ea358f613da28dde8da9e709ca1b3f addresses the latest TSO FSM P1/P2 findings.

Changes:

  • Fenced HLC allocation now fails closed when the next single/batch timestamp would require a physical millisecond above the committed ceiling, so an exhausted restored ceiling cannot hand out the same post-ceiling timestamp again after failover.
  • TSOStateMachine now observes the ceiling handoff floor before publishing the physical ceiling, closing the lease-apply gap that could allocate low logical values inside the committed ceiling.
  • Added focused HLC and TSO FSM coverage for exhausted ceiling windows.
  • Updated the legacy Redis stream fixture to seed with an HLC timestamp instead of UnixNano, which would incorrectly push the test clock beyond the committed ceiling under the stricter fence.

Validation:

  • go test ./kv -run 'TestHLCNextFenced|TestHLCNextBatchFenced|TestTSOStateMachine' -count=1
  • go test ./kv -count=1
  • go test ./adapter -run 'TestRedis_StreamLegacyDataIsDiscarded|TestRedis_StreamXReadLatencyIsConstant|Test.*HLC|TestRedis.*TTL|TestRedis.*Collection' -count=1 -timeout=180s
  • go test ./... -run '^$'
  • golangci-lint run ./kv ./adapter --timeout=5m
  • git diff --check

Caller audit:

  • Grepped all NextFenced / NextBatchFenced callers after changing the fail-closed semantics; production call sites already propagate allocation errors, and the only local adjustment needed was the Redis stream test fixture described above.

Note: plain go test ./... reached the adapter package 10 minute timeout in this worktree; targeted adapter coverage for the changed HLC paths passed, and the full compile check passed.

@codex review

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@kv/hlc.go`:
- Around line 178-183: Update the error message associated with
ErrCeilingExpired in rejectFencedPhysicalOverflow so it does not assert wall_now
>= physicalCeiling; use wording that accurately describes rejection due to the
fenced physical/logical ceiling without depending on the specific triggering
condition. Preserve the existing rejection condition, counter increment, and
returned error symbol.

In `@kv/tso_fsm.go`:
- Around line 117-118: In the snapshot write path, update the short-write branch
checking n against tsoSnapshotLen to return io.ErrShortWrite wrapped with
cockroachdb/errors.WithStack, matching the wrapping applied to w.Write errors.
- Around line 69-77: applyTSOCeiling の ceiling 更新処理を、復元時と通常の C→D
更新で分けてください。復元時は復元した ceiling を HLC の floor とし、通常更新では D を設定する前に前回の committed
ceiling C を floor としてから D を適用します。呼び出し元の復元経路を明示的に区別し、2 回目の lease 後に
NextBatchFenced の allocation が成功するテストへ更新してください。
- Around line 38-44: Validate the decoded ceiling in applyHLCLease before
calling applyTSOCeiling, rejecting values above the maximum timestamp
representable after the HLC logical-bit shift. Apply the same pre-mutation
validation in the snapshot restore path so oversized lease state cannot alter
HLC current. Add Apply and Restore tests covering out-of-range lease and
snapshot payloads, including the expected rejection and unchanged state.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ea4c1253-4741-475a-b2bb-85a8bed51429

📥 Commits

Reviewing files that changed from the base of the PR and between 5d4c5ca and fe2dc4c.

📒 Files selected for processing (7)
  • adapter/redis_compat_commands_stream_test.go
  • docs/design/2026_04_16_partial_centralized_tso.md
  • kv/hlc.go
  • kv/hlc_test.go
  • kv/tso_fsm.go
  • kv/tso_fsm_test.go
  • kv/tso_test.go

Comment thread kv/hlc.go
Comment thread kv/tso_fsm.go
Comment thread kv/tso_fsm.go Outdated
Comment thread kv/tso_fsm.go Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fe2dc4c7b8

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread kv/tso_fsm.go Outdated
}
f.advanceCommittedCeiling(ceilingMs)
if f.hlc != nil {
f.hlc.Observe(tsoCeilingMaxTimestamp(ceilingMs))

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Leave renewed TSO windows allocatable

When this FSM is paired with the existing TSO allocation path, applying any fresh lease makes the window immediately unusable: Observe(tsoCeilingMaxTimestamp(ceilingMs)) sets HLC.last to ceiling|maxLogical, then SetPhysicalCeiling(ceilingMs) publishes that same ceiling, so the next NextBatchFenced has to advance to ceiling+1 and is rejected by the new overflow fence. This does fence restored/exhausted handoffs, but it also means every newly committed renewal is exhausted before the TSO leader can serve a single timestamp; the handoff floor needs to be separated from normal renewal application (or observe the prior floor rather than the newly published ceiling).

Useful? React with 👍 / 👎.

@github-actions

Copy link
Copy Markdown
Contributor

TLA+ spec divergence review (auto-triggered)

This PR touches files that the TLA+ safety spec has an anchor on (per
docs/design/2026_05_28_implemented_tla_safety_spec.md §3),
so an AI review is requested below to verify the implementation has not drifted
from the model.

Anchored files changed in this PR head (4ee268c):

  • kv/hlc.go
  • kv/hlc_test.go

What to check, by subsystem:

  • kv/hlc*.goNext() must respect the HLC-4 preconditions (i)/(ii)/(iii) from the design doc: bounded skew, logical-counter handoff on leader change (strategy (c) Observe(MaxAppliedHLC)), and the commit-time ceiling fence (fail-closed when wall_now >= physicalCeiling). Any change to the bit layout (48/16), the CAS loop, or the ceiling getter/setter is in scope.
  • kv/coordinator.go, kv/sharded_coordinator.goRunHLCLeaseRenewal, hlcRenewalInterval, hlcPhysicalWindowMs constants, and the new-term detection that calls Observe(fsm.MaxAppliedHLC()) (strategy (c)). Any change to renewal cadence, group selection, or fail-closed behaviour is in scope.
  • kv/transaction.go, kv/lock_resolver.go — OCC commit-ts assignment, lock-map encoding (key, lock_ts) -> start_ts, and the LockResolver action OCC-3 depends on. (M2 spec will land OCC-1..OCC-5; until then the spec doc §5.2 is the contract.)
  • kv/fsm.go — FSM apply of HLC lease entries (SetPhysicalCeiling), and any future MaxAppliedHLC() accessor that strategy (c) needs.
  • store/mvcc_store.go — version visibility, snapshot install, and the MVCC-1..MVCC-4 invariants (M3 scope).
  • distribution/** — route catalog versioning, SplitRange atomicity, and CatalogWatcher async fan-out (M4 scope).

If the change is correct but requires a spec update, edit tla/hlc/HLC.tla (or the corresponding M2..M5 module once landed) and the design doc in the same PR. The tla-check workflow runs the TLC model check on the same paths.


@claude review please verify TLA+ spec divergence per the checklist above.

@codex review please verify TLA+ spec divergence per the checklist above.

@chatgpt-codex-connector

Copy link
Copy Markdown

To use Codex here, create a Codex account and connect to github.

@bootjp

bootjp commented Jul 23, 2026

Copy link
Copy Markdown
Owner Author

Updated signed head 4ee268c443ae0ce48e2b092fde3d013adc107fe5 addresses the current TSO FSM review findings.

Changes:

  • ErrCeilingExpired no longer claims the only failure mode is wall_now >= physicalCeiling; it now covers physical/logical ceiling exhaustion.
  • TSO lease Apply and Restore validate decoded physical ceilings before mutating FSM/HLC state, rejecting values that cannot be represented after the HLC logical-bit shift.
  • Normal C-to-D lease renewal now observes the previous committed ceiling as the handoff floor before publishing D, so the renewed window remains allocatable. Restore still observes the restored ceiling as exhausted.
  • Snapshot short writes now wrap io.ErrShortWrite consistently.

Validation:

  • go test ./kv -run 'TestTSOStateMachine|TestHLCNextFenced|TestHLCNextBatchFenced' -count=1\n- go test ./kv -count=1\n- golangci-lint run ./kv --timeout=5m\n- go test ./... -run '^$'\n- git diff --check\n\nCaller audit:\n- applyTSOCeiling callers are only TSO FSM Apply and Restore; both paths now pass the explicit normal/restore mode.\n- advanceCommittedCeiling and decodeTSOCeiling are private to the same FSM path.\n\n@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 🎉

Reviewed commit: 4ee268c443

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@bootjp
bootjp merged commit 0e85c82 into main Jul 23, 2026
11 checks passed
@bootjp
bootjp deleted the feature/tso-state-machine branch July 23, 2026 11:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant