Skip to content

schemastore,gc: switch GC keeper to generic service-ts safety path#4670

Open
lidezhu wants to merge 3 commits intomasterfrom
ldz/improve-schema-store0331
Open

schemastore,gc: switch GC keeper to generic service-ts safety path#4670
lidezhu wants to merge 3 commits intomasterfrom
ldz/improve-schema-store0331

Conversation

@lidezhu
Copy link
Copy Markdown
Collaborator

@lidezhu lidezhu commented Apr 1, 2026

What problem does this PR solve?

Issue Number: close #xxx

What is changed and how it works?

Check List

Tests

  • Unit test
  • Integration test
  • Manual test (add detailed scripts or steps below)
  • No code

Questions

Will it cause performance regression or break compatibility?
Do you need to update user documentation, design documentation or monitoring documentation?

Release note

Please refer to [Release Notes Language Style Guide](https://pingcap.github.io/tidb-dev-guide/contribute-to-tidb/release-notes-style-guide.html) to write a quality release note.

If you don't think this PR needs a release note then fill it with `None`.

Summary by CodeRabbit

  • Improvements

    • Increased GC refresh interval from 10s to 1m to reduce churn.
    • Unified GC service identity handling to improve GC cleanup reliability and safety checks.
  • Bug Fixes

    • Removed off-by-one timestamp adjustments—GC barriers now use exact timestamps.
    • Enhanced validation to detect and reject stale timestamps during GC operations.

@ti-chi-bot ti-chi-bot Bot added do-not-merge/needs-linked-issue 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. labels Apr 1, 2026
@ti-chi-bot
Copy link
Copy Markdown

ti-chi-bot Bot commented Apr 1, 2026

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:
Once this PR has been reviewed and has the lgtm label, please assign kennytm for approval. For more information see the Code Review Process.
Please ensure that each of them provides their approval before proceeding.

The full list of commands accepted by this bot can be found 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 the size/L Denotes a PR that changes 100-499 lines, ignoring generated files. label Apr 1, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 1, 2026

📝 Walkthrough

Walkthrough

Schema-store GC keeper now uses a single precomputed gcServiceID, calls gc.EnsureServiceTsSafety directly (removing previous startTs+1 logic), uses gc.UnifyDeleteGcSafepoint on close, and increases the GC refresh ticker from 10s to 1m. Tests updated and a stale-ts error test added.

Changes

Cohort / File(s) Summary
GC Keeper implementation
logservice/schemastore/gc_keeper.go
Replaced tag/parts-based service ID with precomputed gcServiceID; call gc.EnsureServiceTsSafety(ctx, serviceID, ts) without incrementing ts; use gc.UnifyDeleteGcSafepoint on close; GC refresh interval changed 10s → 1m; removed math dependency.
GC Keeper tests
logservice/schemastore/gc_keeper_test.go
Updated expectations to remove +1 offset after initialize/refresh; added TestSchemaStoreGCKeeperRefreshReturnsErrorWhenTsIsStale to assert error when provided TS is behind stored safe points.
GC service API
pkg/txnutil/gc/gc_service.go
Added exported EnsureServiceTsSafety with branching for classic vs next-gen kernels; implemented classic and next-gen safety flows, including SetServiceGCSafepoint/SetGCBarrier and UnifyGetServiceGCSafepoint-based recovery semantics; minor comment cleanup.

Sequence Diagram(s)

sequenceDiagram
    participant Keeper as SchemaStoreGCKeeper
    participant GC as gc package
    participant Store as SafePointService

    Keeper->>GC: EnsureServiceTsSafety(ctx, serviceID, ts)
    GC->>Store: SetServiceGCSafepoint / SetGCBarrier (mode-dependent)
    alt ts behind returned minimum
        Store-->>GC: minSafePoint (>= ts)
        GC-->>Keeper: ErrSnapshotLostByGC
    else success
        Store-->>GC: ok
        GC-->>Keeper: success
    end

    Note over Keeper,GC: On close
    Keeper->>GC: UnifyDeleteGcSafepoint(ctx, serviceID)
    GC->>Store: UnifyDelete (remove service safepoint)
    Store-->>GC: ok
    GC-->>Keeper: closed
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested labels

lgtm, size/XL

Suggested reviewers

  • wk989898
  • hongyunyan
  • tenfyzhong

Poem

🐰 I precompute my tidy name,
hop safe when timestamps stake their claim,
no +1 leap, just honest ticks,
barriers kept and cleanup fixed,
one-minute breaths — I humbly exclaim! 🥕

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The PR description contains only the template with all sections unfilled, including no problem statement, no implementation details, no issue number, and no checked test items. Fill in all required sections: describe the problem being solved, explain implementation details, link a real issue (not 'close #xxx'), specify which tests were added, and provide a release note or mark as 'None'.
Docstring Coverage ⚠️ Warning Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main change: switching GC keeper to use a generic service-ts safety path instead of previous custom logic.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ldz/improve-schema-store0331

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 and usage tips.

Copy link
Copy Markdown

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

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 refactors the schema store's GC keeper to simplify service ID management and introduces a more precise GC safety API, EnsureServiceTsSafety, which supports both changefeed start timestamps and exact timestamps. The GC refresh interval was also increased from 10 seconds to 1 minute. Review feedback identifies a bug in ensureServiceGCSafetyNextGen where non-GC errors are incorrectly reported as timestamp issues and notes that the wrong timestamp is reported in error messages when using the exact safety mode.

Comment thread pkg/txnutil/gc/gc_service.go Outdated
Comment on lines +135 to +145
if mode == serviceTsSafetyStartTs {
return errors.ErrStartTsBeforeGC.GenWithStackByArgs(ts)
}
if !errors.IsGCBarrierTSBehindTxnSafePointError(err) {
return errors.WrapError(errors.ErrUpdateGCBarrierFailed, err)
}

minBarrierTS, barrierErr := UnifyGetServiceGCSafepoint(ctx, pdCli, keyspaceID, serviceID)
if barrierErr != nil {
return barrierErr
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

high

The current implementation of ensureServiceGCSafetyNextGen incorrectly returns ErrStartTsBeforeGC for any error encountered during SetGCBarrier when in serviceTsSafetyStartTs mode. This includes non-GC related errors like network failures or context cancellations. It should first verify if the error is indeed due to the timestamp being behind the GC safe point. Furthermore, ErrStartTsBeforeGC expects two arguments (the requested timestamp and the current safe point), but only one is provided here, which will lead to a malformed error message.

Suggested change
if mode == serviceTsSafetyStartTs {
return errors.ErrStartTsBeforeGC.GenWithStackByArgs(ts)
}
if !errors.IsGCBarrierTSBehindTxnSafePointError(err) {
return errors.WrapError(errors.ErrUpdateGCBarrierFailed, err)
}
minBarrierTS, barrierErr := UnifyGetServiceGCSafepoint(ctx, pdCli, keyspaceID, serviceID)
if barrierErr != nil {
return barrierErr
}
if !errors.IsGCBarrierTSBehindTxnSafePointError(err) {
return errors.WrapError(errors.ErrUpdateGCBarrierFailed, err)
}
minBarrierTS, barrierErr := UnifyGetServiceGCSafepoint(ctx, pdCli, keyspaceID, serviceID)
if barrierErr != nil {
return barrierErr
}
if mode == serviceTsSafetyStartTs {
return errors.ErrStartTsBeforeGC.GenWithStackByArgs(ts, minBarrierTS)
}

Comment thread pkg/txnutil/gc/gc_service.go Outdated
}
case serviceTsSafetyExactTs:
if lowerBound != math.MaxUint64 && ts < lowerBound {
return errors.ErrSnapshotLostByGC.GenWithStackByArgs(ts+1, lowerBound)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

In serviceTsSafetyExactTs mode, the error should report the actual timestamp ts that was found to be lost. Using ts+1 is inconsistent with an 'exact' safety mode and likely stems from the startTs convention where startTs is expected to keep startTs-1 readable. For this new internal API, it's better to be explicit and report the requested timestamp.

Suggested change
return errors.ErrSnapshotLostByGC.GenWithStackByArgs(ts+1, lowerBound)
return errors.ErrSnapshotLostByGC.GenWithStackByArgs(ts, lowerBound)

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

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)
pkg/txnutil/gc/gc_service.go (1)

62-80: Duplicate safety check after ensureServiceGCSafetyClassic already validates.

ensureServiceGCSafetyClassic calls checkServiceTsSafety which performs the same ts < lowerBound+1 check (lines 155-157). The check at lines 76-78 is redundant and will never trigger because checkServiceTsSafety would have returned the error first.

♻️ Proposed fix to remove duplicate check
 func ensureChangefeedStartTsSafetyClassic(ctx context.Context, pdCli GCServiceClient, gcServiceID string, ttl int64, startTs uint64) error {
 	minServiceGCTs, err := ensureServiceGCSafetyClassic(ctx, pdCli, gcServiceID, ttl, startTs, serviceTsSafetyStartTs)
 	if err != nil {
 		return errors.Trace(err)
 	}
 	log.Info("set gc safepoint for changefeed",
 		zap.String("gcServiceID", gcServiceID),
 		zap.Uint64("expectedGCSafepoint", startTs),
 		zap.Uint64("actualGCSafepoint", minServiceGCTs),
 		zap.Int64("ttl", ttl))
-
-	// startTs should be greater than or equal to minServiceGCTs + 1, otherwise gcManager
-	// would return a ErrSnapshotLostByGC even though the changefeed would appear to be successfully
-	// created/resumed. See issue `#6350` for more detail.
-	if startTs > 0 && startTs < minServiceGCTs+1 {
-		return errors.ErrStartTsBeforeGC.GenWithStackByArgs(startTs, minServiceGCTs)
-	}
 	return nil
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/txnutil/gc/gc_service.go` around lines 62 - 80, The duplicate startTs
safety check in ensureChangefeedStartTsSafetyClassic is redundant because
ensureServiceGCSafetyClassic already invokes checkServiceTsSafety which enforces
the same "startTs < lowerBound+1" validation; remove the redundant if-block that
compares startTs with minServiceGCTs+1 and returns ErrStartTsBeforeGC (the
comparison and error return inside ensureChangefeedStartTsSafetyClassic),
leaving only the call to ensureServiceGCSafetyClassic and the logging, so
validation is centralized in checkServiceTsSafety/ensureServiceGCSafetyClassic.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@pkg/txnutil/gc/gc_service.go`:
- Around line 135-137: The branch checking mode == serviceTsSafetyStartTs
returns ErrStartTsBeforeGC with only ts, producing an inconsistent/partial
message compared to the other path which passes both ts and lowerBound; update
the branch in gc_service.go (the serviceTsSafetyStartTs check) to obtain the
current safe point (lowerBound) before returning and call
ErrStartTsBeforeGC.GenWithStackByArgs(ts, lowerBound) — or, if you intentionally
only have one value, switch both call sites to a single-argument variant so the
error format is consistent; ensure you reference ErrStartTsBeforeGC and
GenWithStackByArgs in the serviceTsSafetyStartTs branch when making the change.
- Around line 121-147: The current fragile string-based error classification
used by errors.IsGCBarrierTSBehindTxnSafePointError in
ensureServiceGCSafetyNextGen (after calling SetGCBarrier) should be replaced
with a structured check: inspect the PD gc client package
(github.com/tikv/pd/client/clients/gc) for a sentinel error value, exported
error type, or error code you can match with errors.Is or errors.As; update
errors.IsGCBarrierTSBehindTxnSafePointError to use that structured type/code (or
add a new helper that uses errors.As/Is against the PD error type), and then
change the branch in ensureServiceGCSafetyNextGen to rely on that robust check;
if the PD package lacks structured errors, add a small wrapper in your package
that normalizes PD errors into a sentinel error you can errors.Is against and
use that in the SetGCBarrier handling and in related helpers like
UnifyGetServiceGCSafepoint.

---

Nitpick comments:
In `@pkg/txnutil/gc/gc_service.go`:
- Around line 62-80: The duplicate startTs safety check in
ensureChangefeedStartTsSafetyClassic is redundant because
ensureServiceGCSafetyClassic already invokes checkServiceTsSafety which enforces
the same "startTs < lowerBound+1" validation; remove the redundant if-block that
compares startTs with minServiceGCTs+1 and returns ErrStartTsBeforeGC (the
comparison and error return inside ensureChangefeedStartTsSafetyClassic),
leaving only the call to ensureServiceGCSafetyClassic and the logging, so
validation is centralized in checkServiceTsSafety/ensureServiceGCSafetyClassic.
🪄 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

Run ID: 7ac9fedf-3164-463f-9d80-fbe07c79361c

📥 Commits

Reviewing files that changed from the base of the PR and between 91fd985 and c3e87a4.

📒 Files selected for processing (3)
  • logservice/schemastore/gc_keeper.go
  • logservice/schemastore/gc_keeper_test.go
  • pkg/txnutil/gc/gc_service.go

Comment thread pkg/txnutil/gc/gc_service.go Outdated
Comment on lines +121 to +147
func ensureServiceGCSafetyNextGen(
ctx context.Context,
pdCli GCServiceClient,
serviceID string,
keyspaceID uint32,
ttl int64,
ts uint64,
mode serviceTsSafetyMode,
) error {
gcCli := pdCli.GetGCStatesClient(keyspaceID)
_, err := SetGCBarrier(ctx, gcCli, serviceID, ts, time.Duration(ttl)*time.Second)
if err == nil {
return nil
}
if mode == serviceTsSafetyStartTs {
return errors.ErrStartTsBeforeGC.GenWithStackByArgs(ts)
}
if !errors.IsGCBarrierTSBehindTxnSafePointError(err) {
return errors.WrapError(errors.ErrUpdateGCBarrierFailed, err)
}

minBarrierTS, barrierErr := UnifyGetServiceGCSafepoint(ctx, pdCli, keyspaceID, serviceID)
if barrierErr != nil {
return barrierErr
}
return checkServiceTsSafety(mode, ts, minBarrierTS)
}
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.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Search for how ErrGCBarrierTSBehindTxnSafePoint is defined/used in the pd client
rg -n "ErrGCBarrierTSBehindTxnSafePoint" --type go

Repository: pingcap/ticdc

Length of output: 361


🏁 Script executed:

# First, let's examine the pb_error.go file to see the exact implementation
cat -n pkg/errors/pb_error.go | head -50

Repository: pingcap/ticdc

Length of output: 1314


🏁 Script executed:

# Check if there are typed errors or error codes for this scenario
rg -n "GCBarrier" --type go -A 3 -B 3 | head -80

Repository: pingcap/ticdc

Length of output: 5248


🏁 Script executed:

# Search for how this error is created in PD client or related code
rg -n "IsGCBarrierTSBehindTxnSafePointError" --type go -B 5 -A 2

Repository: pingcap/ticdc

Length of output: 1765


🏁 Script executed:

# Check if there are error codes or typed errors in the errors package
fd "errors" -t f --type go | xargs rg -l "type.*Error" | head -10

Repository: pingcap/ticdc

Length of output: 525


🏁 Script executed:

# Check imports and how PD errors are typically handled
cat -n pkg/txnutil/gc/gc_service.go | grep -E "import|pdpb" -A 20 | head -30

Repository: pingcap/ticdc

Length of output: 881


🏁 Script executed:

# Search for SetGCBarrier implementation to understand what error types are returned
rg -n "func SetGCBarrier" --type go -A 10

Repository: pingcap/ticdc

Length of output: 957


🏁 Script executed:

# Look for how other similar error checks are structured in the codebase
rg -n "IsKeyspaceNotExistError\|IsGCBarrier" --type go -B 2 -A 2

Repository: pingcap/ticdc

Length of output: 39


🏁 Script executed:

# Check if there's a pattern of using error codes or typed errors in PD interactions
rg -n "pdpb\." pkg/txnutil/gc/gc_service.go | head -20

Repository: pingcap/ticdc

Length of output: 39


🏁 Script executed:

# Check if pdgc (PD GC client) errors are typically handled with string matching or typed errors
rg -n "pdgc\|gc\.GCStatesClient" --type go -B 3 -A 5 | head -60

Repository: pingcap/ticdc

Length of output: 39


🏁 Script executed:

# Look at the full SetGCBarrier function to see if errors from PD are wrapped
cat -n pkg/txnutil/gc/gc_service.go | sed -n '246,270p'

Repository: pingcap/ticdc

Length of output: 1354


🏁 Script executed:

# Search for any documentation or patterns on how to handle PD errors
rg -n "github.com/tikv/pd" --type go | head -20

Repository: pingcap/ticdc

Length of output: 1385


🏁 Script executed:

# Check if there are any error codes or error types available from pd client
rg -n "Error\|Code" pkg/txnutil/gc/gc_service.go | head -15

Repository: pingcap/ticdc

Length of output: 39


🏁 Script executed:

# Check if PD errors have typed error support or codes
rg -n "pdgc\." pkg/txnutil/gc/gc_service.go

Repository: pingcap/ticdc

Length of output: 436


🏁 Script executed:

# Look at the error types available from PD gc client
find . -name "*.go" -path "*/vendor/*" -prune -o -type f -name "*.go" -exec grep -l "github.com/tikv/pd/client/clients/gc" {} \; | head -10

Repository: pingcap/ticdc

Length of output: 423


🏁 Script executed:

# Search for how other parts of the codebase handle PD gc errors
rg -n "SetGCBarrier\|DeleteGCBarrier\|GetGCState" --type go -B 3 -A 8 | grep -A 8 "err" | head -50

Repository: pingcap/ticdc

Length of output: 39


🏁 Script executed:

# Check if the error from PD is wrapped anywhere else
rg -n "SetGCBarrier" pkg/txnutil/gc/ --type go -B 2 -A 15 | head -80

Repository: pingcap/ticdc

Length of output: 5604


String-based error classification is fragile; consider exploring if PD provides error codes or structured error types.

At line 138, the code uses errors.IsGCBarrierTSBehindTxnSafePointError(err) which relies on string matching via strings.Contains(err.Error(), "ErrGCBarrierTSBehindTxnSafePoint") to classify errors returned from the PD client. This is fragile if the error message changes in future PD versions.

Verify with the PD library maintainers whether github.com/tikv/pd/client/clients/gc provides error codes or structured error types (e.g., error codes, sentinel error values, or error interfaces) that could replace string matching for more robust error classification.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/txnutil/gc/gc_service.go` around lines 121 - 147, The current fragile
string-based error classification used by
errors.IsGCBarrierTSBehindTxnSafePointError in ensureServiceGCSafetyNextGen
(after calling SetGCBarrier) should be replaced with a structured check: inspect
the PD gc client package (github.com/tikv/pd/client/clients/gc) for a sentinel
error value, exported error type, or error code you can match with errors.Is or
errors.As; update errors.IsGCBarrierTSBehindTxnSafePointError to use that
structured type/code (or add a new helper that uses errors.As/Is against the PD
error type), and then change the branch in ensureServiceGCSafetyNextGen to rely
on that robust check; if the PD package lacks structured errors, add a small
wrapper in your package that normalizes PD errors into a sentinel error you can
errors.Is against and use that in the SetGCBarrier handling and in related
helpers like UnifyGetServiceGCSafepoint.

Comment thread pkg/txnutil/gc/gc_service.go Outdated
@lidezhu lidezhu changed the title [WIP] schemastore,gc: use generic service-ts safety helper for GC keeper Apr 1, 2026
@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 Apr 1, 2026
@lidezhu lidezhu changed the title schemastore,gc: use generic service-ts safety helper for GC keeper schemastore,gc: switch GC keeper to generic service-ts safety path Apr 1, 2026
@ti-chi-bot
Copy link
Copy Markdown

ti-chi-bot Bot commented Apr 1, 2026

[FORMAT CHECKER NOTIFICATION]

Notice: To remove the do-not-merge/needs-linked-issue label, please provide the linked issue number on one line in the PR body, for example: Issue Number: close #123 or Issue Number: ref #456.

📖 For more info, you can check the "Contribute Code" section in the development guide.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
pkg/txnutil/gc/gc_service.go (1)

111-113: Please lock in the equality boundary with tests.

Both branches now intentionally allow ts == lowerBound and only fail on ts < lowerBound, while the returned error reports ts+1. That off-by-one is subtle enough that an explicit equality test would help prevent regressions.

Also applies to: 138-140

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/txnutil/gc/gc_service.go` around lines 111 - 113, The conditional that
checks "if minServiceGCTs != math.MaxUint64 && ts < minServiceGCTs" allows ts ==
minServiceGCTs but the error uses ts+1, so add an explicit equality assertion in
both places (the existing block and the similar block around lines 138-140) and
update tests to cover the boundary: add unit tests that call the code path with
ts == minServiceGCTs (should succeed) and ts == minServiceGCTs-1 (should produce
errors.ErrSnapshotLostByGC with the exact expected argument), ensuring the
returned GenWithStackByArgs value matches the intended lower-bound semantics.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@pkg/txnutil/gc/gc_service.go`:
- Around line 111-113: The conditional that checks "if minServiceGCTs !=
math.MaxUint64 && ts < minServiceGCTs" allows ts == minServiceGCTs but the error
uses ts+1, so add an explicit equality assertion in both places (the existing
block and the similar block around lines 138-140) and update tests to cover the
boundary: add unit tests that call the code path with ts == minServiceGCTs
(should succeed) and ts == minServiceGCTs-1 (should produce
errors.ErrSnapshotLostByGC with the exact expected argument), ensuring the
returned GenWithStackByArgs value matches the intended lower-bound semantics.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 432706a8-1b2a-4e8a-a323-eb1063b79902

📥 Commits

Reviewing files that changed from the base of the PR and between c3e87a4 and cebf5b0.

📒 Files selected for processing (1)
  • pkg/txnutil/gc/gc_service.go

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

do-not-merge/needs-linked-issue release-note Denotes a PR that will be considered when it comes time to generate release notes. size/L Denotes a PR that changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant