Skip to content

pd-ctl: add GC state inspection commands - #11054

Merged
ti-chi-bot[bot] merged 31 commits into
tikv:masterfrom
wfxr:wfxr/gc-state-cmd
Aug 13, 2026
Merged

pd-ctl: add GC state inspection commands#11054
ti-chi-bot[bot] merged 31 commits into
tikv:masterfrom
wfxr:wfxr/gc-state-cmd

Conversation

@wfxr

@wfxr wfxr commented Jul 28, 2026

Copy link
Copy Markdown
Member

What problem does this PR solve?

PD exposes per-keyspace and cluster-wide GC state through RPCs, but operators cannot inspect that state through pd-ctl. This makes it difficult to identify whether GC advancement is blocked by a keyspace-local barrier or a cluster-wide global barrier.

Issue Number: close #11013, ref #8978

What is changed and how does it work?

Add read-only `pd-ctl gc-state keyspace` and `gc-state all` commands. The keyspace view uses `GetGCState` to return the effective safe points, local barriers, and global barriers in one read. The all view uses `GetAllKeyspacesGCStates` only when every effective GC scope is required. Both views support `--exclude-global-barriers` to skip the global barrier read and omit the JSON field, while `--include-expired` controls zero-TTL barrier visibility.

Expose the server-provided keyspace-level GC mode through the public GC client model so the command can distinguish independent keyspace GC from unified GC. Return deterministic JSON and preserve the distinction between an omitted global barrier result and a requested empty list.

Check List

Tests

  • Unit test
  • Integration test
  • Manual test

Release note

Add `pd-ctl gc-state keyspace` and `gc-state all` commands for inspecting GC safe points and the local and global barriers that can block GC.

@ti-chi-bot

ti-chi-bot Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Skipping CI for Draft Pull Request.
If you want CI signal for your change, please convert it to an actual PR.
You can still manually trigger a test run with /test all

@ti-chi-bot ti-chi-bot Bot added release-note Denotes a PR that will be considered when it comes time to generate release notes. do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. do-not-merge/needs-triage-completed dco-signoff: yes Indicates the PR's author has signed the dco. labels Jul 28, 2026
@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds keyspace-level GC metadata propagation and introduces the read-only pd-ctl gc-state command with keyspace, global, and all views, deterministic JSON output, optional expired-barrier inclusion, documentation, unit tests, and integration coverage.

Changes

GC state inspection

Layer / File(s) Summary
GC scope metadata
client/clients/gc/client.go, client/gc_client.go, client/gc_client_test.go, tests/integrations/client/client_test.go, pkg/storage/endpoint/cluster_id_test.go
GC state conversion preserves whether a state is keyspace-level GC, with focused unit, integration, and cleanup coverage.
GC state command and barrier filtering
tools/pd-ctl/pdctl/command/gc_state_command.go, tools/pd-ctl/pdctl/ctl.go
Adds PD-backed keyspace, global, and all views, deterministic barrier JSON, TTL conversion, and --include-expired filtering.
Command validation and integration coverage
tools/pd-ctl/pdctl/command/gc_state_command_test.go, tools/pd-ctl/tests/safepoint/gc_state_test.go, tools/pd-ctl/README.md
Covers command routing, output contracts, validation, errors, expired barriers, TTL semantics, documentation, and test-cluster behavior.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Operator
  participant GCStateCommand
  participant PDGCStateReader
  participant PD
  Operator->>GCStateCommand: invoke keyspace, global, or all with include-expired option
  GCStateCommand->>PDGCStateReader: request GC state
  PDGCStateReader->>PD: call GC state RPC
  PD-->>PDGCStateReader: return states and barriers
  PDGCStateReader-->>GCStateCommand: return state data
  GCStateCommand-->>Operator: write filtered sorted JSON
Loading

Possibly related PRs

  • tikv/pd#10669: Modifies related GC state retrieval and conversion paths.
  • tikv/pd#10677: Modifies related GCState retrieval and preservation paths.
  • tikv/pd#11024: Modifies protobuf conversion and keyspace-ID handling in related GC client code.

Suggested labels: do-not-merge/needs-triage-completed

Suggested reviewers: jmpotato, rleungx

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes implement issue #11013 by adding read-only keyspace and all-keyspace GC state inspection with safe points, barriers, documentation, and backward-compatible service commands.
Out of Scope Changes check ✅ Passed The changes are related to the gc-state feature, including client model support, command implementation, documentation, tests, and test-state cleanup.
Title check ✅ Passed The title clearly and concisely identifies the main change: adding GC state inspection commands to pd-ctl.
Description check ✅ Passed The description covers the problem, issue references, implementation, tests, and release note, although several optional checklist sections are omitted.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@ti-chi-bot ti-chi-bot Bot added the size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. label Jul 28, 2026
@codecov

codecov Bot commented Jul 28, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 89.26554% with 38 lines in your changes missing coverage. Please review.
✅ Project coverage is 79.47%. Comparing base (3430f76) to head (c239a4a).

Additional details and impacted files
@@            Coverage Diff             @@
##           master   #11054      +/-   ##
==========================================
+ Coverage   79.43%   79.47%   +0.03%     
==========================================
  Files         542      543       +1     
  Lines       77117    77466     +349     
==========================================
+ Hits        61259    61566     +307     
- Misses      11571    11584      +13     
- Partials     4287     4316      +29     
Flag Coverage Δ
unittests 79.47% <89.26%> (+0.03%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@wfxr
wfxr force-pushed the wfxr/gc-state-cmd branch from dc851d9 to e2ce6ae Compare July 28, 2026 06:29
@wfxr
wfxr marked this pull request as ready for review July 28, 2026 06:42
@ti-chi-bot ti-chi-bot Bot removed the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Jul 28, 2026

@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: 2

🧹 Nitpick comments (1)
tools/pd-ctl/pdctl/command/gc_state_command.go (1)

344-352: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Pass the original error to status.Code.

status.FromError unwraps via errors.As, so status.Code(err) already covers fmt.Errorf("%w") chains; errors.Cause(err) only follows pingcap/errors causer chains and can miss gRPC status errors wrapped outside that chain. Apply this fix to the duplicate Unimplemented checks as well.

🤖 Prompt for 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.

In `@tools/pd-ctl/pdctl/command/gc_state_command.go` around lines 344 - 352,
Update the Unimplemented status check in the GC-state retrieval error path to
pass the original err directly to status.Code instead of errors.Cause(err),
preserving the existing annotation behavior. Apply the same change to every
duplicate Unimplemented check in this command.
🤖 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 `@tools/pd-ctl/pdctl/command/gc_state_command.go`:
- Around line 197-208: Update newLocalGCBarrierOutputs to skip nil barrier
entries before accessing BarrierID, BarrierTS, or TTL. Preserve the existing
output construction and sorting for non-nil entries so malformed protobuf
responses do not panic the CLI.

In `@tools/pd-ctl/tests/safepoint/gc_state_test.go`:
- Around line 83-88: Widen the lower TTL bound in the expires branch of the
safepoint test from 3595 seconds to a more tolerant value, while keeping the
3600-second upper bound and the non-expiring MaxInt64 assertion unchanged.

---

Nitpick comments:
In `@tools/pd-ctl/pdctl/command/gc_state_command.go`:
- Around line 344-352: Update the Unimplemented status check in the GC-state
retrieval error path to pass the original err directly to status.Code instead of
errors.Cause(err), preserving the existing annotation behavior. Apply the same
change to every duplicate Unimplemented check in this command.
🪄 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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: e91048ab-3bb5-41ce-83f7-160a2afa5049

📥 Commits

Reviewing files that changed from the base of the PR and between 276877c and e5ed1dd.

📒 Files selected for processing (10)
  • client/clients/gc/client.go
  • client/gc_client.go
  • client/gc_client_test.go
  • pkg/storage/endpoint/cluster_id_test.go
  • tests/integrations/client/client_test.go
  • tools/pd-ctl/README.md
  • tools/pd-ctl/pdctl/command/gc_state_command.go
  • tools/pd-ctl/pdctl/command/gc_state_command_test.go
  • tools/pd-ctl/pdctl/ctl.go
  • tools/pd-ctl/tests/safepoint/gc_state_test.go

Comment thread tools/pd-ctl/pdctl/command/gc_state_command.go Outdated
Comment thread tools/pd-ctl/tests/safepoint/gc_state_test.go Outdated
@wfxr

wfxr commented Jul 28, 2026

Copy link
Copy Markdown
Member Author

/retest

4 similar comments
@wfxr

wfxr commented Jul 28, 2026

Copy link
Copy Markdown
Member Author

/retest

@wfxr

wfxr commented Jul 29, 2026

Copy link
Copy Markdown
Member Author

/retest

@wfxr

wfxr commented Jul 29, 2026

Copy link
Copy Markdown
Member Author

/retest

@wfxr

wfxr commented Jul 29, 2026

Copy link
Copy Markdown
Member Author

/retest

if barrier == nil {
continue
}
result = append(result, gcBarrierOutput{

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

When an expired barrier has not yet been lazily deleted by a later safe-point advancement, the read RPCs still return it with a zero TTL, and both projection helpers include it unconditionally. gc-state therefore mixes inactive local and global barriers with current blockers, so operators and scripts can attribute a stalled safe point to the wrong barrier.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Confirmed. I’ll omit zero-TTL barriers by default so gc-state shows effective blockers. However, expired barriers that are still awaiting lazy deletion are useful for diagnosing what previously blocked GC and whether a later safe-point advancement has performed cleanup. I’ll therefore add an --include-expired flag for keyspace, global, and all; when enabled, these barriers will remain in the existing arrays with ttl_seconds: 0.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Done by b134800

@wfxr

wfxr commented Jul 30, 2026

Copy link
Copy Markdown
Member Author

/retest

@wfxr
wfxr requested a review from rleungx July 30, 2026 06:31
@wfxr

wfxr commented Jul 30, 2026

Copy link
Copy Markdown
Member Author

/retest

@wfxr

wfxr commented Aug 3, 2026

Copy link
Copy Markdown
Member Author

/check-issue-triage-complete

client clusterGCStatesClient,
excludeGCBarriers bool,
) (gc.ClusterGCStates, error) {
return client.GetAllKeyspacesGCStates(

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

gc-state global reaches this GetAllKeyspacesGCStates call even though it only emits global barriers. On clusters with many keyspaces, PD still scans and returns every keyspace state, the client materializes the full map and then discards it, and the default three-second client timeout can make this diagnostic fail while imposing unnecessary PD/etcd work.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

This is intentional. gc-state global is a diagnostic projection over the existing GetAllKeyspacesGCStates response rather than a new production API. We currently don’t have a concrete consumer or production requirement for a global-barriers-only RPC, so adding new kvproto, server, and client API surface solely for this low-frequency diagnostic command would be premature.

The command also sets ExcludeGCBarriers(true). On the PD leader, this lets GetAllKeyspacesGCStates reuse the GC-state cache and avoids loading every keyspace’s local barriers or running the full GC-state storage path on cache hits. Keyspace metadata is still enumerated and the safe-point states are still returned, but that remaining cost is an intentional trade-off for reusing the existing compatible RPC. We can revisit a global-only API if production usage or measurements show that this path cannot meet the diagnostic command’s latency requirements.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Addressed by adding opt-in global-barrier support to GetGCState in #11117 and reworking this command in 90d0453. The standalone gc-state global command has been removed. gc-state keyspace now fetches the requested keyspace state and global barriers with a single GetGCState call; GetAllKeyspacesGCStates is used only by gc-state all, where full enumeration is expected.


type gcStateReader interface {
getGCState(context.Context, uint32) (gc.GCState, error)
getGlobalGCState(context.Context) (gc.ClusterGCStates, error)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

getGlobalGCState and getAllKeyspacesGCStates are two reader methods for the same RPC; the only behavioral difference is the ExcludeGCBarriers boolean passed below. Keeping both names duplicates the interface, fake, and option-test surface and makes the global command look cheaper than the full-cluster read it actually performs.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

The shared RPC is intentional, but gcStateReader is the command-facing abstraction rather than a direct mirror of the PD client API. getGlobalGCState and getAllKeyspacesGCStates represent two different command behaviors even though the current adapter implements both with GetAllKeyspacesGCStates.

Keeping them separate lets the command and its tests depend on those behaviors instead of depending on ExcludeGCBarriers or another transport-level parameter. The concrete reader already shares the common RPC implementation through readClusterGCStates, so the actual implementation duplication is limited. It also lets the adapter change independently if the underlying APIs diverge later, without changing command routing or command tests.

The cost of reusing GetAllKeyspacesGCStates for the global diagnostic view is intentional and is discussed as before; the method name describes the state requested by the command rather than promising a dedicated RPC.

@wfxr
wfxr requested a review from rleungx August 3, 2026 06:51
Comment thread client/gc_client_test.go Outdated
} {
t.Run(testCase.name, func(t *testing.T) {
pbState := &pdpb.GCState{
KeyspaceScope: &pdpb.KeyspaceScope{KeyspaceId: 42},

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Current master no longer has the direct KeyspaceId field after the API-v3 protobuf migration, and the same migration removed the direct .Id accesses used in gc_state_test.go. The clean merge therefore leaves newly added tests that do not compile, so the pre-migration CI result does not validate the current target branch.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Thanks for the heads-up. I’ll rebase onto the latest master and adapt the affected code to the API v3 changes.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Done

Signed-off-by: Wenxuan Zhang <wenxuangm@gmail.com>
@wfxr
wfxr force-pushed the wfxr/gc-state-cmd branch from 7bc7ad3 to 0696343 Compare August 11, 2026 10:08
@wfxr

wfxr commented Aug 11, 2026

Copy link
Copy Markdown
Member Author

/retest

Remove the one-time design and implementation workflow documents now that the
GC state command changes are implemented. Keep the PR focused on durable
product code, tests, and user documentation.

Signed-off-by: Wenxuan Zhang <wenxuangm@gmail.com>
@wfxr

wfxr commented Aug 12, 2026

Copy link
Copy Markdown
Member Author

/retest

4 similar comments
@wfxr

wfxr commented Aug 12, 2026

Copy link
Copy Markdown
Member Author

/retest

@wfxr

wfxr commented Aug 12, 2026

Copy link
Copy Markdown
Member Author

/retest

@wfxr

wfxr commented Aug 12, 2026

Copy link
Copy Markdown
Member Author

/retest

@wfxr

wfxr commented Aug 12, 2026

Copy link
Copy Markdown
Member Author

/retest

}
defer reader.close()

clusterState, err := reader.getAllKeyspacesGCStates(

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

GetAllKeyspacesGCStates scans every keyspace and loads each keyspace-level scope's local barriers, while this client keeps the default three-second RPC timeout. At sufficiently large keyspace or barrier cardinality, gc-state all can time out before returning any diagnostic output, even though full-cluster inspection is the purpose of this subcommand.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Fixed. gc-state now uses a configurable --timeout with a 30-second default and passes it to the dedicated PD client through opt.WithCustomTimeoutOption.

Use a 30-second default and expose --timeout on both GC state commands.

This lets full-cluster inspection tolerate large keyspace and barrier sets.

Signed-off-by: Wenxuan Zhang <wenxuangm@gmail.com>
@wfxr

wfxr commented Aug 12, 2026

Copy link
Copy Markdown
Member Author

/retest

@ti-chi-bot ti-chi-bot Bot added needs-1-more-lgtm Indicates a PR needs 1 more LGTM. approved labels Aug 12, 2026
Comment thread tools/pd-ctl/README.md

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The markdown in this document has strange, premature line breaks. I don't think they're necessary.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Fixed

Comment thread tools/pd-ctl/README.md Outdated

Use `--exclude-global-barriers` to skip the global-barrier read and remove the
`global_gc_barriers` field from the JSON output. The flag applies to both
remaining subcommands:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This wording depends on the history of the removed global subcommand. Please describe the current interface directly: The flag applies to both subcommands.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Updated.

}
}

func TestGCStateGlobalCommandIsRemoved(t *testing.T) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please name this test after the current behavior rather than the removed implementation, for example TestGCStateRejectsGlobalSubcommand.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Removed this test instead. The final interface is already covered by TestGCStateCommandHelpContract, which asserts that the supported subcommands are exactly keyspace and all.

return result
}

func newGlobalGCBarrierOutputs(barriers []*gc.GlobalGCBarrierInfo, includeExpired bool) []gcBarrierOutput {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please consolidate these two identical filter, projection, and sort pipelines so local and global barrier output cannot drift.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Nice catch! Consolidated filtering, projection, TTL conversion, and sorting into a shared helper. The local and global functions now only adapt their distinct input types.

Share local and global barrier output conversion to prevent behavior drift.

Update the guide for the final command surface and remove the history-only test.

Signed-off-by: Wenxuan Zhang <wenxuangm@gmail.com>
@wfxr
wfxr requested a review from JmPotato August 13, 2026 01:51
}
excludedNullStateWithExpired, ok := excludedStatesByIDWithExpired[constant.NullKeyspaceID]
re.True(ok)
re.Equal(nullState, excludedNullStateWithExpired)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

These equality checks compare snapshots from separate command executions, including finite TTLs that decrease over time. The test can cross a one-second boundary and fail even when the state is otherwise unchanged (I reproduced 3600 vs 3599). Please compare only the stable fields and validate barriers with requireGCStateCommandBarriers; the same applies to the other whole-state equality checks in this block.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

fixed in c239a4a

Signed-off-by: Wenxuan Zhang <wenxuangm@gmail.com>
@wfxr
wfxr requested a review from JmPotato August 13, 2026 03:49
@wfxr

wfxr commented Aug 13, 2026

Copy link
Copy Markdown
Member Author

/retest

1 similar comment
@wfxr

wfxr commented Aug 13, 2026

Copy link
Copy Markdown
Member Author

/retest

@ti-chi-bot

ti-chi-bot Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: JmPotato, rleungx

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@ti-chi-bot ti-chi-bot Bot added lgtm and removed needs-1-more-lgtm Indicates a PR needs 1 more LGTM. labels Aug 13, 2026
@ti-chi-bot

ti-chi-bot Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

[LGTM Timeline notifier]

Timeline:

  • 2026-08-12 10:30:21.257815382 +0000 UTC m=+3215207.293910428: ☑️ agreed by rleungx.
  • 2026-08-13 07:22:40.961153498 +0000 UTC m=+3290346.997248555: ☑️ agreed by JmPotato.

@wfxr

wfxr commented Aug 13, 2026

Copy link
Copy Markdown
Member Author

/retest

@ti-chi-bot
ti-chi-bot Bot merged commit 4001928 into tikv:master Aug 13, 2026
41 of 43 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved dco-signoff: yes Indicates the PR's author has signed the dco. lgtm release-note Denotes a PR that will be considered when it comes time to generate release notes. size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

pd-ctl: add a gc-state command for keyspace GC troubleshooting

3 participants