Skip to content

Commit 85270c9

Browse files
craig[bot]sumeerbholamgartner
committed
159123: mma: cleanup and populate counter metrics r=wenyihu6 a=sumeerbhola These metrics use static labels representing origin={external,rebalance}, type={replica,lease}, result={success,failure}. Epic: [CRDB-55052](https://cockroachlabs.atlassian.net/browse/CRDB-55052) Release note: None 159201: opt: do not build placeholder scans with stable functions r=mgartner a=mgartner In v25.4.0 we introduced an optimization for some types of generic query plans which converts parameterized lookup joins into placeholder scans. Prior to this commit the spans of these placeholder scans could contain scalar expressions that were not constants nor placeholders, which execbuilder does not support. This has been fixed by being more strict in the application of this rule. Fixes #159124 Release note (bug fix): A bug has been fixed which could cause prepared statements to fail with the error message "non-const expression" when they contained filters with stable functions. This bug has been present since 25.4.0. Co-authored-by: sumeerbhola <[email protected]> Co-authored-by: Marcus Gartner <[email protected]>
3 parents ceb320e + baea7bb + 9a05cd0 commit 85270c9

File tree

10 files changed

+225
-111
lines changed

10 files changed

+225
-111
lines changed

pkg/kv/kvserver/allocator/mmaprototype/allocator_state.go

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,38 @@ func (a *allocatorState) ProcessStoreLoadMsg(ctx context.Context, msg *StoreLoad
169169
func (a *allocatorState) AdjustPendingChangeDisposition(change ExternalRangeChange, success bool) {
170170
a.mu.Lock()
171171
defer a.mu.Unlock()
172+
metrics := a.ensureMetricsForLocalStoreLocked(change.localStoreID)
173+
isLeaseTransfer := change.IsPureTransferLease()
174+
switch change.origin {
175+
case OriginExternal:
176+
if isLeaseTransfer {
177+
if success {
178+
metrics.ExternalLeaseChangeSuccess.Inc(1)
179+
} else {
180+
metrics.ExternalLeaseChangeFailure.Inc(1)
181+
}
182+
} else {
183+
if success {
184+
metrics.ExternalReplicaChangeSuccess.Inc(1)
185+
} else {
186+
metrics.ExternalReplicaChangeFailure.Inc(1)
187+
}
188+
}
189+
case originMMARebalance:
190+
if isLeaseTransfer {
191+
if success {
192+
metrics.RebalanceLeaseChangeSuccess.Inc(1)
193+
} else {
194+
metrics.RebalanceLeaseChangeFailure.Inc(1)
195+
}
196+
} else {
197+
if success {
198+
metrics.RebalanceReplicaChangeSuccess.Inc(1)
199+
} else {
200+
metrics.RebalanceReplicaChangeFailure.Inc(1)
201+
}
202+
}
203+
}
172204
_, ok := a.cs.ranges[change.RangeID]
173205
if !ok {
174206
// Range no longer exists. This can happen if the StoreLeaseholderMsg
@@ -218,15 +250,15 @@ func (a *allocatorState) RegisterExternalChange(
218250
defer a.mu.Unlock()
219251
counterMetrics := a.ensureMetricsForLocalStoreLocked(localStoreID)
220252
if err := a.cs.preCheckOnApplyReplicaChanges(change); err != nil {
221-
counterMetrics.ExternalFailedToRegister.Inc(1)
253+
counterMetrics.ExternalRegisterFailure.Inc(1)
222254
log.KvDistribution.Infof(context.Background(),
223255
"did not register external changes: due to %v", err)
224256
return ExternalRangeChange{}, false
225257
} else {
226-
counterMetrics.ExternaRegisterSuccess.Inc(1)
258+
counterMetrics.ExternalRegisterSuccess.Inc(1)
227259
}
228260
a.cs.addPendingRangeChange(change)
229-
return MakeExternalRangeChange(change), true
261+
return MakeExternalRangeChange(OriginExternal, localStoreID, change), true
230262
}
231263

232264
// ComputeChanges implements the Allocator interface.

pkg/kv/kvserver/allocator/mmaprototype/cluster_state_rebalance_stores.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,8 @@ func (re *rebalanceEnv) rebalanceReplicas(
548548
replicaChanges, rangeID))
549549
}
550550
re.addPendingRangeChange(rangeChange)
551-
re.changes = append(re.changes, MakeExternalRangeChange(rangeChange))
551+
re.changes = append(re.changes,
552+
MakeExternalRangeChange(originMMARebalance, localStoreID, rangeChange))
552553
re.rangeMoveCount++
553554
log.KvDistribution.VEventf(ctx, 2,
554555
"result(success): rebalancing r%v from s%v to s%v [change: %v] with resulting loads source: %v target: %v",
@@ -722,7 +723,8 @@ func (re *rebalanceEnv) rebalanceLeasesFromLocalStoreID(
722723
panic(errors.Wrapf(err, "pre-check failed for lease transfer %v", leaseChange))
723724
}
724725
re.addPendingRangeChange(leaseChange)
725-
re.changes = append(re.changes, MakeExternalRangeChange(leaseChange))
726+
re.changes = append(re.changes,
727+
MakeExternalRangeChange(originMMARebalance, store.StoreID, leaseChange))
726728
log.KvDistribution.Infof(ctx,
727729
"result(success): shedding r%v lease from s%v to s%v [change:%v] with "+
728730
"resulting loads source:%v target:%v (means: %v) (frac_pending: (src:%.2f,target:%.2f) (src:%.2f,target:%.2f))",

pkg/kv/kvserver/allocator/mmaprototype/mma_metrics.go

Lines changed: 99 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -7,124 +7,139 @@ package mmaprototype
77

88
import "github.com/cockroachdb/cockroach/pkg/util/metric"
99

10+
type ChangeOrigin uint8
11+
12+
const (
13+
OriginExternal ChangeOrigin = iota
14+
originMMARebalance
15+
)
16+
1017
type counterMetrics struct {
11-
DroppedDueToStateInconsistency *metric.Counter
12-
ExternalFailedToRegister *metric.Counter
13-
ExternaRegisterSuccess *metric.Counter
14-
ExternalReplicaRebalanceSuccess *metric.Counter
15-
ExternalReplicaRebalanceFailure *metric.Counter
16-
ExternalLeaseTransferSuccess *metric.Counter
17-
ExternalLeaseTransferFailure *metric.Counter
18-
MMAReplicaRebalanceSuccess *metric.Counter
19-
MMAReplicaRebalanceFailure *metric.Counter
20-
MMALeaseTransferSuccess *metric.Counter
21-
MMALeaseTransferFailure *metric.Counter
22-
MMARegisterLeaseSuccess *metric.Counter
23-
MMARegisterRebalanceSuccess *metric.Counter
18+
DroppedDueToStateInconsistency *metric.Counter
19+
20+
ExternalRegisterSuccess *metric.Counter
21+
ExternalRegisterFailure *metric.Counter
22+
23+
ExternalReplicaChangeSuccess *metric.Counter
24+
ExternalReplicaChangeFailure *metric.Counter
25+
ExternalLeaseChangeSuccess *metric.Counter
26+
ExternalLeaseChangeFailure *metric.Counter
27+
28+
RebalanceReplicaChangeSuccess *metric.Counter
29+
RebalanceReplicaChangeFailure *metric.Counter
30+
RebalanceLeaseChangeSuccess *metric.Counter
31+
RebalanceLeaseChangeFailure *metric.Counter
2432
}
2533

2634
func makeCounterMetrics() *counterMetrics {
2735
return &counterMetrics{
28-
DroppedDueToStateInconsistency: metric.NewCounter(metaDroppedDueToStateInconsistency),
29-
ExternalFailedToRegister: metric.NewCounter(metaExternalFailedToRegister),
30-
ExternaRegisterSuccess: metric.NewCounter(metaExternaRegisterSuccess),
31-
MMARegisterLeaseSuccess: metric.NewCounter(metaMMARegisterLeaseSuccess),
32-
MMARegisterRebalanceSuccess: metric.NewCounter(metaMMARegisterRebalanceSuccess),
33-
ExternalReplicaRebalanceSuccess: metric.NewCounter(metaExternalReplicaRebalanceSuccess),
34-
ExternalReplicaRebalanceFailure: metric.NewCounter(metaExternalReplicaRebalanceFailure),
35-
ExternalLeaseTransferSuccess: metric.NewCounter(metaExternalLeaseTransferSuccess),
36-
ExternalLeaseTransferFailure: metric.NewCounter(metaExternalLeaseTransferFailure),
37-
MMAReplicaRebalanceSuccess: metric.NewCounter(metaMMAReplicaRebalanceSuccess),
38-
MMAReplicaRebalanceFailure: metric.NewCounter(metaMMAReplicaRebalanceFailure),
39-
MMALeaseTransferSuccess: metric.NewCounter(metaMMALeaseTransferSuccess),
40-
MMALeaseTransferFailure: metric.NewCounter(metaMMALeaseTransferFailure),
36+
DroppedDueToStateInconsistency: metric.NewCounter(metaDroppedDueToStateInconsistency),
37+
ExternalRegisterSuccess: metric.NewCounter(metaExternalRegisterSuccess),
38+
ExternalRegisterFailure: metric.NewCounter(metaExternalRegisterFailure),
39+
ExternalReplicaChangeSuccess: metric.NewCounter(metaExternalReplicaChangeSuccess),
40+
ExternalReplicaChangeFailure: metric.NewCounter(metaExternalReplicaChangeFailure),
41+
ExternalLeaseChangeSuccess: metric.NewCounter(metaExternalLeaseChangeSuccess),
42+
ExternalLeaseChangeFailure: metric.NewCounter(metaExternalLeaseChangeFailure),
43+
RebalanceReplicaChangeSuccess: metric.NewCounter(metaRebalanceReplicaChangeSuccess),
44+
RebalanceReplicaChangeFailure: metric.NewCounter(metaRebalanceReplicaChangeFailure),
45+
RebalanceLeaseChangeSuccess: metric.NewCounter(metaRebalanceLeaseChangeSuccess),
46+
RebalanceLeaseChangeFailure: metric.NewCounter(metaRebalanceLeaseChangeFailure),
4147
}
4248
}
4349

4450
var (
4551
metaDroppedDueToStateInconsistency = metric.Metadata{
4652
Name: "mma.dropped",
4753
Help: "Number of operations dropped due to MMA state inconsistency",
48-
Measurement: "Range Rebalances",
49-
Unit: metric.Unit_COUNT,
50-
}
51-
metaExternalFailedToRegister = metric.Metadata{
52-
Name: "mma.external.dropped",
53-
Help: "Number of external operations that failed to register with MMA",
54-
Measurement: "Range Rebalances",
54+
Measurement: "Replica/Lease Change",
5555
Unit: metric.Unit_COUNT,
5656
}
57-
metaExternaRegisterSuccess = metric.Metadata{
58-
Name: "mma.external.success",
57+
metaExternalRegisterSuccess = metric.Metadata{
58+
Name: "mma.external.registration.success",
5959
Help: "Number of external operations successfully registered with MMA",
60-
Measurement: "Range Rebalances",
60+
Measurement: "Replica/Lease Change",
6161
Unit: metric.Unit_COUNT,
6262
}
63-
metaMMARegisterLeaseSuccess = metric.Metadata{
64-
Name: "mma.lease.register.success",
65-
Help: "Number of lease transfers successfully registered with MMA",
66-
Measurement: "Range Rebalances",
63+
metaExternalRegisterFailure = metric.Metadata{
64+
Name: "mma.external.registration.failure",
65+
Help: "Number of external operations that failed to register with MMA",
66+
Measurement: "Replica/Lease Change",
6767
Unit: metric.Unit_COUNT,
6868
}
69-
metaMMARegisterRebalanceSuccess = metric.Metadata{
70-
Name: "mma.rebalance.register.success",
71-
Help: "Number of rebalance operations successfully registered with MMA",
72-
Measurement: "Range Rebalances",
69+
metaExternalReplicaChangeSuccess = metric.Metadata{
70+
Name: "mma.change.external.replica.success",
71+
Help: "Number of successful external replica change operations",
72+
Measurement: "Range Change",
7373
Unit: metric.Unit_COUNT,
74+
LabeledName: "mma.change",
75+
StaticLabels: metric.MakeLabelPairs(
76+
metric.LabelOrigin, "external", metric.LabelType, "replica", metric.LabelResult, "success"),
7477
}
75-
metaExternalReplicaRebalanceSuccess = metric.Metadata{
76-
Name: "mma.rebalances.external.success",
77-
Help: "Number of successful external replica rebalance operations",
78-
Measurement: "Range Rebalances",
78+
metaExternalReplicaChangeFailure = metric.Metadata{
79+
Name: "mma.change.external.replica.failure",
80+
Help: "Number of failed external replica change operations",
81+
Measurement: "Range Change",
7982
Unit: metric.Unit_COUNT,
83+
LabeledName: "mma.change",
84+
StaticLabels: metric.MakeLabelPairs(
85+
metric.LabelOrigin, "external", metric.LabelType, "replica", metric.LabelResult, "failure"),
8086
}
81-
82-
metaExternalLeaseTransferSuccess = metric.Metadata{
83-
Name: "mma.lease.external.success",
84-
Help: "Number of successful external lease transfer operations",
85-
Measurement: "Lease Transfers",
87+
metaExternalLeaseChangeSuccess = metric.Metadata{
88+
Name: "mma.change.external.lease.success",
89+
Help: "Number of successful external lease change operations",
90+
Measurement: "Lease Change",
8691
Unit: metric.Unit_COUNT,
92+
LabeledName: "mma.change",
93+
StaticLabels: metric.MakeLabelPairs(
94+
metric.LabelOrigin, "external", metric.LabelType, "lease", metric.LabelResult, "success"),
8795
}
88-
89-
metaExternalReplicaRebalanceFailure = metric.Metadata{
90-
Name: "mma.rebalances.external.failure",
91-
Help: "Number of failed external replica rebalance operations",
92-
Measurement: "Range Rebalances",
96+
metaExternalLeaseChangeFailure = metric.Metadata{
97+
Name: "mma.change.external.lease.failure",
98+
Help: "Number of failed external lease change operations",
99+
Measurement: "Lease Change",
93100
Unit: metric.Unit_COUNT,
101+
LabeledName: "mma.change",
102+
StaticLabels: metric.MakeLabelPairs(
103+
metric.LabelOrigin, "external", metric.LabelType, "lease", metric.LabelResult, "failure"),
94104
}
95-
96-
metaExternalLeaseTransferFailure = metric.Metadata{
97-
Name: "mma.lease.external.failure",
98-
Help: "Number of failed external lease transfer operations",
99-
Measurement: "Lease Transfers",
105+
metaRebalanceReplicaChangeSuccess = metric.Metadata{
106+
Name: "mma.change.rebalance.replica.success",
107+
Help: "Number of successful MMA-initiated rebalance operations that change replicas",
108+
Measurement: "Range Change",
100109
Unit: metric.Unit_COUNT,
110+
LabeledName: "mma.change",
111+
StaticLabels: metric.MakeLabelPairs(
112+
metric.LabelOrigin, "rebalance", metric.LabelType, "replica", metric.LabelResult, "success"),
101113
}
102-
103-
metaMMAReplicaRebalanceSuccess = metric.Metadata{
104-
Name: "mma.rebalance.success",
105-
Help: "Number of successful MMA-initiated replica rebalance operations",
106-
Measurement: "Range Rebalances",
114+
metaRebalanceReplicaChangeFailure = metric.Metadata{
115+
Name: "mma.change.rebalance.replica.failure",
116+
Help: "Number of failed MMA-initiated rebalance operations that change replicas",
117+
Measurement: "Range Change",
107118
Unit: metric.Unit_COUNT,
119+
LabeledName: "mma.change",
120+
StaticLabels: metric.MakeLabelPairs(
121+
metric.LabelOrigin, "rebalance", metric.LabelType, "replica", metric.LabelResult, "failure"),
108122
}
109-
110-
metaMMAReplicaRebalanceFailure = metric.Metadata{
111-
Name: "mma.rebalance.failure",
112-
Help: "Number of failed MMA-initiated replica rebalance operations",
113-
Measurement: "Range Rebalances",
123+
metaRebalanceLeaseChangeSuccess = metric.Metadata{
124+
Name: "mma.change.rebalance.lease.success",
125+
Help: "Number of successful MMA-initiated rebalance operations that transfer the lease",
126+
Measurement: "Lease Change",
114127
Unit: metric.Unit_COUNT,
128+
LabeledName: "mma.change",
129+
StaticLabels: metric.MakeLabelPairs(
130+
metric.LabelOrigin, "rebalance", metric.LabelType, "lease", metric.LabelResult, "success"),
115131
}
116-
117-
metaMMALeaseTransferSuccess = metric.Metadata{
118-
Name: "mma.lease.success",
119-
Help: "Number of successful MMA-initiated lease transfer operations",
120-
Measurement: "Lease Transfers",
132+
metaRebalanceLeaseChangeFailure = metric.Metadata{
133+
Name: "mma.change.rebalance.lease.failure",
134+
Help: "Number of failed MMA-initiated rebalance operations that transfer the lease",
135+
Measurement: "Lease Change",
121136
Unit: metric.Unit_COUNT,
137+
LabeledName: "mma.change",
138+
StaticLabels: metric.MakeLabelPairs(
139+
metric.LabelOrigin, "rebalance", metric.LabelType, "lease", metric.LabelResult, "failure"),
122140
}
123141

124-
metaMMALeaseTransferFailure = metric.Metadata{
125-
Name: "mma.lease.failure",
126-
Help: "Number of failed MMA-initiated lease transfer operations",
127-
Measurement: "Lease Transfers",
128-
Unit: metric.Unit_COUNT,
129-
}
142+
// Future: we will add additional origins for MMA-initiated operations that
143+
// are other than rebalance. Eventually, the external label value will go
144+
// away when everything is migrated to MMA and SMA is removed.
130145
)

pkg/kv/kvserver/allocator/mmaprototype/range_change.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ import (
2020
// It is a partial external representation of a set of changes that are
2121
// internally modeled using a slice of *pendingReplicaChanges.
2222
type ExternalRangeChange struct {
23+
origin ChangeOrigin
24+
localStoreID roachpb.StoreID
25+
2326
roachpb.RangeID
2427
Changes []ExternalReplicaChange
2528
}
@@ -48,7 +51,9 @@ type ExternalReplicaChange struct {
4851
ChangeType ReplicaChangeType
4952
}
5053

51-
func MakeExternalRangeChange(change PendingRangeChange) ExternalRangeChange {
54+
func MakeExternalRangeChange(
55+
origin ChangeOrigin, localStoreID roachpb.StoreID, change PendingRangeChange,
56+
) ExternalRangeChange {
5257
changes := make([]ExternalReplicaChange, len(change.pendingReplicaChanges))
5358
for i, rc := range change.pendingReplicaChanges {
5459
changeType := rc.replicaChangeType()
@@ -64,8 +69,10 @@ func MakeExternalRangeChange(change PendingRangeChange) ExternalRangeChange {
6469
}
6570
}
6671
return ExternalRangeChange{
67-
RangeID: change.RangeID,
68-
Changes: changes,
72+
origin: origin,
73+
localStoreID: localStoreID,
74+
RangeID: change.RangeID,
75+
Changes: changes,
6976
}
7077
}
7178

pkg/kv/kvserver/mmaintegration/mma_conversion_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ func TestConvertReplicaChangeToMMA(t *testing.T) {
114114
mmaChanges.SortForTesting()
115115
var b strings.Builder
116116
fmt.Fprintf(&b, "PendingRangeChange: %s", mmaChanges.StringForTesting())
117-
externalChange := mmaprototype.MakeExternalRangeChange(mmaChanges)
117+
externalChange := mmaprototype.MakeExternalRangeChange(
118+
mmaprototype.OriginExternal, 1 /* arbitrary local store */, mmaChanges)
118119
if externalChange.IsChangeReplicas() {
119120
fmt.Fprintf(&b, "As kvpb.ReplicationChanges:\n %v\n", externalChange.ReplicationChanges())
120121
} else if externalChange.IsPureTransferLease() {

pkg/sql/logictest/testdata/logic_test/generic

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,3 +690,20 @@ quality of service: regular
690690
regions: <hidden>
691691
actual row count: 0
692692
execution time: 0µs
693+
694+
# Regression test for #159124.
695+
statement ok
696+
CREATE TABLE t159124 (
697+
k INT PRIMARY KEY,
698+
s STRING,
699+
UNIQUE INDEX (s)
700+
)
701+
702+
statement ok
703+
SET plan_cache_mode = force_generic_plan
704+
705+
statement ok
706+
PREPARE p159124 AS SELECT k FROM t159124 WHERE s = current_user()
707+
708+
statement ok
709+
EXECUTE p159124

pkg/sql/opt/xform/generic_funcs.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,25 @@ func (c *CustomFuncs) GenericRulesEnabled() bool {
2323
return c.e.evalCtx.SessionData().PlanCacheMode != sessiondatapb.PlanCacheModeForceCustom
2424
}
2525

26-
// HasPlaceholdersOrStableExprs returns true if the given relational expression's subtree has
26+
// HasPlaceholders returns true if the given relational expression's subtree has
2727
// at least one placeholder.
28+
func (c *CustomFuncs) HasPlaceholders(e memo.RelExpr) bool {
29+
return e.Relational().HasPlaceholder
30+
}
31+
32+
// HasPlaceholdersOrStableExprs returns true if the given relational
33+
// expression's subtree has at least one placeholder or stable expression.
2834
func (c *CustomFuncs) HasPlaceholdersOrStableExprs(e memo.RelExpr) bool {
2935
return e.Relational().HasPlaceholder || e.Relational().VolatilitySet.HasStable()
3036
}
3137

38+
// IsConstantsAndPlaceholders returns true if all scalar expressions in the list
39+
// are constants, placeholders or tuples containing constants or placeholders.
40+
// If a tuple nested within a tuple is found, false is returned.
41+
func (c *CustomFuncs) IsConstantsAndPlaceholders(scalars memo.ScalarListExpr) bool {
42+
return scalars.IsConstantsAndPlaceholders()
43+
}
44+
3245
// GenerateParameterizedJoinValuesAndFilters returns a single-row Values
3346
// expression containing placeholders and stable expressions in the given
3447
// filters. It also returns a new set of filters where the placeholders and

0 commit comments

Comments
 (0)