Skip to content

Conversation

@wk989898
Copy link
Collaborator

@wk989898 wk989898 commented Dec 29, 2025

What problem does this PR solve?

Issue Number: ref #1584

What is changed and how it works?

Granular DDL Metrics: Introduced a new Prometheus counter, "ExecDDLCounter", to track the execution count of different DDL types, providing more detailed insights into DDL operations.
DDL Type Parameterization: The "RecordDDLExecution" function now accepts a "ddlType" string, enabling specific DDL operation types to be recorded and differentiated in metrics across various sink implementations.
Metrics Refactoring: DDL-related metrics ("ExecDDLHistogram", "ExecDDLRunningGauge") were moved from "pkg/metrics/sink.go" to a new "pkg/metrics/ddl.go" file, centralizing DDL metric definitions and introducing a new "ExecDDLBlockingGauge".
Error Counter Separation: The "ExecutionErrorCounter" in "pkg/metrics/statistics.go" was refined to differentiate between DDL and DML execution errors, providing more specific error tracking.
Barrier Map Renaming: Renamed the internal RangeWoLock method to RangeWithoutLock in BlockedEventMap for improved clarity and added a Len() method to it.

Check List

Tests

  • Unit test
  • Integration test
  • Manual test (add detailed scripts or steps below)
截屏2026-01-05 11 24 05

Questions

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

Release note

`None`.

@ti-chi-bot ti-chi-bot bot added the release-note Denotes a PR that will be considered when it comes time to generate release notes. label Dec 29, 2025
@ti-chi-bot
Copy link

ti-chi-bot bot commented Dec 29, 2025

[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 charlescheung96 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/XL Denotes a PR that changes 500-999 lines, ignoring generated files. label Dec 29, 2025
@gemini-code-assist
Copy link

Summary of Changes

Hello @wk989898, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces a significant improvement to the DDL execution monitoring within TiCDC by adding the specific DDL type as a label to the ddl_exec_running metric. This enhancement provides operators and developers with a more detailed view of ongoing DDL operations, enabling better insights into system behavior and potential bottlenecks related to different DDL command types. The changes span across metric definitions, the DDL recording mechanism, various sink implementations, and corresponding Grafana dashboards to ensure comprehensive metric collection and visualization.

Highlights

  • Enhanced DDL Metrics: The ddl_exec_running metric now includes the specific DDL type as a label, allowing for more granular monitoring of DDL operations.
  • Metric Definition Update: The ExecDDLRunningGauge in pkg/metrics/sink.go has been updated to include ddl_type as a new label.
  • Refactored DDL Recording: The RecordDDLExecution function in pkg/metrics/statistics.go was modified to accept the DDL type and dynamically create the gauge, removing the pre-allocated gauge from the Statistics struct.
  • Sink Integration: Various sink implementations (Cloud Storage, Kafka, Pulsar, Redo, MySQL) have been updated to pass the DDL type when recording DDL execution.
  • Grafana Dashboard Updates: Existing Grafana dashboards (ticdc_new_arch.json, ticdc_new_arch_next_gen.json, ticdc_new_arch_with_keyspace_name.json) have been modified to incorporate the new ddl_type label in the Prometheus query for the "Sink Running DDL Count" panel and to simplify the panel title.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@ti-chi-bot ti-chi-bot bot added size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. and removed size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. labels Dec 29, 2025
Copy link

@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 introduces a ddl_type label to the ticdc_sink_ddl_exec_running metric, enhancing DDL monitoring by providing more granular data. The changes are propagated through various sinks and the corresponding Grafana dashboards have been updated. While the overall approach is sound, I've identified a couple of issues. There's a bug in the Kafka and Pulsar sinks where the wrong DDL type is used for metrics in multi-table DDL scenarios. Additionally, there's a potential memory leak due to the new dynamic metric labels not being cleaned up upon changefeed removal. My review includes suggestions to fix these issues.

@ti-chi-bot ti-chi-bot bot added size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. and removed size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. labels Dec 29, 2025
@wk989898 wk989898 changed the title metrics: add running ddl count for different ddl type metrics: add ddl count for different ddl type Dec 29, 2025
@ti-chi-bot ti-chi-bot bot added release-note-none Denotes a PR that doesn't merit a release note. and removed release-note Denotes a PR that will be considered when it comes time to generate release notes. labels Dec 29, 2025
@wk989898
Copy link
Collaborator Author

/gemini summary

@gemini-code-assist
Copy link

Summary of Changes

This pull request significantly enhances the monitoring capabilities for DDL (Data Definition Language) operations within TiCDC. By introducing a mechanism to track DDL executions based on their specific type, it moves beyond generic DDL counts to provide a more granular view of database schema changes. This improvement offers deeper insights into the nature and frequency of DDL activities across various sinks, which is crucial for better operational visibility, performance analysis, and troubleshooting.

Highlights

  • Granular DDL Metrics: Introduced a new Prometheus counter, ExecDDLCounter, to track the execution count of different DDL types, providing more detailed insights into DDL operations.
  • DDL Type Parameterization: The RecordDDLExecution function now accepts a ddlType string, enabling specific DDL operation types to be recorded and differentiated in metrics.
  • Sink Integration: All relevant sink implementations (Cloud Storage, Kafka, Pulsar, Redo, and MySQL) have been updated to correctly pass the DDL type when recording DDL executions.
  • Grafana Dashboard Updates: Modified existing Grafana dashboards (ticdc_new_arch.json, ticdc_new_arch_next_gen.json, ticdc_new_arch_with_keyspace_name.json) to incorporate the new ddl_type label in Prometheus queries and refined panel descriptions and titles for clarity.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • downstreamadapter/sink/cloudstorage/sink.go
    • Modified the call to s.statistics.RecordDDLExecution to include the ddlType derived from the DDL event.
  • downstreamadapter/sink/kafka/sink.go
    • Added a ddlType variable derived from e.GetDDLType().String() before calling s.statistics.RecordDDLExecution.
  • downstreamadapter/sink/pulsar/sink.go
    • Added a ddlType variable derived from e.GetDDLType().String() before calling s.statistics.RecordDDLExecution.
  • downstreamadapter/sink/redo/sink.go
    • Added a ddlType variable derived from e.GetDDLType().String() before calling s.statistics.RecordDDLExecution.
  • metrics/grafana/ticdc_new_arch.json
    • Updated the Grafana dashboard JSON to reflect changes in DDL metric descriptions and titles.
    • Modified Prometheus queries to include the new ddl_type label for DDL execution counts.
    • Adjusted panel positions and IDs for better organization.
  • metrics/grafana/ticdc_new_arch_next_gen.json
    • Applied similar Grafana dashboard updates as ticdc_new_arch.json for the next-gen architecture, including metric descriptions, titles, and query labels.
  • metrics/grafana/ticdc_new_arch_with_keyspace_name.json
    • Implemented comparable Grafana dashboard updates for the keyspace-aware architecture, adjusting metric descriptions, titles, and query labels.
  • pkg/metrics/sink.go
    • Introduced ExecDDLCounter, a new Prometheus CounterVec, to record the execution count of different DDL types, labeled by keyspace, changefeed, sink type, and DDL type.
    • Registered the new ExecDDLCounter with the Prometheus registry.
  • pkg/metrics/statistics.go
    • Modified the RecordDDLExecution function signature to accept a ddlType string.
    • Incremented the newly introduced ExecDDLCounter with appropriate label values, including the ddlType.
  • pkg/sink/mysql/mysql_writer_ddl.go
    • Added a ddlType variable derived from event.GetDDLType().String() before calling w.statistics.RecordDDLExecution.
Activity
  • A bot indicated that the pull request is not yet approved and listed charlescheung96 as an approver.
  • Gemini Code Assist provided an initial summary of the changes in the pull request.
  • A pull-check test failed, and the bot prompted the author to rerun the failed tests.
  • The author, wk989898, requested a summary from Gemini Code Assist.
  • Gemini Code Assist identified a potential memory leak in pkg/metrics/statistics.go due to uncleaned gauge metrics created with WithLabelValues (ID 2650402346).
  • Gemini Code Assist pointed out an issue in downstreamadapter/sink/kafka/sink.go where the ddlType was incorrectly derived from the original event instead of the individual loop variable e (ID 2650402350).
  • Gemini Code Assist identified the same ddlType derivation issue in downstreamadapter/sink/pulsar/sink.go (ID 2650402358).

@ti-chi-bot ti-chi-bot bot added size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. and removed size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. labels Dec 29, 2025
@wk989898
Copy link
Collaborator Author

/gemini summary

@gemini-code-assist
Copy link

Summary of Changes

This pull request significantly enhances the monitoring capabilities for DDL (Data Definition Language) operations within TiCDC. By introducing a mechanism to track DDL executions based on their specific type, it moves beyond generic DDL counts to provide a more granular view of database schema changes. This improvement offers deeper insights into the nature and frequency of DDL activities across various sinks, which is crucial for better operational visibility, performance analysis, and troubleshooting.

Highlights

  • Granular DDL Metrics: Introduced a new Prometheus counter, "ExecDDLCounter", to track the execution count of different DDL types, providing more detailed insights into DDL operations.
  • DDL Type Parameterization: The "RecordDDLExecution" function now accepts a "ddlType" string, enabling specific DDL operation types to be recorded and differentiated in metrics.
  • Metrics Refactoring: DDL-related metrics ("ExecDDLHistogram", "ExecDDLRunningGauge") were moved from "pkg/metrics/sink.go" to a new "pkg/metrics/ddl.go" file, centralizing DDL metric definitions.
  • Error Counter Separation: The "ExecutionErrorCounter" in "pkg/metrics/statistics.go" was refined to differentiate between DDL and DML execution errors.
  • Sink Integration: All relevant sink implementations (Cloud Storage, Kafka, Pulsar, Redo, and MySQL) have been updated to correctly pass the DDL type when recording DDL executions.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • downstreamadapter/sink/cloudstorage/sink.go
    • Modified the call to "s.statistics.RecordDDLExecution" to include the "ddlType" derived from the DDL event.
  • downstreamadapter/sink/kafka/sink.go
    • Added a "ddlType" variable derived from "e.GetDDLType().String()" before calling "s.statistics.RecordDDLExecution".
  • downstreamadapter/sink/pulsar/sink.go
    • Added a "ddlType" variable derived from "e.GetDDLType().String()" before calling "s.statistics.RecordDDLExecution".
  • downstreamadapter/sink/redo/sink.go
    • Added a "ddlType" variable derived from "e.GetDDLType().String()" before calling "s.statistics.RecordDDLExecution".
  • pkg/metrics/ddl.go
    • New file introduced to define "ExecDDLHistogram", "ExecDDLRunningGauge", and "ExecDDLCounter" with "ddl_type" label.
    • Contains "initDDLMetrics" function to register these new DDL metrics.
  • pkg/metrics/init.go
    • Modified to call the newly introduced "initDDLMetrics" function.
    • Changed the call from "InitRedoMetrics" to "initRedoMetrics" (unexported).
  • pkg/metrics/redo.go
    • Renamed the "InitRedoMetrics" function to "initRedoMetrics", making it unexported.
  • pkg/metrics/sink.go
    • Removed "ExecDDLHistogram" and "ExecDDLRunningGauge" definitions, as they are now in "pkg/metrics/ddl.go".
    • Updated the "ExecutionErrorCounter" to use an "event_type" label instead of a generic "type" label.
    • Adjusted "initSinkMetrics" to remove registration of the moved DDL metrics.
  • pkg/metrics/statistics.go
    • Updated the "NewStatistics" constructor to initialize "metricExecDDLHis" and "metricExecDDLRunningCnt" without the "sinkType" label.
    • Refactored the "Statistics" struct to replace a single "metricExecErrCnt" with "metricExecErrCntForDDL" and "metricExecErrCntForDML".
    • Modified "RecordBatchExecution" to increment "metricExecErrCntForDML" on error.
    • Updated "RecordDDLExecution" to accept a "ddlType" parameter, increment the new "ExecDDLCounter" with the "ddlType", and increment "metricExecErrCntForDDL" on error.
  • pkg/sink/mysql/mysql_writer_ddl.go
    • Added a "ddlType" variable derived from "event.GetDDLType().String()" before calling "w.statistics.RecordDDLExecution".
Activity
  • The pull request is currently NOT APPROVED by the bot, and "charlescheung96" is listed as an approver.
  • Gemini Code Assist provided an initial summary of the changes.
  • Several tests, including "pull-check", "pull-unit-test-next-gen", and "pull-unit-test", have failed.
  • The author, "wk989898", requested a summary from Gemini Code Assist.
  • Gemini Code Assist identified a potential memory leak in "pkg/metrics/statistics.go" related to "ExecDDLRunningGauge" metrics not being cleaned up (Comment ID: 2650402346).
  • Gemini Code Assist pointed out an issue in "downstreamadapter/sink/kafka/sink.go" where the "ddlType" was incorrectly derived from the original event instead of the loop variable "e" (Comment ID: 2650402350).
  • Gemini Code Assist identified the same "ddlType" derivation issue in "downstreamadapter/sink/pulsar/sink.go" (Comment ID: 2650402358).
  • The author, "wk989898", requested another summary from Gemini Code Assist.

@wk989898
Copy link
Collaborator Author

/gemini review

Copy link

@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 enhances DDL metrics by adding a counter for different DDL types. The changes are well-structured, including refactoring DDL metrics into a dedicated file (pkg/metrics/ddl.go) and updating various sink implementations to report the DDL type. This improves the observability of DDL operations. I've identified a couple of issues in pkg/metrics/statistics.go: a minor comment typo and a more significant issue with metric cleanup in the Close function that could lead to metric leaks. I've provided suggestions to address these. Overall, this is a valuable improvement.

ExecutionErrorCounter.DeleteLabelValues(keyspace, changefeedID)
ExecutionErrorCounter.DeleteLabelValues(keyspace, changefeedID, "ddl")
ExecutionErrorCounter.DeleteLabelValues(keyspace, changefeedID, "dml")
ExecDDLCounter.DeleteLabelValues(keyspace, changefeedID)

Choose a reason for hiding this comment

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

high

This call to DeleteLabelValues is incorrect because ExecDDLCounter has three labels (keyspace, changefeed, ddl_type), but only two are provided. This will result in a no-op, and metrics will leak after a changefeed is closed.

To remove all metrics for a given keyspace and changefeed from a MetricVec, you should use Remove with a label map.

Additionally, several other calls to DeleteLabelValues in this function are also incorrect for the same reason (wrong number of label values for ExecBatchHistogram, ExecBatchWriteBytesHistogram, and TotalWriteBytesCounter). This is a good opportunity to fix them all by providing the b.sinkType as the third argument for each.

Suggested change
ExecDDLCounter.DeleteLabelValues(keyspace, changefeedID)
ExecDDLCounter.Remove(prometheus.Labels{getKeyspaceLabel(): keyspace, "changefeed": changefeedID})

metricExecErrCnt prometheus.Counter
// metricExecErrCntForDDL records the error count of the Sink for DDL.
metricExecErrCntForDDL prometheus.Counter
// metricExecErrCntForDDL records the error count of the Sink for DML.

Choose a reason for hiding this comment

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

medium

There's a copy-paste error in this comment. It should refer to metricExecErrCntForDML to match the variable it's describing.

Suggested change
// metricExecErrCntForDDL records the error count of the Sink for DML.
// metricExecErrCntForDML records the error count of the Sink for DML.

@wk989898
Copy link
Collaborator Author

wk989898 commented Jan 5, 2026

/gemini summary

@gemini-code-assist
Copy link

Summary of Changes

This pull request significantly enhances the monitoring capabilities for DDL (Data Definition Language) operations within TiCDC by introducing granular tracking of DDL execution counts based on their specific types. This provides a more detailed view of database schema changes, improving operational visibility, performance analysis, and troubleshooting. The changes involve refactoring DDL-related metrics into a dedicated file, separating DDL and DML error counters, and updating various sink implementations to correctly report DDL types.

Highlights

  • Granular DDL Metrics: Introduced a new Prometheus counter, "ExecDDLCounter", to track the execution count of different DDL types, providing more detailed insights into DDL operations.
  • DDL Type Parameterization: The "RecordDDLExecution" function now accepts a "ddlType" string, enabling specific DDL operation types to be recorded and differentiated in metrics across various sink implementations.
  • Metrics Refactoring: DDL-related metrics ("ExecDDLHistogram", "ExecDDLRunningGauge") were moved from "pkg/metrics/sink.go" to a new "pkg/metrics/ddl.go" file, centralizing DDL metric definitions and introducing a new "ExecDDLBlockingGauge".
  • Error Counter Separation: The "ExecutionErrorCounter" in "pkg/metrics/statistics.go" was refined to differentiate between DDL and DML execution errors, providing more specific error tracking.
  • Barrier Map Renaming: Renamed the internal RangeWoLock method to RangeWithoutLock in BlockedEventMap for improved clarity and added a Len() method to it.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • downstreamadapter/sink/cloudstorage/sink.go
    • Modified the call to s.statistics.RecordDDLExecution to include the ddlType derived from the DDL event.
  • downstreamadapter/sink/kafka/sink.go
    • Added a ddlType variable derived from e.GetDDLType().String() before calling s.statistics.RecordDDLExecution.
  • downstreamadapter/sink/pulsar/sink.go
    • Added a ddlType variable derived from e.GetDDLType().String() before calling s.statistics.RecordDDLExecution.
  • downstreamadapter/sink/redo/sink.go
    • Added a ddlType variable derived from e.GetDDLType().String() before calling s.statistics.RecordDDLExecution.
  • maintainer/barrier.go
    • Renamed b.blockedEvents.RangeWoLock to b.blockedEvents.RangeWithoutLock.
  • maintainer/barrier_helper.go
    • Renamed RangeWoLock to RangeWithoutLock.
    • Added a Len() method to BlockedEventMap.
  • maintainer/maintainer.go
    • Introduced a blockingLen variable to store the length of blocked events.
    • Set the metrics.ExecDDLBlockingGauge with the blockingLen value.
  • pkg/metrics/ddl.go
    • Added new file defining ExecDDLHistogram, ExecDDLRunningGauge, ExecDDLBlockingGauge, and ExecDDLCounter with ddl_type label.
    • Included initDDLMetrics function to register these new DDL metrics.
  • pkg/metrics/init.go
    • Added a call to initDDLMetrics.
    • Changed the call from InitRedoMetrics to initRedoMetrics (unexported).
  • pkg/metrics/redo.go
    • Renamed the InitRedoMetrics function to initRedoMetrics, making it unexported.
  • pkg/metrics/sink.go
    • Removed ExecDDLHistogram and ExecDDLRunningGauge definitions, as they are now in pkg/metrics/ddl.go.
    • Updated the ExecutionErrorCounter to use an event_type label instead of a generic type label.
    • Adjusted initSinkMetrics to remove registration of the moved DDL metrics.
  • pkg/metrics/statistics.go
    • Updated the NewStatistics constructor to initialize metricExecDDLHis and metricExecDDLRunningCnt with keyspace and changefeedID labels.
    • Refactored the Statistics struct to replace a single metricExecErrCnt with metricExecErrCntForDDL and metricExecErrCntForDML.
    • Modified RecordBatchExecution to increment metricExecErrCntForDML on error.
    • Updated RecordDDLExecution to accept a ddlType parameter, increment the new ExecDDLCounter with the ddlType, and increment metricExecErrCntForDDL on error.
    • Updated the Close method to delete ExecutionErrorCounter metrics with ddl and dml labels, and ExecDDLCounter with keyspace and changefeedID labels.
  • pkg/sink/mysql/mysql_writer_ddl.go
    • Added a ddlType variable derived from event.GetDDLType().String() before calling w.statistics.RecordDDLExecution.
Activity
  • The ti-chi-bot indicated that the pull request is not yet approved and listed charlescheung96 as an approver.
  • gemini-code-assist provided multiple summaries of the changes in the pull request.
  • The ti-chi-bot reported failed pull-check tests and prompted the author to rerun them.
  • The author wk989898 requested summaries and a review from gemini-code-assist.
  • gemini-code-assist raised a high-priority concern about a potential memory leak in pkg/metrics/statistics.go due to ExecDDLRunningGauge metrics not being cleaned up in the Close() method (ID 2650402346).
  • gemini-code-assist identified a medium-priority issue in downstreamadapter/sink/kafka/sink.go regarding incorrect ddlType derivation from the original event instead of the loop variable e (ID 2650402350).
  • The same ddlType derivation issue was noted by gemini-code-assist for downstreamadapter/sink/pulsar/sink.go (ID 2650402358).
  • gemini-code-assist pointed out a high-priority issue in pkg/metrics/statistics.go where ExecDDLCounter.DeleteLabelValues was called with an incorrect number of labels, potentially leading to metric leaks, and suggested using Remove with a label map (ID 2650751435).
  • gemini-code-assist identified a medium-priority typo in a comment in pkg/metrics/statistics.go (ID 2650751440).

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

Labels

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.

1 participant