Skip to content

session,store: remove RUv2 rpc interceptor (#67508)#68019

Merged
ti-chi-bot[bot] merged 5 commits intopingcap:release-nextgen-202603from
shiyuhang0:cp_67508
Apr 27, 2026
Merged

session,store: remove RUv2 rpc interceptor (#67508)#68019
ti-chi-bot[bot] merged 5 commits intopingcap:release-nextgen-202603from
shiyuhang0:cp_67508

Conversation

@shiyuhang0
Copy link
Copy Markdown
Member

@shiyuhang0 shiyuhang0 commented Apr 24, 2026

ref #67199
cp #67508

What problem does this PR solve?

Issue Number: close #xxx

Problem Summary:

What changed and how does it work?

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.

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

  • Bug Fixes

    • Removed a stale per-statement RPC interceptor and improved consistency of RUv2/resource-usage accounting across execution paths and cursors.
    • Stabilized slow-log and EXPLAIN ANALYZE KV exec-detail reporting by snapshotting exec-details.
  • Performance Improvements

    • Safer concurrent metric updates and atomic snapshot/loading to reduce races and improve telemetry accuracy.
  • New Features

    • Propagation/synchronization of RUv2 metrics between contexts and detached recordsets.
  • Tests

    • Added/updated tests for RUv2 sync, snapshot semantics, and concurrent reporting.
  • Chores

    • Updated dependency pins and build wiring.

@ti-chi-bot ti-chi-bot Bot added 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. labels Apr 24, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 24, 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

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 4a3579b7-c358-4fd5-b7a6-4b1b71b3827c

📥 Commits

Reviewing files that changed from the base of the PR and between 0dd2567 and a8e5aef.

📒 Files selected for processing (1)
  • DEPS.bzl
🚧 Files skipped from review as they are similar to previous changes (1)
  • DEPS.bzl

📝 Walkthrough

Walkthrough

Removes the per-statement RUv2 RPC interceptor and its tests; adds execdetails snapshot and RUv2 sync helpers; propagates/synchronizes RUv2 into statement-level metrics across executor, resultset, and session; switches ExecDetails consumers to snapshot reads; and updates Go/Bazel dependency pins.

Changes

Cohort / File(s) Summary
Dependency updates
DEPS.bzl, go.mod
Bump/pin github.com/pingcap/kvproto and github.com/tikv/client-go/v2; update sha256/strip_prefix/urls and golang.org/x/net version.
Interceptor removal & DistSQL/session wiring
pkg/distsql/context/BUILD.bazel, pkg/distsql/context/context.go, pkg/distsql/distsql.go, pkg/session/session.go, pkg/session/tidb_test.go
Remove RUV2 RPC interceptor type, imports, and attachment to gRPC contexts; DistSQL/Session now only carry RUV2Metrics.
Txn driver interceptor deletion
pkg/store/driver/txn/ruv2_metrics.go, pkg/store/driver/txn/ruv2_metrics_test.go, pkg/store/driver/txn/BUILD.bazel
Delete statement-level RPC interceptor implementation and its unit tests; adjust BUILD deps and test shard counts.
ExecDetails helpers & snapshots
pkg/util/execdetails/ruv2_metrics.go, pkg/util/execdetails/util.go, pkg/util/execdetails/BUILD.bazel, pkg/util/execdetails/execdetails_test.go
Add LoadTiKVExecDetails, UpdateRUV2MetricsFromRUV2, SyncRUV2MetricsFromRUDetails and context init/inherit helpers; add tests and kvrpcpb Bazel deps.
Executor/resultset metric sync
pkg/executor/adapter.go, pkg/executor/adapter_test.go, pkg/server/internal/resultset/resultset.go
Ensure RUDetails/RUV2 metrics are synchronized from contexts into sessVars.RUV2Metrics in Next, no-delay execution, and cursor reporting; update tests including concurrency case.
Static recordset context propagation
pkg/executor/staticrecordset/BUILD.bazel, pkg/executor/staticrecordset/recordset.go
staticrecordset.New accepts optional source context and injects RUDetails/RUV2Metrics into execution ctx during Next.
Coprocessor-side RUV2 removal
pkg/store/copr/BUILD.bazel, pkg/store/copr/coprocessor.go, pkg/store/copr/ruv2_metrics.go
Remove coprocessor-side RUv2 update logic and delete ruv2_metrics.go.
ExecDetails consumers switched to snapshots
pkg/ddl/backfilling_operators.go, pkg/sessionctx/variable/slow_log.go, pkg/util/stmtsummary/statement_summary.go, pkg/util/stmtsummary/v2/record.go
Replace direct ExecDetails dereferences with execdetails.LoadTiKVExecDetails snapshots for thread-safe reads.
Tests, EXPLAIN and slow-log updates
pkg/distsql/context/context_test.go, pkg/executor/explain.go, pkg/executor/explain_unit_test.go, pkg/sessionctx/variable/tests/slowlog/slow_log_test.go, pkg/server/conn_stmt_test.go
Update tests and EXPLAIN/slow-log to use snapshot/sync helpers; add tests validating snapshot and RUv2 propagation semantics.
Bazel build tidy
pkg/session/BUILD.bazel, pkg/sessiontxn/.../BUILD.bazel, pkg/store/driver/txn/BUILD.bazel, pkg/executor/BUILD.bazel, pkg/server/BUILD.bazel
Remove obsolete interceptor/txn deps, add execdetails/kvrpcpb deps, and include staticrecordset in executor_test deps.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant Client
  participant TiKV as TiKV (ExecDetailsV2)
  participant ExecDetails as execdetails
  participant Session as Session/DistSQL
  participant Executor as Executor/RecordSet

  Client->>TiKV: RPCs produce ExecDetailsV2 (with RUV2)
  TiKV-->>Client: Responses carrying ExecDetailsV2
  Client->>ExecDetails: LoadTiKVExecDetails(pointer) -> snapshot
  ExecDetails-->>Session: provide snapshot RUDetails / RUV2Metrics
  Session->>Executor: ctx (with RUV2Metrics / RUDetails)
  Executor->>Executor: SyncRUV2MetricsFromContext -> sessVars.RUV2Metrics
  Executor->>Session: report/accumulate RU values (no per-RPC interceptor)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested labels

cherry-pick-approved, ok-to-test, type/refactor, approved

Suggested reviewers

  • disksing
  • XuHuaiyu
  • nolouch
  • hawkingrei
  • bb7133

"I nibble bytes and count each hop,
I snapshot metrics, then I stop.
No interceptor nets to trip the hop—
I sync RU counters, then I hop! 🐰"

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 36.36% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ❓ Inconclusive The PR description largely follows the template structure but contains minimal substantive content: no specific problem statement, no implementation details, empty issue number field, no checked test items, and only 'None' for release notes. Fill in the 'Problem Summary' and 'What changed and how does it work?' sections with concrete details; provide the actual issue number; and mark at least one test checkbox to indicate test coverage approach.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title 'session,store: remove RUv2 rpc interceptor (#67508)' clearly and specifically summarizes the main change: removing the RUv2 RPC interceptor from session and store packages, following the repository's naming convention.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

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

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

🧹 Nitpick comments (1)
pkg/util/stmtsummary/v2/record.go (1)

435-444: Redundant atomic loads via double LoadTiKVExecDetails.

StmtNetworkTrafficSummary.Add (see pkg/util/stmtsummary/statement_summary.go Line 1119-1131) internally calls execdetails.LoadTiKVExecDetails(info) on its argument. Passing &tikvExecDetails here causes an additional 8 atomic loads against the already-snapshotted fields. It's semantically fine (the snapshot's fields are plain int64, and atomic.LoadInt64 on them returns the same values), but wasteful on a hot path.

Minor — consider either passing info.TiKVExecDetails directly and letting Add produce the single snapshot, or providing an overload that accepts the pre-loaded snapshot by value.

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

In `@pkg/util/stmtsummary/v2/record.go` around lines 435 - 444, You are
double-loading TiKV exec details: the code calls
execdetails.LoadTiKVExecDetails(info.TiKVExecDetails) into tikvExecDetails and
then passes &tikvExecDetails to StmtNetworkTrafficSummary.Add which itself calls
execdetails.LoadTiKVExecDetails again; to fix, change the call to pass the
original info.TiKVExecDetails (not &tikvExecDetails) into
StmtNetworkTrafficSummary.Add so Add performs the single atomic snapshot via
execdetails.LoadTiKVExecDetails(info.TiKVExecDetails); alternatively, if you
want to keep a preloaded snapshot, add an Add overload that accepts the
preloaded execdetails.TiKVExecDetails by value and use that.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@go.mod`:
- Line 128: go.mod pins github.com/tikv/pd/client to
v0.0.0-20260404141330-8a6813497b52 but DEPS.bzl's com_github_tikv_pd_client
entry still references the older v0.0.0-20260401072359-048f0d8f6f71; run make
bazel_prepare to refresh DEPS.bzl and update the com_github_tikv_pd_client block
so its strip_prefix, URLs and sha256 match the new
v0.0.0-20260404141330-8a6813497b52 version (commit/timestamp) committed to the
repo.

In `@pkg/util/execdetails/ruv2_metrics.go`:
- Around line 120-125: SyncRUV2MetricsFromRUDetails currently returns early when
metrics.Bypass() is true and never calls ruDetails.DrainRUV2(), which leaves the
RUv2 delta buffered and may leak into subsequent statements; fix by invoking
ruDetails.DrainRUV2() unconditionally at the start of
SyncRUV2MetricsFromRUDetails to consume/clear the buffered delta, then if
metrics.Bypass() return without calling UpdateRUV2MetricsFromRUV2; keep
UpdateRUV2MetricsFromRUV2(metrics, ...) only for the non-bypassed path so the
raw delta is always drained but only applied when appropriate.

---

Nitpick comments:
In `@pkg/util/stmtsummary/v2/record.go`:
- Around line 435-444: You are double-loading TiKV exec details: the code calls
execdetails.LoadTiKVExecDetails(info.TiKVExecDetails) into tikvExecDetails and
then passes &tikvExecDetails to StmtNetworkTrafficSummary.Add which itself calls
execdetails.LoadTiKVExecDetails again; to fix, change the call to pass the
original info.TiKVExecDetails (not &tikvExecDetails) into
StmtNetworkTrafficSummary.Add so Add performs the single atomic snapshot via
execdetails.LoadTiKVExecDetails(info.TiKVExecDetails); alternatively, if you
want to keep a preloaded snapshot, add an Add overload that accepts the
preloaded execdetails.TiKVExecDetails by value and use that.
🪄 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: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: b220df8a-be45-45d4-b470-4d7a42c46066

📥 Commits

Reviewing files that changed from the base of the PR and between f5c6452 and b4dfba4.

⛔ Files ignored due to path filters (1)
  • go.sum is excluded by !**/*.sum
📒 Files selected for processing (40)
  • DEPS.bzl
  • go.mod
  • pkg/ddl/backfilling_operators.go
  • pkg/distsql/context/BUILD.bazel
  • pkg/distsql/context/context.go
  • pkg/distsql/context/context_test.go
  • pkg/distsql/distsql.go
  • pkg/executor/BUILD.bazel
  • pkg/executor/adapter.go
  • pkg/executor/adapter_test.go
  • pkg/executor/explain.go
  • pkg/executor/explain_unit_test.go
  • pkg/executor/staticrecordset/BUILD.bazel
  • pkg/executor/staticrecordset/recordset.go
  • pkg/server/BUILD.bazel
  • pkg/server/conn_stmt_test.go
  • pkg/server/internal/resultset/resultset.go
  • pkg/session/BUILD.bazel
  • pkg/session/session.go
  • pkg/session/tidb_test.go
  • pkg/sessionctx/variable/slow_log.go
  • pkg/sessionctx/variable/tests/slowlog/slow_log_test.go
  • pkg/sessiontxn/isolation/BUILD.bazel
  • pkg/sessiontxn/isolation/base.go
  • pkg/sessiontxn/isolation/base_test.go
  • pkg/sessiontxn/staleread/BUILD.bazel
  • pkg/sessiontxn/staleread/provider.go
  • pkg/store/copr/BUILD.bazel
  • pkg/store/copr/coprocessor.go
  • pkg/store/copr/ruv2_metrics.go
  • pkg/store/driver/txn/BUILD.bazel
  • pkg/store/driver/txn/ruv2_metrics.go
  • pkg/store/driver/txn/ruv2_metrics_test.go
  • pkg/util/execdetails/BUILD.bazel
  • pkg/util/execdetails/execdetails_test.go
  • pkg/util/execdetails/ruv2_metrics.go
  • pkg/util/execdetails/tiflash_stats.go
  • pkg/util/execdetails/util.go
  • pkg/util/stmtsummary/statement_summary.go
  • pkg/util/stmtsummary/v2/record.go
💤 Files with no reviewable changes (13)
  • pkg/session/BUILD.bazel
  • pkg/sessiontxn/staleread/BUILD.bazel
  • pkg/store/copr/BUILD.bazel
  • pkg/distsql/context/BUILD.bazel
  • pkg/distsql/context/context.go
  • pkg/distsql/distsql.go
  • pkg/sessiontxn/staleread/provider.go
  • pkg/store/driver/txn/ruv2_metrics.go
  • pkg/store/driver/txn/ruv2_metrics_test.go
  • pkg/store/copr/ruv2_metrics.go
  • pkg/sessiontxn/isolation/base.go
  • pkg/store/copr/coprocessor.go
  • pkg/sessiontxn/isolation/base_test.go

Comment thread go.mod Outdated
github.com/tikv/client-go/v2 v2.0.8-0.20260401083018-b7f9a9e9d2ab
github.com/tikv/pd/client v0.0.0-20260401072359-048f0d8f6f71
github.com/tikv/client-go/v2 v2.0.8-0.20260414033830-1adc54c38a51
github.com/tikv/pd/client v0.0.0-20260404141330-8a6813497b52
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Confirm DEPS.bzl pd/client strip_prefix vs go.mod version.
rg -n 'com_github_tikv_pd_client|tikv/pd/client' DEPS.bzl | head -40
echo '---'
rg -n 'tikv/pd/client' go.mod

Repository: pingcap/tidb

Length of output: 920


DEPS.bzl pd/client entry is out of sync with this bump.

go.mod now pins github.com/tikv/pd/client to v0.0.0-20260404141330-8a6813497b52, but the corresponding DEPS.bzl entry (com_github_tikv_pd_client) still references v0.0.0-20260401072359-048f0d8f6f71 (different timestamp 20260401 vs 20260404 and different commit hash). Bazel builds and go builds will resolve to different pd/client versions, which can cause subtle behavioral drift and CI failures.

Rerun make bazel_prepare and commit the refreshed DEPS.bzl (strip_prefix + URLs + sha256 for pd/client).

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

In `@go.mod` at line 128, go.mod pins github.com/tikv/pd/client to
v0.0.0-20260404141330-8a6813497b52 but DEPS.bzl's com_github_tikv_pd_client
entry still references the older v0.0.0-20260401072359-048f0d8f6f71; run make
bazel_prepare to refresh DEPS.bzl and update the com_github_tikv_pd_client block
so its strip_prefix, URLs and sha256 match the new
v0.0.0-20260404141330-8a6813497b52 version (commit/timestamp) committed to the
repo.

Comment on lines +120 to +125
func SyncRUV2MetricsFromRUDetails(metrics *RUV2Metrics, ruDetails *tikvutil.RUDetails) {
if metrics == nil || ruDetails == nil || metrics.Bypass() {
return
}
UpdateRUV2MetricsFromRUV2(metrics, ruDetails.DrainRUV2())
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Drain RUDetails even when statement RUv2 is bypassed.

When metrics.Bypass() is true this returns before ruDetails.DrainRUV2(), so the raw RUv2 delta stays buffered in the shared RUDetails. With the new ContextWithMissingExecDetailsInitialized flow reusing existing exec-detail objects on a reused context, the skipped delta can leak into the next non-bypassed statement and get mis-attributed there.

Proposed fix
 func SyncRUV2MetricsFromRUDetails(metrics *RUV2Metrics, ruDetails *tikvutil.RUDetails) {
-	if metrics == nil || ruDetails == nil || metrics.Bypass() {
+	if ruDetails == nil {
 		return
 	}
-	UpdateRUV2MetricsFromRUV2(metrics, ruDetails.DrainRUV2())
+	drained := ruDetails.DrainRUV2()
+	if metrics == nil || metrics.Bypass() {
+		return
+	}
+	UpdateRUV2MetricsFromRUV2(metrics, drained)
 }
📝 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
func SyncRUV2MetricsFromRUDetails(metrics *RUV2Metrics, ruDetails *tikvutil.RUDetails) {
if metrics == nil || ruDetails == nil || metrics.Bypass() {
return
}
UpdateRUV2MetricsFromRUV2(metrics, ruDetails.DrainRUV2())
}
func SyncRUV2MetricsFromRUDetails(metrics *RUV2Metrics, ruDetails *tikvutil.RUDetails) {
if ruDetails == nil {
return
}
drained := ruDetails.DrainRUV2()
if metrics == nil || metrics.Bypass() {
return
}
UpdateRUV2MetricsFromRUV2(metrics, drained)
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/util/execdetails/ruv2_metrics.go` around lines 120 - 125,
SyncRUV2MetricsFromRUDetails currently returns early when metrics.Bypass() is
true and never calls ruDetails.DrainRUV2(), which leaves the RUv2 delta buffered
and may leak into subsequent statements; fix by invoking ruDetails.DrainRUV2()
unconditionally at the start of SyncRUV2MetricsFromRUDetails to consume/clear
the buffered delta, then if metrics.Bypass() return without calling
UpdateRUV2MetricsFromRUV2; keep UpdateRUV2MetricsFromRUV2(metrics, ...) only for
the non-bypassed path so the raw delta is always drained but only applied when
appropriate.

@ti-chi-bot ti-chi-bot Bot added the needs-1-more-lgtm Indicates a PR needs 1 more LGTM. label Apr 24, 2026
@ti-chi-bot ti-chi-bot Bot added lgtm and removed needs-1-more-lgtm Indicates a PR needs 1 more LGTM. labels Apr 24, 2026
@ti-chi-bot
Copy link
Copy Markdown

ti-chi-bot Bot commented Apr 24, 2026

[LGTM Timeline notifier]

Timeline:

  • 2026-04-24 05:49:30.36731074 +0000 UTC m=+2317775.572670797: ☑️ agreed by XuHuaiyu.
  • 2026-04-24 11:26:57.440390271 +0000 UTC m=+2338022.645750329: ☑️ agreed by wjhuang2016.

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 24, 2026

Codecov Report

❌ Patch coverage is 90.37433% with 18 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (release-nextgen-202603@f5c6452). Learn more about missing BASE report.

Additional details and impacted files
@@                     Coverage Diff                     @@
##             release-nextgen-202603     #68019   +/-   ##
===========================================================
  Coverage                          ?   77.5581%           
===========================================================
  Files                             ?       1962           
  Lines                             ?     543904           
  Branches                          ?          0           
===========================================================
  Hits                              ?     421842           
  Misses                            ?     121209           
  Partials                          ?        853           
Flag Coverage Δ
unit 76.1614% <90.3743%> (?)

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

Components Coverage Δ
dumpling 61.5065% <0.0000%> (?)
parser ∅ <0.0000%> (?)
br 60.9957% <0.0000%> (?)
🚀 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.

Copy link
Copy Markdown
Contributor

@D3Hunter D3Hunter left a comment

Choose a reason for hiding this comment

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

/approve

@ti-chi-bot
Copy link
Copy Markdown

ti-chi-bot Bot commented Apr 27, 2026

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: cfzjywxk, D3Hunter, disksing, wjhuang2016, XuHuaiyu

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 the approved label Apr 27, 2026
@ti-chi-bot ti-chi-bot Bot merged commit 7961967 into pingcap:release-nextgen-202603 Apr 27, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants