Skip to content

pkg/ttl: split timer sync tests into integrationtest#66866

Open
hawkingrei wants to merge 2 commits intopingcap:masterfrom
hawkingrei:split-ttlworker-timer-sync-tests
Open

pkg/ttl: split timer sync tests into integrationtest#66866
hawkingrei wants to merge 2 commits intopingcap:masterfrom
hawkingrei:split-ttlworker-timer-sync-tests

Conversation

@hawkingrei
Copy link
Member

@hawkingrei hawkingrei commented Mar 10, 2026

What problem does this PR solve?

Issue Number: None

Problem Summary:

  • The pkg/ttl/ttlworker test target has accumulated many tests.
  • timer_sync_test.go is a low-risk candidate to move first because it depends only on a small pair of local helpers and exported ttlworker APIs.

What changed and how does it work?

  • Move pkg/ttl/ttlworker/timer_sync_test.go into pkg/ttl/ttlworker/integrationtest/timer_sync_test.go.
  • Add pkg/ttl/ttlworker/integrationtest/helpers_test.go to keep the moved test self-contained.
  • Add a dedicated Bazel target for the new test directory and remove the moved file and now-unused deps from pkg/ttl/ttlworker/BUILD.bazel.

Check List

Tests

  • Unit test
  • Integration test
  • Manual test (add detailed scripts or steps below)
  • No need to test
    • I checked and no code files have been changed.

Test commands:

  • make bazel_prepare
  • make failpoint-enable
  • go test -run TestValidateTTLWork -tags=intest,deadlock -vet=off ./pkg/ttl/ttlworker
  • go test -run 'TestTTLManualTriggerOneTimer|TestTTLTimerSync' -tags=intest,deadlock -vet=off ./pkg/ttl/ttlworker/integrationtest
  • make failpoint-disable
  • make lint

Side effects

  • Performance regression: Consumes more CPU
  • Performance regression: Consumes more Memory
  • Breaking backward compatibility

Documentation

  • Affects user behaviors
  • Contains syntax changes
  • Contains variable changes
  • Contains experimental features
  • Changes MySQL compatibility

Release note

Please refer to Release Notes Language Style Guide to write a quality release note.

None

Summary by CodeRabbit

  • Tests
    • Reorganized TTL worker tests into a dedicated integration suite with increased parallelism, race detection, and flaky handling.
    • Added integration test helpers to improve reliability and session management assertions.
    • Removed duplicate/obsolete test entries and simplified test composition and dependencies.

@ti-chi-bot ti-chi-bot bot added do-not-merge/needs-linked-issue release-note-none Denotes a PR that doesn't merit a release note. labels Mar 10, 2026
@pantheon-ai
Copy link

pantheon-ai bot commented Mar 10, 2026

Review failed due to infrastructure/execution failure after retries. Please re-trigger review.

ℹ️ Learn more details on Pantheon AI.

@ti-chi-bot ti-chi-bot bot added the size/L Denotes a PR that changes 100-499 lines, ignoring generated files. label Mar 10, 2026
@coderabbitai
Copy link

coderabbitai bot commented Mar 10, 2026

📝 Walkthrough

Walkthrough

Reorganized TTL worker tests: removed timer_sync_test.go and some test deps from the main test target, and added a new integration test package with helpers and targeted integration tests for ManagerJobAdapter, moving relevant test files into pkg/ttl/ttlworker/integrationtest.

Changes

Cohort / File(s) Summary
Main Test Target
pkg/ttl/ttlworker/BUILD.bazel
Removed timer_sync_test.go from ttlworker_test srcs and dropped //pkg/meta/metadef and //pkg/util/mock deps.
Integration Test Target
pkg/ttl/ttlworker/integrationtest/BUILD.bazel
Added new go_test rule integrationtest_test with helpers_test.go, manager_job_adapter_test.go, timer_sync_test.go; configured timeout, flaky, race="on", shard_count=6, and added internal and external deps.
Integration Test Helpers
pkg/ttl/ttlworker/integrationtest/helpers_test.go
Added helper utilities: waitAndStopTTLManager, poolTestWrapper (wraps syssession.Pool with an in-use counter), wrapPoolForTest, and AssertNoSessionInUse.
Integration Tests
pkg/ttl/ttlworker/integrationtest/manager_job_adapter_test.go
New integration tests for ManagerJobAdapter covering CanSubmitJob, SubmitJob, GetJob, and Now behaviors; uses mock stores, SQL setup, and channel-based synchronization.
Removed Tests (moved)
pkg/ttl/ttlworker/job_manager_integration_test.go
Deleted four ManagerJobAdapter test functions (moved to the new integration package).

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested reviewers

  • lance6716

Poem

🐰 Hopped the tests to a brand new lane,
Helpers ready, checks in train.
Sessions counted, timers sing,
Manager jobs take wing—zings! ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately and concisely describes the main change: moving timer sync tests from the main package into an integrationtest subdirectory.
Description check ✅ Passed The description follows the template structure with clear problem statement, detailed explanation of changes, comprehensive test commands, and appropriate checkboxes marked.

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

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

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 golangci-lint (2.5.0)

Command failed


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

@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

🤖 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/ttl/ttlworker/integrationtest/helpers_test.go`:
- Around line 44-60: The wrapper currently declares a shadow field "pool
syssession.Pool" leaving the embedded syssession.Pool nil; update
wrapPoolForTest and the struct so the embedded Pool is initialized and used:
remove the explicit "pool" field from poolTestWrapper (or stop using it), change
the constructor to return &poolTestWrapper{Pool: pool}, and update WithSession
to call w.Pool.WithSession(...) (or simply w.WithSession via the embedded field)
so the promoted methods (Get/Put/WithForceBlockGCSession) are backed by the
initialized embedded syssession.Pool.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: a2eb9584-8e3a-45f6-b66a-d8d93b1a9db0

📥 Commits

Reviewing files that changed from the base of the PR and between 48fa8aa and 6989ee5.

📒 Files selected for processing (4)
  • pkg/ttl/ttlworker/BUILD.bazel
  • pkg/ttl/ttlworker/integrationtest/BUILD.bazel
  • pkg/ttl/ttlworker/integrationtest/helpers_test.go
  • pkg/ttl/ttlworker/integrationtest/timer_sync_test.go
💤 Files with no reviewable changes (1)
  • pkg/ttl/ttlworker/BUILD.bazel

Comment on lines +44 to +60
type poolTestWrapper struct {
syssession.Pool
pool syssession.Pool
inuse atomic.Int64
}

func wrapPoolForTest(pool syssession.Pool) *poolTestWrapper {
return &poolTestWrapper{pool: pool}
}

func (w *poolTestWrapper) WithSession(fn func(*syssession.Session) error) error {
return w.pool.WithSession(func(s *syssession.Session) error {
w.inuse.Add(1)
defer w.inuse.Add(-1)
return fn(s)
})
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "helpers_test.go:"
sed -n '44,60p' pkg/ttl/ttlworker/integrationtest/helpers_test.go

echo
echo "syssession.Pool interface:"
sed -n '38,50p' pkg/session/syssession/pool.go

echo
python - <<'PY'
from pathlib import Path
import re

text = Path("pkg/ttl/ttlworker/integrationtest/helpers_test.go").read_text()
ctor = re.search(r'return\s+&poolTestWrapper\{([^}]*)\}', text, re.S)
if not ctor:
    raise SystemExit("constructor not found")

fields = ctor.group(1).strip().replace("\n", " ")
print("constructor fields:", fields)
print("initializes embedded Pool field:", "Pool:" in fields)
print("initializes shadow pool field:", "pool:" in fields)
PY

Repository: pingcap/tidb

Length of output: 1197


🏁 Script executed:

# Search for usages of wrapPoolForTest and poolTestWrapper
rg 'wrapPoolForTest|poolTestWrapper' --type go

Repository: pingcap/tidb

Length of output: 2161


🏁 Script executed:

# Check what methods are called on the pool wrapper in the test files
echo "=== task_manager_integration_test.go context around pool usage ==="
rg -A 10 -B 2 'pool := wrapPoolForTest' pkg/ttl/ttlworker/task_manager_integration_test.go | head -60

echo ""
echo "=== job_manager_integration_test.go context around pool usage ==="
rg -A 10 -B 2 'pool := wrapPoolForTest' pkg/ttl/ttlworker/job_manager_integration_test.go | head -60

echo ""
echo "=== timer_sync_test.go context around pool usage ==="
rg -A 10 -B 2 'pool := wrapPoolForTest' pkg/ttl/ttlworker/integrationtest/timer_sync_test.go | head -60

echo ""
echo "=== Check all method calls on pool variable ==="
rg '(?:pool|p)\.(?:Get|Put|WithForceBlockGCSession|WithSession|AssertNoSessionInUse)' pkg/ttl/ttlworker/task_manager_integration_test.go pkg/ttl/ttlworker/job_manager_integration_test.go pkg/ttl/ttlworker/integrationtest/timer_sync_test.go

Repository: pingcap/tidb

Length of output: 5641


🏁 Script executed:

# Check what NewManagerJobAdapter, NewJobManager, and NewTTLTimerSyncer do with the pool parameter
echo "=== NewManagerJobAdapter implementation ==="
rg -A 20 'func NewManagerJobAdapter' pkg/ttl/ttlworker/

echo ""
echo "=== NewJobManager implementation ==="
rg -A 20 'func NewJobManager' pkg/ttl/ttlworker/

echo ""
echo "=== NewTTLTimerSyncer implementation ==="
rg -A 20 'func NewTTLTimerSyncer' pkg/ttl/ttlworker/

echo ""
echo "=== Check for Get/Put/WithForceBlockGCSession calls in these files ==="
rg '\.(Get|Put|WithForceBlockGCSession)\(' pkg/ttl/ttlworker/manager_job_adapter.go pkg/ttl/ttlworker/job_manager.go pkg/ttl/ttlworker/timer_sync.go 2>/dev/null || echo "Files not found, searching in all ttlworker"
rg '\.(Get|Put|WithForceBlockGCSession)\(' pkg/ttl/ttlworker/*.go | grep -v test

Repository: pingcap/tidb

Length of output: 5117


🏁 Script executed:

# Search for the withSession helper function
echo "=== withSession helper function ==="
rg -B 2 -A 10 'func withSession' pkg/ttl/ttlworker/

echo ""
echo "=== Check what methods are called on sessPool in job_manager.go ==="
rg 'sessPool\.' pkg/ttl/ttlworker/job_manager.go

echo ""
echo "=== Check what methods are called on pool in timer_sync.go ==="
rg 'g\.pool\.' pkg/ttl/ttlworker/timer_sync.go

Repository: pingcap/tidb

Length of output: 1093


🏁 Script executed:

# Search more broadly for pool usage in these files
echo "=== All references to sessPool in job_manager.go ==="
rg 'sessPool' pkg/ttl/ttlworker/job_manager.go

echo ""
echo "=== All references to pool in timer_sync.go ==="
rg '\bpool\b' pkg/ttl/ttlworker/timer_sync.go | head -30

Repository: pingcap/tidb

Length of output: 1635


🏁 Script executed:

# Final verification: check if faultSessionPool (used in job_manager_integration_test.go) calls other methods
echo "=== Check newFaultSessionPool implementation ==="
rg -B 5 -A 30 'func newFaultSessionPool' pkg/ttl/ttlworker/job_manager_integration_test.go

echo ""
echo "=== Check faultSessionPool methods ==="
rg 'func.*faultSessionPool' pkg/ttl/ttlworker/job_manager_integration_test.go

Repository: pingcap/tidb

Length of output: 144


🏁 Script executed:

# Search for newFaultSessionPool more carefully
rg -i 'fault.*pool' pkg/ttl/ttlworker/job_manager_integration_test.go

echo ""
echo "=== Look at the context where faultPool is used ==="
rg -B 3 -A 8 'faultPool :=' pkg/ttl/ttlworker/job_manager_integration_test.go

Repository: pingcap/tidb

Length of output: 791


🏁 Script executed:

# Find the newFaultSessionPool definition
rg -B 5 -A 20 'func newFaultSessionPool' pkg/ttl/ttlworker/job_manager_integration_test.go

echo ""
echo "=== Check faultSessionPool struct and methods ==="
rg -B 2 -A 15 'type faultSessionPool' pkg/ttl/ttlworker/job_manager_integration_test.go

Repository: pingcap/tidb

Length of output: 106


🏁 Script executed:

# Search for faultSessionPool definition across all test files
rg 'faultSessionPool|newFaultSessionPool' --type go -B 2 -A 15

echo ""
echo "=== Check what methods the test actually calls on the wrapper ==="
rg '(\.Get|\.Put|\.WithForceBlockGCSession)\(' pkg/ttl/ttlworker/ --type go

Repository: pingcap/tidb

Length of output: 11848


Initialize the embedded syssession.Pool, not a shadow field.

poolTestWrapper embeds syssession.Pool to delegate Get/Put/WithForceBlockGCSession, but wrapPoolForTest only initializes pool. This leaves the promoted interface nil, so any call to these methods through the wrapper will panic. Although current tests avoid this by calling only WithSession (which is overridden), the wrapper violates the interface contract and will fail if future code calls other interface methods.

Suggested fix
 type poolTestWrapper struct {
 	syssession.Pool
-	pool  syssession.Pool
 	inuse atomic.Int64
 }
 
 func wrapPoolForTest(pool syssession.Pool) *poolTestWrapper {
-	return &poolTestWrapper{pool: pool}
+	return &poolTestWrapper{Pool: pool}
 }
 
 func (w *poolTestWrapper) WithSession(fn func(*syssession.Session) error) error {
-	return w.pool.WithSession(func(s *syssession.Session) error {
+	return w.Pool.WithSession(func(s *syssession.Session) error {
 		w.inuse.Add(1)
 		defer w.inuse.Add(-1)
 		return fn(s)
 	})
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
type poolTestWrapper struct {
syssession.Pool
pool syssession.Pool
inuse atomic.Int64
}
func wrapPoolForTest(pool syssession.Pool) *poolTestWrapper {
return &poolTestWrapper{pool: pool}
}
func (w *poolTestWrapper) WithSession(fn func(*syssession.Session) error) error {
return w.pool.WithSession(func(s *syssession.Session) error {
w.inuse.Add(1)
defer w.inuse.Add(-1)
return fn(s)
})
}
type poolTestWrapper struct {
syssession.Pool
inuse atomic.Int64
}
func wrapPoolForTest(pool syssession.Pool) *poolTestWrapper {
return &poolTestWrapper{Pool: pool}
}
func (w *poolTestWrapper) WithSession(fn func(*syssession.Session) error) error {
return w.Pool.WithSession(func(s *syssession.Session) error {
w.inuse.Add(1)
defer w.inuse.Add(-1)
return fn(s)
})
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/ttl/ttlworker/integrationtest/helpers_test.go` around lines 44 - 60, The
wrapper currently declares a shadow field "pool syssession.Pool" leaving the
embedded syssession.Pool nil; update wrapPoolForTest and the struct so the
embedded Pool is initialized and used: remove the explicit "pool" field from
poolTestWrapper (or stop using it), change the constructor to return
&poolTestWrapper{Pool: pool}, and update WithSession to call
w.Pool.WithSession(...) (or simply w.WithSession via the embedded field) so the
promoted methods (Get/Put/WithForceBlockGCSession) are backed by the initialized
embedded syssession.Pool.

@codecov
Copy link

codecov bot commented Mar 10, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 77.4341%. Comparing base (48fa8aa) to head (9e66df9).
⚠️ Report is 3 commits behind head on master.

Additional details and impacted files
@@               Coverage Diff                @@
##             master     #66866        +/-   ##
================================================
- Coverage   77.6716%   77.4341%   -0.2375%     
================================================
  Files          2009       1930        -79     
  Lines        550314     537782     -12532     
================================================
- Hits         427438     416427     -11011     
- Misses       121168     121353       +185     
+ Partials       1708          2      -1706     
Flag Coverage Δ
integration 41.1295% <ø> (-7.0575%) ⬇️
unit 76.5740% <ø> (+0.3260%) ⬆️

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

Components Coverage Δ
dumpling 56.7974% <ø> (ø)
parser ∅ <ø> (∅)
br 48.8938% <ø> (-12.0178%) ⬇️
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@ti-chi-bot ti-chi-bot bot added 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. labels Mar 10, 2026
Copy link

@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

🤖 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/ttl/ttlworker/integrationtest/manager_job_adapter_test.go`:
- Around line 205-218: The test calls insertJob(...) three times but never calls
GetJob(...) after each insert, so the subsequent require.NoError(t, err) and
require.Nil(t, job) assertions are still checking results from the earlier
GetJob; fix by invoking GetJob with the corresponding tableID, physicalID and
requestID immediately after each insertJob call (e.g., job, err = GetJob(ctx,
tableID, physicalID, requestID) or using the test's adapter.GetJob), then assert
require.NoError(t, err) and require.Nil(t, job) on those fresh results to verify
nil is returned for mismatched tableID/physicalID/requestID.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: dc65a6f8-2562-4937-95cc-bbfa74747796

📥 Commits

Reviewing files that changed from the base of the PR and between 6989ee5 and 9e66df9.

📒 Files selected for processing (3)
  • pkg/ttl/ttlworker/integrationtest/BUILD.bazel
  • pkg/ttl/ttlworker/integrationtest/manager_job_adapter_test.go
  • pkg/ttl/ttlworker/job_manager_integration_test.go
💤 Files with no reviewable changes (1)
  • pkg/ttl/ttlworker/job_manager_integration_test.go

Comment on lines +205 to +218
insertJob(2, 2, "req1", cache.JobStatusFinished)
require.NoError(t, err)
require.Nil(t, job)
tk.MustExec("delete from mysql.tidb_ttl_job_history")

insertJob(1, 3, "req1", cache.JobStatusFinished)
require.NoError(t, err)
require.Nil(t, job)
tk.MustExec("delete from mysql.tidb_ttl_job_history")

insertJob(1, 2, "req2", cache.JobStatusFinished)
require.NoError(t, err)
require.Nil(t, job)
tk.MustExec("delete from mysql.tidb_ttl_job_history")
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Missing GetJob calls after insertJob make these assertions ineffective.

Lines 206-207, 211-212, and 216-217 assert on err and job from the previous GetJob call at line 201, not from a new call after insertJob. These assertions don't actually verify that GetJob correctly returns nil for mismatched tableID, physicalID, or requestID.

🐛 Proposed fix to add GetJob calls
 	insertJob(2, 2, "req1", cache.JobStatusFinished)
+	job, err = adapter.GetJob(context.TODO(), 1, 2, "req1")
 	require.NoError(t, err)
 	require.Nil(t, job)
 	tk.MustExec("delete from mysql.tidb_ttl_job_history")
 
 	insertJob(1, 3, "req1", cache.JobStatusFinished)
+	job, err = adapter.GetJob(context.TODO(), 1, 2, "req1")
 	require.NoError(t, err)
 	require.Nil(t, job)
 	tk.MustExec("delete from mysql.tidb_ttl_job_history")
 
 	insertJob(1, 2, "req2", cache.JobStatusFinished)
+	job, err = adapter.GetJob(context.TODO(), 1, 2, "req1")
 	require.NoError(t, err)
 	require.Nil(t, job)
 	tk.MustExec("delete from mysql.tidb_ttl_job_history")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
insertJob(2, 2, "req1", cache.JobStatusFinished)
require.NoError(t, err)
require.Nil(t, job)
tk.MustExec("delete from mysql.tidb_ttl_job_history")
insertJob(1, 3, "req1", cache.JobStatusFinished)
require.NoError(t, err)
require.Nil(t, job)
tk.MustExec("delete from mysql.tidb_ttl_job_history")
insertJob(1, 2, "req2", cache.JobStatusFinished)
require.NoError(t, err)
require.Nil(t, job)
tk.MustExec("delete from mysql.tidb_ttl_job_history")
insertJob(2, 2, "req1", cache.JobStatusFinished)
job, err = adapter.GetJob(context.TODO(), 1, 2, "req1")
require.NoError(t, err)
require.Nil(t, job)
tk.MustExec("delete from mysql.tidb_ttl_job_history")
insertJob(1, 3, "req1", cache.JobStatusFinished)
job, err = adapter.GetJob(context.TODO(), 1, 2, "req1")
require.NoError(t, err)
require.Nil(t, job)
tk.MustExec("delete from mysql.tidb_ttl_job_history")
insertJob(1, 2, "req2", cache.JobStatusFinished)
job, err = adapter.GetJob(context.TODO(), 1, 2, "req1")
require.NoError(t, err)
require.Nil(t, job)
tk.MustExec("delete from mysql.tidb_ttl_job_history")
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/ttl/ttlworker/integrationtest/manager_job_adapter_test.go` around lines
205 - 218, The test calls insertJob(...) three times but never calls GetJob(...)
after each insert, so the subsequent require.NoError(t, err) and require.Nil(t,
job) assertions are still checking results from the earlier GetJob; fix by
invoking GetJob with the corresponding tableID, physicalID and requestID
immediately after each insertJob call (e.g., job, err = GetJob(ctx, tableID,
physicalID, requestID) or using the test's adapter.GetJob), then assert
require.NoError(t, err) and require.Nil(t, job) on those fresh results to verify
nil is returned for mismatched tableID/physicalID/requestID.

@hawkingrei
Copy link
Member Author

/retest

@ti-chi-bot
Copy link

ti-chi-bot bot commented Mar 10, 2026

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: YangKeao

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 approved needs-1-more-lgtm Indicates a PR needs 1 more LGTM. labels Mar 10, 2026
@ti-chi-bot
Copy link

ti-chi-bot bot commented Mar 10, 2026

[LGTM Timeline notifier]

Timeline:

  • 2026-03-10 08:17:58.99458203 +0000 UTC m=+338110.506639691: ☑️ agreed by YangKeao.

@hawkingrei
Copy link
Member Author

/retest

@hawkingrei hawkingrei added the skip-issue-check Indicates that a PR no need to check linked issue. label Mar 10, 2026
@hawkingrei
Copy link
Member Author

/retest

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

Labels

approved needs-1-more-lgtm Indicates a PR needs 1 more LGTM. release-note-none Denotes a PR that doesn't merit a release note. size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. skip-issue-check Indicates that a PR no need to check linked issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants