Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

opt: reduce planning time for queries with many joins #114623

Merged
merged 8 commits into from Nov 17, 2023

Conversation

mgartner
Copy link
Collaborator

@mgartner mgartner commented Nov 16, 2023

opt: move slow-query benchmark schemas to SQL file

This commit moves the schemas used for slow-query benchmarks into a
separate SQL file so that the schemas can continue to grow without
making a mess of bench_test.go.

Release note: None

opt: add slow-query-6

Release note: None

opt: add two reorder_join_limit cases for BenchmarkSlowQueries

BenchmarkSlowQueries now runs each slow query benchmark with
reorder_join_limit set to 0 and 8. This will allow us to analyze
the range of query optimization performance with respect to this setting
which is commonly adjusted to reduce planning latency.

Release note: None

opt: avoid FuncDepSet.tryToReduceKey in FuncDepSet.addEquivalency

Prior to this commit, FuncDepSet.tryToReduceKey was called at the end
of FuncDepSet.addEquivalency. This was inefficient because
FuncDepSet.AddFrom and FuncDepSet.AddEquivFrom can call
addEquivalency multiple times, and the FD's key only needs to be
reduced after all equivalencies and dependencies have been added. Now,
tryToReduceKey is no longer called in addEquivalency and callers are
responsible for ensuring that it is called. This mimics the behavior of
the similar function addDependency.

Release note: None

opt: add FuncDepSet.addConstantsNoKeyReduction

This commit adds a new method FuncDepSet.addConstantsNoKeyReduction
which is the same as FuncDepSet.AddConstants, only differing because
it not attempt to reduce the key like `AddConstants does. This allows us
to avoid key-reducing computation in a few places.

Release note: None

opt: use ComputeEquivClosureNoCopy in FuncDepSet.addEquivalency

This commit changes the invocation of ComputeEquivClosure within
FuncDepSet.addEquivalency to ComputeEquivClosureNoCopy. This is
valid because addEquivalency is only called with sets that have
already been copied, so mutating the input set is safe.

Release note: None

opt: avoid ColSet allocations in statisticsBuilder.colStatJoin

This commit reduces allocation in statisticsBuilder.colStatJoin.
Previously, it was creating intersections of two sets, which, in some
cases, were only useful for checking their emptiness. Now we use the
ColSet.Intersects method which returns a boolean and does not
build a new set.

Release note: None

opt: reduce allocations in statistic builder

This commit reduces allocations in the statistics builder by avoiding
creating singleton column sets. A new ColStatsMap.LookupSingleton
method allows columns stats for a single column to be fetched without
building a column set and potentially allocating memory.

Epic: None

Release note: None

This commit moves the schemas used for slow-query benchmarks into a
separate SQL file so that the schemas can continue to grow without
making a mess of `bench_test.go`.

Release note: None
Release note: None
`BenchmarkSlowQueries` now runs each slow query benchmark with
`reorder_join_limit` set to `0` and `8`. This will allow us to analyze
the range of query optimization performance with respect to this setting
which is commonly adjusted to reduce planning latency.

Release note: None
Prior to this commit, `FuncDepSet.tryToReduceKey` was called at the end
of `FuncDepSet.addEquivalency`. This was inefficient because
`FuncDepSet.AddFrom` and `FuncDepSet.AddEquivFrom` can call
`addEquivalency` multiple times, and the FD's key only needs to be
reduced after all equivalencies and dependencies have been added. Now,
`tryToReduceKey` is no longer called in `addEquivalency` and callers are
responsible for ensuring that it is called. This mimics the behavior of
the similar function `addDependency`.

Release note: None
@mgartner mgartner requested a review from a team November 16, 2023 22:33
@mgartner mgartner requested a review from a team as a code owner November 16, 2023 22:33
@mgartner mgartner requested review from michae2 and removed request for a team November 16, 2023 22:33
Copy link

blathers-crl bot commented Nov 16, 2023

Your pull request contains more than 1000 changes. It is strongly encouraged to split big PRs into smaller chunks.

🦉 Hoot! I am a Blathers, a bot for CockroachDB. My owner is dev-inf.

@cockroach-teamcity
Copy link
Member

This change is Reviewable

@mgartner
Copy link
Collaborator Author

Benchmark results comparing master to the combination of all commits here on a GCE worker are below. I was mainly focusing on the profile from SlowQueries/slow-query-6/reorder-join-0, which is probably why most of the gains are for that query and configuration.

name                                        old time/op    new time/op    delta
SlowQueries/slow-query-1/reorder-join-0-24    2.38ms ± 1%    2.30ms ± 1%   -3.08%  (p=0.008 n=5+5)
SlowQueries/slow-query-1/reorder-join-8-24    27.8ms ± 0%    27.5ms ± 1%   -0.98%  (p=0.016 n=5+5)
SlowQueries/slow-query-2/reorder-join-0-24    6.58ms ± 0%    6.14ms ± 1%   -6.73%  (p=0.008 n=5+5)
SlowQueries/slow-query-2/reorder-join-8-24     600ms ± 1%     599ms ± 0%     ~     (p=1.000 n=5+5)
SlowQueries/slow-query-3/reorder-join-0-24    88.8ms ± 1%    88.5ms ± 1%     ~     (p=1.000 n=5+5)
SlowQueries/slow-query-3/reorder-join-8-24    96.2ms ± 1%    94.8ms ± 1%   -1.44%  (p=0.016 n=5+5)
SlowQueries/slow-query-4/reorder-join-0-24    17.7ms ± 0%    16.3ms ± 1%   -8.32%  (p=0.008 n=5+5)
SlowQueries/slow-query-4/reorder-join-8-24     676ms ± 1%     650ms ± 0%   -3.87%  (p=0.008 n=5+5)
SlowQueries/slow-query-5/reorder-join-0-24    92.2ms ± 0%    83.9ms ± 1%   -9.00%  (p=0.008 n=5+5)
SlowQueries/slow-query-5/reorder-join-8-24     1.59s ± 1%     1.52s ± 1%   -4.84%  (p=0.008 n=5+5)
SlowQueries/slow-query-6/reorder-join-0-24     115ms ± 0%      79ms ± 0%  -31.75%  (p=0.008 n=5+5)
SlowQueries/slow-query-6/reorder-join-8-24     3.15s ± 2%     2.92s ± 2%   -7.24%  (p=0.008 n=5+5)

name                                        old alloc/op   new alloc/op   delta
SlowQueries/slow-query-1/reorder-join-0-24     745kB ± 0%     732kB ± 0%   -1.82%  (p=0.008 n=5+5)
SlowQueries/slow-query-1/reorder-join-8-24    7.10MB ± 0%    7.06MB ± 0%   -0.65%  (p=0.008 n=5+5)
SlowQueries/slow-query-2/reorder-join-0-24    1.35MB ± 0%    1.33MB ± 0%   -1.50%  (p=0.008 n=5+5)
SlowQueries/slow-query-2/reorder-join-8-24    75.3MB ± 0%    75.3MB ± 0%     ~     (p=1.000 n=5+5)
SlowQueries/slow-query-3/reorder-join-0-24    43.5MB ± 0%    42.9MB ± 0%   -1.31%  (p=0.008 n=5+5)
SlowQueries/slow-query-3/reorder-join-8-24    45.8MB ± 0%    45.1MB ± 0%   -1.51%  (p=0.008 n=5+5)
SlowQueries/slow-query-4/reorder-join-0-24    6.66MB ± 0%    5.94MB ± 0%  -10.84%  (p=0.008 n=5+5)
SlowQueries/slow-query-4/reorder-join-8-24     158MB ± 0%     148MB ± 0%   -6.84%  (p=0.008 n=5+5)
SlowQueries/slow-query-5/reorder-join-0-24    41.4MB ± 0%    38.3MB ± 0%   -7.68%  (p=0.008 n=5+5)
SlowQueries/slow-query-5/reorder-join-8-24     333MB ± 0%     302MB ± 0%   -9.25%  (p=0.008 n=5+5)
SlowQueries/slow-query-6/reorder-join-0-24    28.7MB ± 0%    22.0MB ± 0%  -23.44%  (p=0.008 n=5+5)
SlowQueries/slow-query-6/reorder-join-8-24     850MB ± 0%     766MB ± 0%   -9.81%  (p=0.008 n=5+5)

name                                        old allocs/op  new allocs/op  delta
SlowQueries/slow-query-1/reorder-join-0-24     4.58k ± 0%     4.17k ± 0%   -8.88%  (p=0.008 n=5+5)
SlowQueries/slow-query-1/reorder-join-8-24     71.8k ± 0%     70.5k ± 0%   -1.73%  (p=0.008 n=5+5)
SlowQueries/slow-query-2/reorder-join-0-24     6.30k ± 0%     6.14k ± 0%   -2.47%  (p=0.008 n=5+5)
SlowQueries/slow-query-2/reorder-join-8-24      594k ± 0%      594k ± 0%     ~     (p=1.000 n=5+5)
SlowQueries/slow-query-3/reorder-join-0-24      364k ± 0%      346k ± 0%   -4.89%  (p=0.008 n=5+5)
SlowQueries/slow-query-3/reorder-join-8-24      389k ± 0%      367k ± 0%   -5.56%  (p=0.008 n=5+5)
SlowQueries/slow-query-4/reorder-join-0-24     72.8k ± 0%     50.6k ± 0%  -30.48%  (p=0.008 n=5+5)
SlowQueries/slow-query-4/reorder-join-8-24     3.26M ± 0%     2.92M ± 0%  -10.38%  (p=0.008 n=5+5)
SlowQueries/slow-query-5/reorder-join-0-24      316k ± 0%      223k ± 0%  -29.35%  (p=0.008 n=5+5)
SlowQueries/slow-query-5/reorder-join-8-24     5.63M ± 0%     4.67M ± 0%  -17.09%  (p=0.008 n=5+5)
SlowQueries/slow-query-6/reorder-join-0-24      381k ± 0%      192k ± 0%  -49.61%  (p=0.008 n=5+5)
SlowQueries/slow-query-6/reorder-join-8-24     13.2M ± 0%     10.6M ± 0%  -19.75%  (p=0.008 n=5+5)
name                                                    old time/op    new time/op    delta
Phases/kv-read/Simple/Explore-24                          48.8µs ± 1%    48.8µs ± 1%    ~     (p=1.000 n=5+5)
Phases/kv-read-const/Simple/Explore-24                    49.8µs ± 1%    49.4µs ± 1%    ~     (p=0.222 n=5+5)
Phases/tpcc-new-order/Simple/Explore-24                    132µs ± 0%     131µs ± 1%  -0.69%  (p=0.008 n=5+5)
Phases/tpcc-delivery/Simple/Explore-24                     114µs ± 1%     114µs ± 1%    ~     (p=0.151 n=5+5)
Phases/tpcc-delivery/Prepared/Explore-24                  42.3µs ± 1%    42.4µs ± 1%    ~     (p=0.841 n=5+5)
Phases/tpcc-stock-level/Simple/Explore-24                  598µs ± 1%     594µs ± 0%    ~     (p=0.095 n=5+5)
Phases/tpcc-stock-level/Prepared/Explore-24                257µs ± 0%     257µs ± 0%    ~     (p=0.690 n=5+5)
Phases/many-columns-and-indexes-a/Simple/Explore-24        463µs ± 0%     464µs ± 0%    ~     (p=0.095 n=5+5)
Phases/many-columns-and-indexes-a/Prepared/Explore-24      410µs ± 0%     413µs ± 0%  +0.70%  (p=0.016 n=5+5)
Phases/many-columns-and-indexes-b/Simple/Explore-24        551µs ± 0%     551µs ± 0%    ~     (p=0.690 n=5+5)
Phases/many-columns-and-indexes-b/Prepared/Explore-24      465µs ± 0%     465µs ± 0%    ~     (p=1.000 n=5+5)
Phases/many-columns-and-indexes-c/Simple/Explore-24        301ms ± 1%     297ms ± 1%  -1.31%  (p=0.032 n=5+5)
Phases/many-columns-and-indexes-c/Prepared/Explore-24      302ms ± 2%     298ms ± 0%  -1.38%  (p=0.008 n=5+5)
Phases/single-col-histogram-range/Simple/Explore-24        136µs ± 1%     135µs ± 1%  -1.30%  (p=0.032 n=5+5)
Phases/single-col-histogram-range/Prepared/Explore-24     59.3µs ± 1%    58.2µs ± 0%  -1.94%  (p=0.008 n=5+5)
Phases/batch-insert-one/Simple/Explore-24                  117µs ± 1%     116µs ± 1%    ~     (p=0.095 n=5+5)
Phases/batch-insert-many/Simple/Explore-24                8.56ms ± 1%    8.48ms ± 0%  -0.91%  (p=0.016 n=5+5)
Phases/ored-preds-100/Simple/Explore-24                   3.64ms ± 0%    3.64ms ± 0%    ~     (p=0.841 n=5+5)
Phases/ored-preds-using-params-100/Simple/Explore-24      3.43ms ± 0%    3.43ms ± 0%    ~     (p=1.000 n=5+5)
Phases/ored-preds-using-params-100/Prepared/Explore-24    1.49ms ± 1%    1.51ms ± 1%  +0.80%  (p=0.032 n=5+5)

name                                                    old alloc/op   new alloc/op   delta
Phases/kv-read/Simple/Explore-24                          15.3kB ± 0%    15.3kB ± 0%    ~     (all equal)
Phases/kv-read-const/Simple/Explore-24                    15.4kB ± 0%    15.4kB ± 0%    ~     (all equal)
Phases/tpcc-new-order/Simple/Explore-24                   32.7kB ± 0%    32.7kB ± 0%    ~     (p=0.103 n=5+5)
Phases/tpcc-delivery/Simple/Explore-24                    27.0kB ± 0%    27.0kB ± 0%    ~     (p=0.175 n=5+5)
Phases/tpcc-delivery/Prepared/Explore-24                  12.8kB ± 0%    12.8kB ± 0%    ~     (p=0.444 n=5+5)
Phases/tpcc-stock-level/Simple/Explore-24                  130kB ± 0%     130kB ± 0%    ~     (p=0.690 n=5+5)
Phases/tpcc-stock-level/Prepared/Explore-24               58.9kB ± 0%    58.9kB ± 0%    ~     (p=0.317 n=5+5)
Phases/many-columns-and-indexes-a/Simple/Explore-24       39.6kB ± 0%    39.6kB ± 0%    ~     (p=0.929 n=5+5)
Phases/many-columns-and-indexes-a/Prepared/Explore-24     5.50kB ± 0%    5.50kB ± 0%    ~     (all equal)
Phases/many-columns-and-indexes-b/Simple/Explore-24       47.9kB ± 0%    47.9kB ± 0%    ~     (p=0.738 n=5+5)
Phases/many-columns-and-indexes-b/Prepared/Explore-24     8.02kB ± 0%    8.02kB ± 0%    ~     (p=0.238 n=5+5)
Phases/many-columns-and-indexes-c/Simple/Explore-24        109MB ± 0%     109MB ± 0%  -0.62%  (p=0.008 n=5+5)
Phases/many-columns-and-indexes-c/Prepared/Explore-24      108MB ± 0%     107MB ± 0%  -0.60%  (p=0.008 n=5+5)
Phases/single-col-histogram-range/Simple/Explore-24       29.7kB ± 0%    29.7kB ± 0%    ~     (p=0.151 n=5+5)
Phases/single-col-histogram-range/Prepared/Explore-24     13.0kB ± 0%    13.0kB ± 0%    ~     (all equal)
Phases/batch-insert-one/Simple/Explore-24                 64.8kB ± 0%    64.8kB ± 0%    ~     (p=1.000 n=5+5)
Phases/batch-insert-many/Simple/Explore-24                3.92MB ± 0%    3.92MB ± 0%    ~     (p=0.421 n=5+5)
Phases/ored-preds-100/Simple/Explore-24                    945kB ± 0%     945kB ± 0%    ~     (p=0.548 n=5+5)
Phases/ored-preds-using-params-100/Simple/Explore-24       926kB ± 0%     926kB ± 0%    ~     (p=1.000 n=5+5)
Phases/ored-preds-using-params-100/Prepared/Explore-24     736kB ± 0%     736kB ± 0%    ~     (p=0.881 n=5+5)

name                                                    old allocs/op  new allocs/op  delta
Phases/kv-read/Simple/Explore-24                            95.0 ± 0%      95.0 ± 0%    ~     (all equal)
Phases/kv-read-const/Simple/Explore-24                      95.0 ± 0%      95.0 ± 0%    ~     (all equal)
Phases/tpcc-new-order/Simple/Explore-24                      175 ± 0%       175 ± 0%    ~     (all equal)
Phases/tpcc-delivery/Simple/Explore-24                       179 ± 0%       179 ± 0%    ~     (all equal)
Phases/tpcc-delivery/Prepared/Explore-24                    75.0 ± 0%      75.0 ± 0%    ~     (all equal)
Phases/tpcc-stock-level/Simple/Explore-24                    708 ± 0%       708 ± 0%    ~     (all equal)
Phases/tpcc-stock-level/Prepared/Explore-24                  341 ± 0%       341 ± 0%    ~     (all equal)
Phases/many-columns-and-indexes-a/Simple/Explore-24         81.0 ± 0%      81.0 ± 0%    ~     (all equal)
Phases/many-columns-and-indexes-a/Prepared/Explore-24       31.0 ± 0%      31.0 ± 0%    ~     (all equal)
Phases/many-columns-and-indexes-b/Simple/Explore-24          136 ± 0%       136 ± 0%    ~     (all equal)
Phases/many-columns-and-indexes-b/Prepared/Explore-24       49.0 ± 0%      49.0 ± 0%    ~     (all equal)
Phases/many-columns-and-indexes-c/Simple/Explore-24         731k ± 0%      710k ± 0%  -2.87%  (p=0.008 n=5+5)
Phases/many-columns-and-indexes-c/Prepared/Explore-24       725k ± 0%      705k ± 0%  -2.83%  (p=0.008 n=5+5)
Phases/single-col-histogram-range/Simple/Explore-24          522 ± 0%       522 ± 0%    ~     (all equal)
Phases/single-col-histogram-range/Prepared/Explore-24        251 ± 0%       251 ± 0%    ~     (all equal)
Phases/batch-insert-one/Simple/Explore-24                    325 ± 0%       325 ± 0%    ~     (all equal)
Phases/batch-insert-many/Simple/Explore-24                 28.5k ± 0%     28.5k ± 0%    ~     (p=0.683 n=5+5)
Phases/ored-preds-100/Simple/Explore-24                    4.53k ± 0%     4.53k ± 0%    ~     (p=1.000 n=5+5)
Phases/ored-preds-using-params-100/Simple/Explore-24       4.53k ± 0%     4.53k ± 0%    ~     (p=0.095 n=4+5)
Phases/ored-preds-using-params-100/Prepared/Explore-24     2.88k ± 0%     2.88k ± 0%    ~     (all equal)

This commit adds a new method `FuncDepSet.addConstantsNoKeyReduction`
which is the same as `FuncDepSet.AddConstants`, only differing because
it not attempt to reduce the key like `AddConstants does. This allows us
to avoid key-reducing computation in a few places.

Release note: None
This commit changes the invocation of `ComputeEquivClosure` within
`FuncDepSet.addEquivalency` to `ComputeEquivClosureNoCopy`. This is
valid because `addEquivalency` is only called with sets that have
already been copied, so mutating the input set is safe.

Release note: None
Copy link
Member

@yuzefovich yuzefovich left a comment

Choose a reason for hiding this comment

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

Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (waiting on @DrewKimball, @mgartner, and @michae2)


pkg/sql/opt/bench/bench_test.go line 1459 at r8 (raw file):

		b.Run(query.name, func(b *testing.B) {
			for _, reorderJoinLimit := range []int64{0, 8} {
				b.Run(fmt.Sprintf("reorder-join-%d", reorderJoinLimit), func(b *testing.B) {

Note that changing the benchmark names will make it harder to compare against old SHAs that use the old name. If we plan to backport this to at least 23.2, then it seems fine.

Copy link
Collaborator

@DrewKimball DrewKimball left a comment

Choose a reason for hiding this comment

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

:lgtm: Nice speedups!

Reviewed 5 of 5 files at r1, 2 of 2 files at r2, 1 of 1 files at r3, 2 of 2 files at r4, 1 of 1 files at r5, 1 of 1 files at r6, 1 of 1 files at r7, 3 of 3 files at r8, all commit messages.
Reviewable status: :shipit: complete! 1 of 0 LGTMs obtained (waiting on @mgartner and @michae2)


-- commits line 6 at r1:
Thanks for doing this!


pkg/sql/opt/memo/statistics_builder.go line 1655 at r7 (raw file):

	switch joinType {
	case opt.LeftJoinOp, opt.LeftJoinApplyOp:
		// if right cols is not empty, then we'll add

[nit] This looks incomplete.

This commit reduces allocation in `statisticsBuilder.colStatJoin`.
Previously, it was creating intersections of two sets, which, in some
cases, were only useful for checking their emptiness. Now we use the
`ColSet.Intersects` method which returns a boolean and does not
build a new set.

Release note: None
This commit reduces allocations in the statistics builder by avoiding
creating singleton column sets. A new `ColStatsMap.LookupSingleton`
method allows columns stats for a single column to be fetched without
building a column set and potentially allocating memory.

Release note: None
Copy link
Collaborator Author

@mgartner mgartner left a comment

Choose a reason for hiding this comment

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

Reviewable status: :shipit: complete! 1 of 0 LGTMs obtained (waiting on @DrewKimball, @michae2, and @yuzefovich)


pkg/sql/opt/memo/statistics_builder.go line 1655 at r7 (raw file):

Previously, DrewKimball (Drew Kimball) wrote…

[nit] This looks incomplete.

Removed.


pkg/sql/opt/bench/bench_test.go line 1459 at r8 (raw file):

Previously, yuzefovich (Yahor Yuzefovich) wrote…

Note that changing the benchmark names will make it harder to compare against old SHAs that use the old name. If we plan to backport this to at least 23.2, then it seems fine.

One option would be to make a BenchmarkSlowQueries and a BenchmarkSlowQueriesNew where the former always uses the same benchmark names as the previous version. But backporting might be simpler, and I don't see any harm in doing so — it's not a bad time to do it since we're about to cut a release and we've already verified the regressions for this benchmark.

@mgartner mgartner added backport-23.1.x Flags PRs that need to be backported to 23.1 backport-23.2.x Flags PRs that need to be backported to 23.2. labels Nov 17, 2023
@mgartner
Copy link
Collaborator Author

TFTRs! I'm tentatively adding the backport labels so this isn't lost, though I understand there's non-zero risk in backporting these. One thing that would be wise if we do backport is to run the test suite with both fast_int_set_small and fast_int_set_large build tags to give use extra assurance that the removal of some ColSet-copying is safe.

bors r+

@craig
Copy link
Contributor

craig bot commented Nov 17, 2023

Build failed (retrying...):

@craig
Copy link
Contributor

craig bot commented Nov 17, 2023

Build succeeded:

@craig craig bot merged commit 44cefdf into cockroachdb:master Nov 17, 2023
8 checks passed
Copy link

blathers-crl bot commented Nov 17, 2023

Encountered an error creating backports. Some common things that can go wrong:

  1. The backport branch might have already existed.
  2. There was a merge conflict.
  3. The backport branch contained merge commits.

You might need to create your backport manually using the backport tool.


error creating merge commit from 09bab66 to blathers/backport-release-23.1-114623: POST https://api.github.com/repos/cockroachdb/cockroach/merges: 409 Merge conflict []

you may need to manually resolve merge conflicts with the backport tool.

Backport to branch 23.1.x failed. See errors above.


error creating merge commit from 09bab66 to blathers/backport-release-23.2-114623: POST https://api.github.com/repos/cockroachdb/cockroach/merges: 409 Merge conflict []

you may need to manually resolve merge conflicts with the backport tool.

Backport to branch 23.2.x failed. See errors above.


🦉 Hoot! I am a Blathers, a bot for CockroachDB. My owner is dev-inf.

@mgartner mgartner deleted the more-optimizer-speedups branch November 20, 2023 15:03
@mgartner
Copy link
Collaborator Author

mgartner commented Jan 4, 2024

If we backport the last commit here with LookupSingleton, we need to also backport the fix for that method in 8067a78.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backport-23.1.x Flags PRs that need to be backported to 23.1 backport-23.2.x Flags PRs that need to be backported to 23.2.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants