Skip to content

core: region heartbeat with bucket meta#10231

Merged
ti-chi-bot[bot] merged 8 commits intotikv:release-nextgen-20251011from
bufferflies:release-nextgen-20251011
Feb 12, 2026
Merged

core: region heartbeat with bucket meta#10231
ti-chi-bot[bot] merged 8 commits intotikv:release-nextgen-20251011from
bufferflies:release-nextgen-20251011

Conversation

@bufferflies
Copy link
Copy Markdown
Contributor

@bufferflies bufferflies commented Feb 9, 2026

What problem does this PR solve?

Issue Number: Ref #10117
CP: #10120

What is changed and how does it work?

Check List

Tests

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

Code changes

Side effects

  • Possible performance regression
  • Increased code complexity
  • Breaking backward compatibility

Related changes

Release note

None.

Summary by CodeRabbit

  • New Features

    • Regions can carry bucket metadata and preserve it during creation, cloning, and access via a new region option.
  • Bug Fixes

    • Region updates now respect bucket-version transitions to prevent stale or overwritten bucket info.
    • Sync behavior adjusted to avoid unintended bucket updates during certain synchronization paths.
  • Tests

    • Added tests covering bucket metadata inheritance, stale metadata handling, splits, propagation, and minor test message improvements.

Signed-off-by: tongjian <1045931706@qq.com>
@ti-chi-bot ti-chi-bot bot added do-not-merge/cherry-pick-not-approved release-note-none Denotes a PR that doesn't merit a release note. dco-signoff: yes Indicates the PR's author has signed the dco. labels Feb 9, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Feb 9, 2026

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 bucket metadata tracking: RegionInfo gains a bucketMeta field; heartbeats expose GetBucketMeta; constructors, clone, inherit, getters, and region-guide logic updated to use bucketMeta; syncer no longer applies post-PutRegion bucket updates; tests added and several go.mod files bump github.com/pingcap/kvproto.

Changes

Cohort / File(s) Summary
Dependency Updates
client/go.mod, go.mod, tests/integrations/go.mod, tools/go.mod
Bumped github.com/pingcap/kvproto to v0.0.0-20260106110113-438649d89ee7.
Core Region Bucket Metadata
pkg/core/region.go, pkg/core/region_option.go
Added bucketMeta *metapb.BucketMeta to RegionInfo; added GetBucketMeta() to RegionHeartbeatRequest; RegionFromHeartbeat, Inherit, Clone, GetBuckets, and region-guide logic updated to consult/propagate bucketMeta. Added WithBucketMeta(bucketMeta *metapb.BucketMeta) option and adjusted SetBuckets behavior.
Syncer changes
pkg/syncer/client.go
Removed the post-PutRegion bucket-update block; syncer no longer applies bucket updates after PutRegion.
Tests and test utilities
pkg/core/region_test.go, server/cluster/cluster_test.go, tests/server/region_syncer/region_syncer_test.go, tests/testutil.go
Added TestGetBucketMeta and TestStaleBucketMeta; updated test assertions/messages; InitRegions now uses WithBucketMeta(meta) for first-half regions and creates fresh regions for second-half to represent mixed bucket/meta states.

Sequence Diagram

sequenceDiagram
    participant Client as Client/Heartbeat
    participant Region as RegionInfo
    participant Syncer as Syncer/Cluster
    participant Guide as RegionGuide

    Client->>Region: RegionFromHeartbeat(hb)
    activate Region
    Region->>Client: hb.GetBucketMeta()
    Client-->>Region: *metapb.BucketMeta
    Region->>Region: attach bucketMeta to RegionInfo
    deactivate Region

    Syncer->>Region: Receive region update / PutRegion
    activate Syncer
    Note right of Syncer: Previously updated buckets after PutRegion (now removed)
    Syncer->>Region: GetBuckets() / GetBucketMeta()
    Syncer-->>Region: keep existing buckets (no post-PutRegion update)
    deactivate Syncer

    Region->>Guide: GenerateRegionGuideFunc()
    activate Guide
    Guide->>Guide: compare old vs new bucket versions (including 0→non-zero)
    alt version changed
        Guide->>Guide: mark region for update / log change
    end
    deactivate Guide
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested labels

size/M

Suggested reviewers

  • lhy1024

Poem

🐇 I hop on heartbeats and hold bucket lore,
I tuck versions gently by the core,
When meta arrives I whisper, "stay,"
Yet when it changes I nudge the way,
A joyful hop for regions evermore.

🚥 Pre-merge checks | ✅ 1 | ❌ 2
❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Description check ⚠️ Warning The PR description is incomplete. While it includes an issue reference and acknowledges related PRs, it lacks critical sections: no commit-message body, no clear explanation of what changed and how it works, and several checklist items remain unchecked or incomplete. Provide a detailed commit-message body explaining the implementation, check appropriate items in the checklist (especially which tests were added), and clarify what problem this PR solves.
Docstring Coverage ⚠️ Warning Docstring coverage is 53.33% 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 'core: region heartbeat with bucket meta' clearly and specifically describes the main change: adding bucket metadata support to region heartbeat handling in the core package.

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

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


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.

@ti-chi-bot ti-chi-bot bot added the size/L Denotes a PR that changes 100-499 lines, ignoring generated files. label Feb 9, 2026
@ti-chi-bot ti-chi-bot bot added needs-1-more-lgtm Indicates a PR needs 1 more LGTM. approved labels Feb 9, 2026
Signed-off-by: tongjian <1045931706@qq.com>
@codecov
Copy link
Copy Markdown

codecov bot commented Feb 9, 2026

Codecov Report

❌ Patch coverage is 86.20690% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 78.69%. Comparing base (14fe15c) to head (b07c34d).
⚠️ Report is 3 commits behind head on release-nextgen-20251011.

Additional details and impacted files
@@                     Coverage Diff                      @@
##           release-nextgen-20251011   #10231      +/-   ##
============================================================
- Coverage                     78.73%   78.69%   -0.04%     
============================================================
  Files                           491      491              
  Lines                         66124    66341     +217     
============================================================
+ Hits                          52060    52209     +149     
- Misses                        10308    10380      +72     
+ Partials                       3756     3752       -4     
Flag Coverage Δ
unittests 78.69% <86.20%> (-0.04%) ⬇️

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.

@ti-chi-bot ti-chi-bot bot added lgtm and removed needs-1-more-lgtm Indicates a PR needs 1 more LGTM. labels Feb 9, 2026
@ti-chi-bot
Copy link
Copy Markdown
Contributor

ti-chi-bot bot commented Feb 9, 2026

[LGTM Timeline notifier]

Timeline:

  • 2026-02-09 07:49:43.443231005 +0000 UTC m=+171199.137370855: ☑️ agreed by lhy1024.
  • 2026-02-09 09:23:03.250077026 +0000 UTC m=+176798.944216856: ☑️ agreed by okJiang.

@bufferflies
Copy link
Copy Markdown
Contributor Author

/retest

1 similar comment
@bufferflies
Copy link
Copy Markdown
Contributor Author

/retest

@bufferflies
Copy link
Copy Markdown
Contributor Author

/retest-required

@rleungx
Copy link
Copy Markdown
Member

rleungx commented Feb 11, 2026

@coderabbitai full review

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Feb 11, 2026

✅ Actions performed

Full review triggered.

Copy link
Copy Markdown

@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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
pkg/syncer/client.go (1)

222-245: ⚠️ Potential issue | 🔴 Critical

Data race: SetBucketMeta is called after the region is already stored in the shared cache.

On Line 239, bc.PutRegion(region) makes the region visible to other goroutines. Then on Line 244, region.SetBucketMeta(buckets[i]) mutates the region's bucketMeta field without synchronization, while other goroutines may concurrently call GetBuckets() (which reads bucketMeta).

The simplest fix is to set bucketMeta during construction via the WithBucketMeta option (before PutRegion), keeping it consistent with how SetBuckets is already handled:

🐛 Proposed fix to eliminate the data race
 				if hasBuckets {
 					opts = append(opts, core.SetBuckets(buckets[i]))
+					opts = append(opts, core.WithBucketMeta(&metapb.BucketMeta{
+						Version: buckets[i].GetVersion(),
+						Keys:    buckets[i].GetKeys(),
+					}))
 				}
 				region = core.NewRegionInfo(r, regionLeader, opts...)

And remove or guard the post-PutRegion SetBucketMeta call:

 				if hasBuckets {
 					if old := origin.GetBuckets(); buckets[i].GetVersion() > old.GetVersion() {
 						region.UpdateBuckets(buckets[i], old)
-						region.SetBucketMeta(buckets[i])
 					}
 				}
pkg/core/region.go (1)

207-222: ⚠️ Potential issue | 🔴 Critical

Add BucketMeta field to the scheduling service forwarding request at line 1414.

The interface now requires GetBucketMeta(), and RegionFromHeartbeat() calls it at line 250. However, the forwarding code in server/grpc_service.go (lines 1414–1433) constructs schedulingpbReq without the BucketMeta field. This causes bucket metadata from the original heartbeat to be silently dropped when forwarding to the scheduling service.

Missing field in forward request
schedulingpbReq := &schedulingpb.RegionHeartbeatRequest{
    // ... existing fields ...
    QueryStats:      request.GetQueryStats(),
    // Missing: BucketMeta field assignment
}

Add: BucketMeta: request.GetBucketMeta(),

🤖 Fix all issues with AI agents
In `@pkg/core/region_test.go`:
- Around line 1460-1461: Replace the truncated comment "// Inherit false if
region" with a complete sentence that explains the expected behavior in this
test: e.g., "Inherit should not override buckets when region has bucketMeta
set." Reference the test target by name (region) and the assertions using
region.GetBuckets().GetVersion() so readers understand this assertion verifies
that Inherit does not modify bucket metadata/version for a region that already
has bucketMeta.

In `@pkg/core/region.go`:
- Around line 617-623: SetBucketMeta writes the plain pointer field bucketMeta
on RegionInfo without synchronization, causing a data race when GetBuckets or
other readers access bucketMeta concurrently (e.g., after bc.PutRegion(region)).
Fix by making bucketMeta an atomic pointer (e.g.,
atomic.Pointer[metapb.BucketMeta] or unsafe.Pointer with
atomic.StorePointer/atomic.LoadPointer) and update SetBucketMeta to use atomic
store and GetBuckets to use atomic load; alternatively, ensure callers set
bucketMeta before calling PutRegion (update syncer path where SetBucketMeta is
invoked) so no concurrent readers observe a non-atomic write. Ensure references
to bucketMeta in RegionInfo, SetBucketMeta, and GetBuckets are updated
consistently.
🧹 Nitpick comments (2)
pkg/core/region.go (1)

645-651: GetBuckets() allocates a new metapb.Buckets on every call when bucketMeta is set.

This is called repeatedly in hot paths — for example, Line 912 calls GetBuckets() four times within GenerateRegionGuideFunc (executed per heartbeat). Each call allocates a new struct.

At minimum, cache the result in local variables at Line 912:

♻️ Suggested optimization in GenerateRegionGuideFunc
-			if region.GetBuckets().GetVersion() > origin.GetBuckets().GetVersion() || (region.GetBuckets().GetVersion() == 0 && origin.GetBuckets().GetVersion() > 0) {
+			regionBuckets := region.GetBuckets()
+			originBuckets := origin.GetBuckets()
+			if regionBuckets.GetVersion() > originBuckets.GetVersion() || (regionBuckets.GetVersion() == 0 && originBuckets.GetVersion() > 0) {
 				if log.GetLevel() <= zap.DebugLevel {
 					debug("bucket key changed",
 						zap.Uint64("region-id", region.GetID()),
-						zap.Uint64("old-bucket-version", origin.GetBuckets().GetVersion()),
-						zap.Uint64("new-bucket-version", region.GetBuckets().GetVersion()))
+						zap.Uint64("old-bucket-version", originBuckets.GetVersion()),
+						zap.Uint64("new-bucket-version", regionBuckets.GetVersion()))
 				}
server/cluster/cluster_test.go (1)

620-654: Consider strengthening assertions and testing the "stale" path.

  1. Line 653 only asserts re.NotEqual(bucket1, region1.GetBuckets()) — a negative check. Consider also asserting the expected state (e.g., the new bucket version) to catch regressions more precisely.

  2. The test name is TestStaleBucketMeta, but it only tests that a newer bucket meta (v3) replaces old buckets (v2). It doesn't verify that a stale (older version) bucket meta is correctly rejected. Adding that scenario would match the test name and increase coverage.

💡 Suggested additions
 	region1 := cluster.GetRegion(1)
 	re.NotEqual(bucket1, region1.GetBuckets())
+	re.Equal(uint64(3), region1.GetBuckets().GetVersion())
+
+	// Stale bucket meta (version < current) should not overwrite
+	staleBucketMeta := &metapb.BucketMeta{
+		Version: 1,
+		Keys:    [][]byte{{'c'}, {'d'}},
+	}
+	region3 := region2.Clone(core.WithIncVersion(), core.WithBucketMeta(staleBucketMeta))
+	re.NoError(cluster.processRegionHeartbeat(core.ContextTODO(), region3))
+	re.Equal(uint64(3), cluster.GetRegion(1).GetBuckets().GetVersion())
 }

@ti-chi-bot ti-chi-bot bot added do-not-merge/cherry-pick-not-approved size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. and removed size/L Denotes a PR that changes 100-499 lines, ignoring generated files. approved labels Feb 11, 2026
@bufferflies bufferflies force-pushed the release-nextgen-20251011 branch from a789c5e to a1f2b2c Compare February 11, 2026 07:08
@ti-chi-bot ti-chi-bot bot added the approved label Feb 11, 2026
@bufferflies
Copy link
Copy Markdown
Contributor Author

@coderabbitai full review

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Feb 11, 2026

✅ Actions performed

Full review triggered.

@bufferflies
Copy link
Copy Markdown
Contributor Author

/retest

Copy link
Copy Markdown

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
client/go.mod (1)

3-13: ⚠️ Potential issue | 🟠 Major

Update the go directive to 1.25+ to match CI requirements.

The client module targets Go 1.23.12, but CI and the coding guidelines require Go 1.25 or higher. Update the go directive and run make tidy to ensure go.mod/go.sum remain clean.

🔧 Suggested update
-go 1.23.12
+go 1.25.0
🧹 Nitpick comments (2)
server/cluster/cluster_test.go (1)

620-654: Make the stale-bucket assertion explicit.

re.NotEqual(bucket1, region1.GetBuckets()) could pass if buckets are nil or unrelated. Assert the expected version/keys so the test fails only when the update is missing.

✅ Suggested assertion tightening
-	re.NotEqual(bucket1, region1.GetBuckets())
+	re.Equal(uint64(3), region1.GetBuckets().GetVersion())
+	re.Equal(bucket2.GetKeys(), region1.GetBuckets().GetKeys())
pkg/core/region.go (1)

637-643: GetBuckets() allocates a new metapb.Buckets on every call when bucketMeta is set.

This method is called on hot paths (heartbeat guide function, query regions). Each invocation with a non-nil bucketMeta creates a heap allocation. Consider caching the derived *metapb.Buckets in the struct at construction time (e.g., in RegionFromHeartbeat and Clone) instead of rebuilding it on every read.

♻️ Suggested approach

Populate a buckets field from bucketMeta once during construction in RegionFromHeartbeat:

 	region := &RegionInfo{
 		...
 		bucketMeta:       heartbeat.GetBucketMeta(),
 	}
+	if region.bucketMeta != nil {
+		b := &metapb.Buckets{
+			RegionId: region.GetID(),
+			Version:  region.bucketMeta.GetVersion(),
+			Keys:     region.bucketMeta.GetKeys(),
+		}
+		atomic.StorePointer(&region.buckets, unsafe.Pointer(b))
+	}

Then GetBuckets() can simply use the existing atomic load path without the per-call allocation branch.

Based on learnings: "Mind allocations; reuse buffers/pools where appropriate"

@bufferflies
Copy link
Copy Markdown
Contributor Author

/retest

@rleungx
Copy link
Copy Markdown
Member

rleungx commented Feb 11, 2026

/hold cancel

@ti-chi-bot ti-chi-bot bot removed the do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. label Feb 11, 2026
@rleungx
Copy link
Copy Markdown
Member

rleungx commented Feb 11, 2026

test failed

Signed-off-by: bufferflies <1045931706@qq.com>
@bufferflies
Copy link
Copy Markdown
Contributor Author

@coderabbitai full review

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Feb 12, 2026

✅ Actions performed

Full review triggered.

Copy link
Copy Markdown

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

🤖 Fix all issues with AI agents
In `@pkg/core/region_option.go`:
- Around line 240-252: SetBuckets currently assigns &metapb.BucketMeta{} when
buckets==nil which leaves region.bucketMeta non-nil and breaks GetBuckets
nil-checks; change SetBuckets to set region.bucketMeta = nil when buckets ==
nil. Additionally, update the Inherit logic (the code that copies bucketMeta
from another RegionInfo) to explicitly clear bucketMeta when bucketEnable ==
false (set r.bucketMeta = nil and clear any derived/atomic r.buckets state if
applicable) so disabling buckets removes stale empty structs.
🧹 Nitpick comments (2)
pkg/core/region.go (1)

637-643: GetBuckets() allocates a new *metapb.Buckets on every call when bucketMeta is set.

This method is called in hot paths (e.g., GenerateRegionGuideFunc, QueryRegions, sortOutKeyIDMap). Each invocation with a non-nil bucketMeta creates a heap-allocated struct. Consider caching the constructed Buckets at region-creation time (e.g., in RegionFromHeartbeat or via the WithBucketMeta option) instead of rebuilding it on every read.

♻️ Sketch: pre-compute buckets from bucketMeta at construction time

For example, in RegionFromHeartbeat (and analogously in WithBucketMeta):

+	if region.bucketMeta != nil {
+		region.buckets = unsafe.Pointer(&metapb.Buckets{
+			RegionId: region.GetID(),
+			Version:  region.bucketMeta.GetVersion(),
+			Keys:     region.bucketMeta.GetKeys(),
+		})
+	}

Then GetBuckets can simply return the atomic-loaded pointer without branching on bucketMeta:

 func (r *RegionInfo) GetBuckets() *metapb.Buckets {
 	if r == nil {
 		return nil
 	}
-	if meta := r.bucketMeta; meta != nil {
-		return &metapb.Buckets{
-			RegionId: r.GetID(),
-			Version:  meta.GetVersion(),
-			Keys:     meta.GetKeys(),
-		}
-	}
 	buckets := atomic.LoadPointer(&r.buckets)
 	return (*metapb.Buckets)(buckets)
 }

This also eliminates the unsynchronized read of bucketMeta flagged in the previous review.

server/cluster/cluster_test.go (1)

620-654: Test only asserts inequality — consider verifying the expected bucket state.

Line 653 checks re.NotEqual(bucket1, region1.GetBuckets()) but doesn't assert what region1.GetBuckets() should be after the heartbeat with bucket2. A positive assertion (e.g., verifying the version or keys match bucket2) would make the test more robust against false passes.

@bufferflies
Copy link
Copy Markdown
Contributor Author

@coderabbitai full review

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Feb 12, 2026

✅ Actions performed

Full review triggered.

Copy link
Copy Markdown

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
go.mod (1)

3-3: ⚠️ Potential issue | 🟠 Major

Update Go version directive to 1.25+ across all modules.

The root go.mod and all submodules (client/, tools/, tests/integrations/) are still at go 1.23.12, which violates the project guideline requiring Go 1.25+. CI uses Go 1.25. Update all four go.mod files to 1.25, and run make tidy to clean up the dependency tree (go.sum currently contains multiple kvproto versions).

Suggested fix for root go.mod
-go 1.23.12
+go 1.25

Apply the same change to: client/go.mod, tools/go.mod, tests/integrations/go.mod

🧹 Nitpick comments (2)
server/cluster/cluster_test.go (1)

620-654: Assert expected bucket2 values for stronger coverage.
Right now the test only checks bucket1 != current; asserting the version/keys match bucket2 reduces false positives.

Suggested enhancement
 region1 := cluster.GetRegion(1)
 re.NotEqual(bucket1, region1.GetBuckets())
+re.Equal(bucket2.GetVersion(), region1.GetBuckets().GetVersion())
+re.Equal(bucket2.GetKeys(), region1.GetBuckets().GetKeys())
pkg/core/region.go (1)

642-648: GetBuckets() allocates a new metapb.Buckets on every call when bucketMeta is set — hot-path allocation concern.

This method is called on every heartbeat path (e.g., GenerateRegionGuideFunc calls it for both new and origin regions). Each invocation with a non-nil bucketMeta allocates a fresh Buckets struct. Consider caching the constructed Buckets in the RegionInfo (e.g., populate it once during construction/clone) or returning a read-only view to avoid per-call allocation on this hot path.

♻️ Sketch: pre-compute buckets from bucketMeta at construction time

One approach: when bucketMeta is set (in RegionFromHeartbeat, Clone, Inherit, option), also store the corresponding *metapb.Buckets in the existing buckets field via unsafe.Pointer, so GetBuckets() can always use the zero-allocation atomic load path.

 func (r *RegionInfo) GetBuckets() *metapb.Buckets {
 	if r == nil {
 		return nil
 	}
-	if meta := r.bucketMeta; meta != nil {
-		return &metapb.Buckets{
-			RegionId: r.GetID(),
-			Version:  meta.GetVersion(),
-			Keys:     meta.GetKeys(),
-		}
-	}
 	buckets := atomic.LoadPointer(&r.buckets)
 	return (*metapb.Buckets)(buckets)
 }

Then ensure that whenever bucketMeta is set, the buckets unsafe.Pointer is also atomically stored with the derived value.

Based on learnings: "Mind allocations; reuse buffers/pools where appropriate".

Signed-off-by: bufferflies <1045931706@qq.com>
@bufferflies bufferflies force-pushed the release-nextgen-20251011 branch from cf21a32 to b07c34d Compare February 12, 2026 04:26
@bufferflies
Copy link
Copy Markdown
Contributor Author

/retest

@rleungx
Copy link
Copy Markdown
Member

rleungx commented Feb 12, 2026

@coderabbitai full review

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Feb 12, 2026

✅ Actions performed

Full review triggered.

Copy link
Copy Markdown

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
tools/go.mod (1)

3-3: ⚠️ Potential issue | 🟠 Major

Update the go directive to 1.25 and re-tidy this module.

This module declares go 1.23.12 but policy requires 1.25+. After the kvproto dependency bump on line 26, run make tidy to ensure go.sum stays clean.

tests/integrations/go.mod (1)

3-3: ⚠️ Potential issue | 🟠 Major

Update the Go version directive and re-tidy this module.

Line 3 declares go 1.23.12; policy requires Go 1.25+. After the kvproto dependency update at line 17, run make tidy to ensure go.mod and go.sum stay clean.

client/go.mod (1)

3-3: ⚠️ Potential issue | 🟠 Major

Update the go directive to 1.25 or higher and re-tidy this module.

This module declares go 1.23.12 but policy requires Go 1.25+. After the kvproto dependency bump, run make tidy and ensure go.sum stays clean.

go.mod (1)

3-3: ⚠️ Potential issue | 🟠 Major

Update the go directive and re‑tidy this module.

This module still declares go 1.23.12; policy requires 1.25+. After the kvproto bump, please run make tidy for this module and ensure go.sum stays clean.

@bufferflies
Copy link
Copy Markdown
Contributor Author

/test pull-unit-test-next-gen-1

@ti-chi-bot ti-chi-bot bot merged commit fb55f2c into tikv:release-nextgen-20251011 Feb 12, 2026
35 of 37 checks passed
@bufferflies bufferflies deleted the release-nextgen-20251011 branch February 26, 2026 11:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved cherry-pick-approved Cherry pick PR approved by release team. dco-signoff: yes Indicates the PR's author has signed the dco. lgtm release-note-none Denotes a PR that doesn't merit a release note. 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.

4 participants