Skip to content

fix: binary vector matching raises Loki's error text at Loki's step - #742

Merged
szibis merged 4 commits into
mainfrom
fix/binary-ignoring-matching
Oct 28, 2026
Merged

szibis merged 4 commits into
mainfrom
fix/binary-ignoring-matching

Conversation

@szibis

@szibis szibis commented Oct 12, 2026

Copy link
Copy Markdown
Collaborator

Summary

Join fixes for semantics/binary-ignoring-matching. The row stays open: its symptom, sum by (cluster) (A + ignoring(machine) B) answering about 150× Loki, is the aggregation-over-binary bug that #741 fixes. A top-level A + ignoring(machine) B already matched Loki.

This PR makes the join itself match Loki 3.7.7 (pkg/logql/evaluator.go:945-1128):

  • Error text. The duplicate-series error is now byte-exact: found duplicate series on the right hand-side;many-to-many matching not allowed: matching labels must be unique on one side. There is no space after ;, and the message says "left" for group_right (evaluator.go:974-975). The proxy wrote ; many-to-many.
  • Error order. Matching errors are now raised at the first failing step, in step order: right-hand duplicates, then left-hand multiple matches, within that step. The proxy checked every step for duplicates before the group-label check. The work moved to firstVectorMatchFailure and vectorMatchCounts.

No VictoriaLogs query changes. The join runs on the already-aggregated operand series.

Tests

  • TestBinaryMatchingErrorTextAndStepOrder and TestBinaryIgnoringMatchingEdgeTable (13 cases: label absent, empty or one-sided; comparison filter and bool; on; group_left include).
  • TestBinaryIgnoringThroughHandler, range and instant.
  • TestBinaryMatchingDifferential: 6,000 generated cases against a reference ported from vectorBinop, matchingSignature, resultMetric and MergeBinOp.
  • e2e vs Loki:

Pending before ready

szibis added a commit that referenced this pull request Oct 12, 2026
@github-actions github-actions Bot added size/XL Extra large change scope/proxy Proxy core scope/docs Documentation scope/tests Tests bugfix Bug fix and removed size/XL Extra large change labels Oct 12, 2026
@github-actions

github-actions Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

⚪ Performance A/B: no change beyond noise

54 shape×range — 54 ⚪ same · results vs Loki: 50 same, 0 new difference(s), 4 pre-existing

Loki profiles compared (like for like):

  • aligned: not run (no build supports -align-queries-with-step, so every aligned row would be not like-for-like)
  • loki-defaults: 54 shape×range; proxy flag base off, pr off

Every shape is within noise of the base build (±30% and 100 ms).

54 unchanged shape×range (within noise)
shape range Loki profile base p50 PR p50 change Loki p50 PR ÷ Loki result vs Loki
⚪ drilldown service landing 1h defaults 19 ms 11 ms ⚪ -42% 119 ms 0.09× ✅ same
⚪ instant ungrouped rate instant defaults 7 ms 8 ms ⚪ +14% 129 ms 0.06× ✅ same
⚪ json rate by level (no filter, no drop) 1h defaults 400 400 ⚪ -33% 400 — ✅ same
⚪ json volume no filters 1h defaults 91 ms 90 ms ⚪ -1% 350 ms 0.26× ✅ same
⚪ logs plain 1h defaults 101 ms 92 ms ⚪ -9% 828 ms 0.11× ✅ same
⚪ logs | json 1h defaults 186 ms 181 ms ⚪ -3% 3.44 s 0.05× ✅ same
⚪ stream-label count by app 1h defaults 8 ms 8 ms ⚪ +0% 292 ms 0.03× ✅ same
⚪ topk rate by app 1h defaults 54 ms 44 ms ⚪ -19% 421 ms 0.10× ➖ differs (as base)
⚪ N1 sum by app of max by app,pod, count 1h defaults 10 ms 10 ms ⚪ +0% 42 ms 0.24× ✅ same
⚪ N10 instant min of avg, rate instant defaults 7 ms 8 ms ⚪ +14% 95 ms 0.08× ✅ same
⚪ N11 instant three levels instant defaults 6 ms 7 ms ⚪ +17% 73 ms 0.10× ✅ same
⚪ N12 instant json inner, count of sum instant defaults 18 ms 19 ms ⚪ +6% 84 ms 0.23× ✅ same
⚪ N13 instant without under by instant defaults 17 ms 19 ms ⚪ +12% 94 ms 0.20× ✅ same
⚪ N14 sliding sum of max 1h defaults 509 ms 513 ms ⚪ +1% 119 ms 4.31× ✅ same
⚪ N15 sliding sums only 1h defaults 10 ms 10 ms ⚪ +0% 77 ms 0.13× ✅ same
⚪ N16 innermost without under by, tumbling 1h defaults 12 ms 10 ms ⚪ -17% 34 ms 0.29× ✅ same
⚪ N2 max by namespace of sum by namespace,app, rate 1h defaults 8 ms 7 ms ⚪ -12% 28 ms 0.25× ✅ same
⚪ N3 count by namespace of sum by namespace,app 1h defaults 6 ms 6 ms ⚪ +0% 26 ms 0.23× ✅ same
⚪ N4 avg by app of min by app,pod 1h defaults 9 ms 9 ms ⚪ +0% 33 ms 0.27× ✅ same
⚪ N5 three levels, max min sum 1h defaults 6 ms 6 ms ⚪ +0% 28 ms 0.21× ✅ same
⚪ N6 json inner, sum of max 1h defaults 12 ms 9 ms ⚪ -25% 30 ms 0.30× ✅ same
⚪ N7 logfmt inner, max of sum 1h defaults 6 ms 6 ms ⚪ +0% 11 ms 0.55× ✅ same
⚪ N8 without over a named by level, tumbling 1h defaults 9 ms 8 ms ⚪ -11% 31 ms 0.26× ✅ same
⚪ N9 instant sum of max instant defaults 7 ms 7 ms ⚪ +0% 87 ms 0.08× ✅ same
⚪ G1 logfmt amount sum_over_time, no filter 1h defaults 7 ms 7 ms ⚪ +0% 17 ms 0.41× ✅ same
⚪ G10 logfmt latency_ms sum_over_time, production 1h defaults 15 ms 15 ms ⚪ +0% 159 ms 0.09× ➖ differs (as base)
⚪ G11 logfmt amount sum_over_time, instant instant defaults 7 ms 7 ms ⚪ +0% 14 ms 0.50× ✅ same
⚪ G12 json duration_ms sum_over_time, instant instant defaults 37 ms 37 ms ⚪ +0% 32 ms 1.16× ✅ same
⚪ G2 json duration_ms sum_over_time, no filter 1h defaults 8 ms 8 ms ⚪ +0% 41 ms 0.20× ✅ same
⚪ G3 logfmt amount sum_over_time, error filter 1h defaults 7 ms 6 ms ⚪ -14% 15 ms 0.40× ✅ same
⚪ G4 json duration_ms sum_over_time, error filter 1h defaults 8 ms 8 ms ⚪ +0% 36 ms 0.22× ✅ same
⚪ G5 logfmt amount sum by rate 1h defaults 6 ms 6 ms ⚪ +0% 14 ms 0.43× ✅ same
⚪ G6 json duration_ms sum by rate 1h defaults 9 ms 8 ms ⚪ -11% 36 ms 0.22× ✅ same
⚪ G7 duration() of a unit string 1h defaults 18 ms 18 ms ⚪ +0% 13 ms 1.38× ✅ same
⚪ G8 bytes() of a number 1h defaults 15 ms 14 ms ⚪ -7% 12 ms 1.17× ✅ same
⚪ G9 json duration_ms max_over_time 1h defaults 8 ms 7 ms ⚪ -12% 131 ms 0.05× ✅ same
⚪ W1 sum without pod, max_over_time 1h defaults 43 ms 43 ms ⚪ +0% 22 ms 1.95× ✅ same
⚪ W2 sum without pod, sum_over_time 1h defaults 44 ms 43 ms ⚪ -2% 18 ms 2.39× ✅ same
⚪ W3 sum without pod, rate 1h defaults 55 ms 56 ms ⚪ +2% 18 ms 3.11× ✅ same
⚪ W4 max without pod, max_over_time 1h defaults 38 ms 38 ms ⚪ +0% 19 ms 2.00× ✅ same
⚪ W5 sum without pod, max_over_time, instant instant defaults 7 ms 7 ms ⚪ +0% 15 ms 0.47× ✅ same
⚪ W6 sum without pod, rate, instant instant defaults 8 ms 9 ms ⚪ +12% 22 ms 0.41× ✅ same
⚪ W7 topk 5 of sum without pod 1h defaults 38 ms 38 ms ⚪ +0% 18 ms 2.11× ✅ same
⚪ W8 sum without pod, count_over_time (production) 1h defaults 332 ms 342 ms ⚪ +3% 58 ms 5.90× ✅ same
⚪ W9 label_replace control, instant instant defaults 4 ms 4 ms ⚪ +0% 89 ms 0.04× ✅ same
⚪ U1 logfmt amount rate 1h defaults 6 ms 7 ms ⚪ +17% 16 ms 0.44× ✅ same
⚪ U2 json duration_ms rate 1h defaults 7 ms 7 ms ⚪ +0% 31 ms 0.23× ✅ same
⚪ U3 json duration_ms rate, error filter 1h defaults 7 ms 7 ms ⚪ +0% 31 ms 0.23× ✅ same
⚪ U4 logfmt latency_ms rate, production 1h defaults 12 ms 12 ms ⚪ +0% 136 ms 0.09× ➖ differs (as base)
⚪ U5 logfmt amount rate, instant instant defaults 10 ms 13 ms ⚪ +30% 11 ms 1.18× ✅ same
⚪ U6 json duration_ms rate, instant instant defaults 13 ms 12 ms ⚪ -8% 23 ms 0.52× ✅ same
⚪ U7 json duration_ms sum_over_time, instant instant defaults 14 ms 17 ms ⚪ +21% 22 ms 0.77× ✅ same
⚪ U8 logfmt amount rate by service (grouped) 1h defaults 6 ms 6 ms ⚪ +0% 14 ms 0.43× ✅ same
⚪ U9 logfmt amount rate_counter (folded per series) 1h defaults 279 ms 275 ms ⚪ -1% 37 ms 7.43× ➖ differs (as base)
Cold (first-run) timings — what a user opening a panel sees
shape range Loki profile base cold PR cold Loki cold PR ÷ Loki cold
drilldown service landing 1h defaults 42 ms 38 ms 1.59 s 0.02×
instant ungrouped rate instant defaults 7 ms 12 ms 94 ms 0.13×
json rate by level (no filter, no drop) 1h defaults 400 400 400 —
json volume no filters 1h defaults 353 ms 424 ms 2.54 s 0.17×
logs plain 1h defaults 218 ms 159 ms 1.31 s 0.12×
logs | json 1h defaults 365 ms 341 ms 2.79 s 0.12×
stream-label count by app 1h defaults 22 ms 21 ms 1.79 s 0.01×
topk rate by app 1h defaults 56 ms 48 ms 1.76 s 0.03×
N1 sum by app of max by app,pod, count 1h defaults 66 ms 59 ms 998 ms 0.06×
N10 instant min of avg, rate instant defaults 7 ms 6 ms 103 ms 0.06×
N11 instant three levels instant defaults 16 ms 7 ms 126 ms 0.06×
N12 instant json inner, count of sum instant defaults 26 ms 18 ms 85 ms † —
N13 instant without under by instant defaults 24 ms 19 ms 93 ms 0.20×
N14 sliding sum of max 1h defaults 627 ms 613 ms 1.44 s 0.42×
N15 sliding sums only 1h defaults 27 ms 25 ms 783 ms 0.03×
N16 innermost without under by, tumbling 1h defaults 63 ms 59 ms 891 ms 0.07×
N2 max by namespace of sum by namespace,app, rate 1h defaults 25 ms 24 ms 621 ms 0.04×
N3 count by namespace of sum by namespace,app 1h defaults 18 ms 21 ms 730 ms † —
N4 avg by app of min by app,pod 1h defaults 63 ms 55 ms 817 ms 0.07×
N5 three levels, max min sum 1h defaults 19 ms 26 ms 755 ms 0.03×
N6 json inner, sum of max 1h defaults 160 ms 145 ms 528 ms 0.27×
N7 logfmt inner, max of sum 1h defaults 24 ms 32 ms 87 ms 0.37×
N8 without over a named by level, tumbling 1h defaults 63 ms 61 ms 1.20 s 0.05×
N9 instant sum of max instant defaults 8 ms 10 ms 88 ms 0.11×
G1 logfmt amount sum_over_time, no filter 1h defaults 52 ms 50 ms 75 ms 0.67×
G10 logfmt latency_ms sum_over_time, production 1h defaults 674 ms 687 ms 1.25 s 0.55×
G11 logfmt amount sum_over_time, instant instant defaults 7 ms 7 ms 13 ms 0.54×
G12 json duration_ms sum_over_time, instant instant defaults 38 ms 41 ms 31 ms 1.32×
G2 json duration_ms sum_over_time, no filter 1h defaults 108 ms 94 ms 227 ms 0.41×
G3 logfmt amount sum_over_time, error filter 1h defaults 43 ms 44 ms 68 ms 0.65×
G4 json duration_ms sum_over_time, error filter 1h defaults 95 ms 93 ms 226 ms 0.41×
G5 logfmt amount sum by rate 1h defaults 20 ms 31 ms 65 ms ↺ 0.48×
G6 json duration_ms sum by rate 1h defaults 93 ms 101 ms 229 ms 0.44×
G7 duration() of a unit string 1h defaults 70 ms 69 ms 62 ms 1.11×
G8 bytes() of a number 1h defaults 68 ms 67 ms 53 ms 1.26×
G9 json duration_ms max_over_time 1h defaults 98 ms 97 ms 2.44 s 0.04×
W1 sum without pod, max_over_time 1h defaults 103 ms 84 ms 89 ms 0.94×
W2 sum without pod, sum_over_time 1h defaults 85 ms 77 ms 81 ms 0.95×
W3 sum without pod, rate 1h defaults 96 ms 93 ms 79 ms 1.18×
W4 max without pod, max_over_time 1h defaults 37 ms 38 ms 88 ms 0.43×
W5 sum without pod, max_over_time, instant instant defaults 8 ms 7 ms 15 ms 0.47×
W6 sum without pod, rate, instant instant defaults 7 ms 10 ms 16 ms 0.62×
W7 topk 5 of sum without pod 1h defaults 40 ms 38 ms 91 ms 0.42×
W8 sum without pod, count_over_time (production) 1h defaults 394 ms 400 ms 522 ms 0.77×
W9 label_replace control, instant instant defaults 4 ms 4 ms 90 ms 0.04×
U1 logfmt amount rate 1h defaults 50 ms 42 ms 64 ms 0.66×
U2 json duration_ms rate 1h defaults 92 ms 87 ms 175 ms 0.50×
U3 json duration_ms rate, error filter 1h defaults 97 ms 91 ms 187 ms 0.49×
U4 logfmt latency_ms rate, production 1h defaults 367 ms 372 ms 1.01 s 0.37×
U5 logfmt amount rate, instant instant defaults 7 ms 7 ms 15 ms 0.47×
U6 json duration_ms rate, instant instant defaults 12 ms 12 ms 23 ms 0.52×
U7 json duration_ms sum_over_time, instant instant defaults 14 ms 18 ms 22 ms 0.82×
U8 logfmt amount rate by service (grouped) 1h defaults 52 ms 45 ms 65 ms 0.69×
U9 logfmt amount rate_counter (folded per series) 1h defaults 291 ms 287 ms 333 ms † —

† Loki's results cache answered this cold run (its own counters, or identical answers for windows a minute apart): not a computed time, so it is in no ratio.

↺ Loki cold taken from the first set that ran the same query; Loki's cache answered this one.

3 shape×range above 2× Loki already (listed, or as slow on the base build)
profile mode shape range PR Loki PR ÷ Loki base ÷ Loki listed ÷ Loki why
known defaults warm U9 logfmt amount rate_counter (folded per series) 1h 275 ms 37 ms 7.43× 7.54× — as slow on base
known defaults warm W8 sum without pod, count_over_time (production) 1h 342 ms 58 ms 5.90× 5.72× — as slow on base
known defaults warm N14 sliding sum of max 1h 513 ms 119 ms 4.31× 4.28× — as slow on base
Why these shapes
  • internal/proxy/vector_matching.go → 47: control/stream-label count by app, nested-aggregation/N1 sum by app of max by app,pod, count, nested-aggregation/N10 instant min of avg, rate, nested-aggregation/N11 instant three levels, nested-aggregation/N12 instant json inner, count of sum, nested-aggregation/N13 instant without under by, nested-aggregation/N14 sliding sum of max, nested-aggregation/N15 sliding sums only …
  • control smoke → 8: control/drilldown service landing, control/instant ungrouped rate, control/json rate by level (no filter, no drop), control/json volume no filters, control/logs plain, control/logs | json, control/stream-label count by app, control/topk rate by app

base 24b95935d5 → PR 15f676ca3f · 4 runs (first is cold), warm p50 · ranges 1h · noise ±30% and 100 ms · VictoriaLogs restarts 0→0 · 3.0 min · phases stack_up 36s, seed_and_build 41s, loki-defaults:loki_profile 0s, loki-defaults:proxies 2s, loki-defaults:matrix 92s. Same runner, one fresh stack, targets interleaved per request. How to read and reproduce: bench/ab/README.md.

@github-actions

github-actions Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

✅ Visual smoke: passed

Base 24b95935d5 vs PR 896c4d1161, Grafana through the proxy builds and Loki on one fresh stack; run.
Core set: 5 capture(s) at 1h. Detailed set: 11 entries (explore-metric-plain, explore-unwrap-rate-sum, explore-unwrap-quantile-over-time, explore-unwrap-first-last-under-sum, explore-max-by-count-over-time-sliding, explore-nested-aggregation-outer-by, explore-without-over-inner-aggregation, explore-without-nested-under-aggregation, ...). 17 capture(s), 15m/1h/6h, 24h and 7d stay out of PR runs.
Trimmed to the 1h range for the capture budget: explore-unwrap-rate-sum, explore-unwrap-quantile-over-time, explore-unwrap-first-last-under-sum, explore-max-by-count-over-time-sliding, explore-nested-aggregation-outer-by, explore-without-over-inner-aggregation, explore-without-nested-under-aggregation, explore-sum-without-rate, explore-topk-sum-without, explore-sum-without-count.

page range set base = PR (data) vs Loki (PR) pixel diff result
dd-fields 1h core ✅ identical identical (4 explained, 1 history-dependent) 0.11% ✅
dd-landing 1h core ✅ identical identical (3 explained) 0.14% ✅
dd-service-logs 1h core ✅ identical identical (3 explained, 1 history-dependent) 0.11% ✅
explore-logs-plain 1h core ✅ identical identical (1 explained) 0.07% ✅
explore-metric-plain 1h core ✅ identical identical (1 explained) 0.04% ✅
explore-max-by-count-over-time-sliding 1h detailed ✅ identical identical (1 explained) 0.04% ✅
explore-metric-plain 15m detailed ✅ identical identical (1 explained) 0.04% ✅
explore-metric-plain 6h detailed ✅ identical n/a (beyond the Loki window) 0.04% ✅
explore-nested-aggregation-outer-by 1h detailed ✅ identical identical (1 explained) 0.04% ✅
explore-sum-without-count 1h detailed ✅ identical identical (1 explained) 0.04% ✅
explore-sum-without-rate 1h detailed ✅ identical identical (1 explained) 0.04% ✅
explore-topk-sum-without 1h detailed ✅ identical identical (1 explained) 0.04% ✅
explore-unwrap-first-last-under-sum 1h detailed ✅ identical 1 difference(s), 1 on base too; 1 explained 0.04% ✅
explore-unwrap-quantile-over-time 1h detailed ✅ identical identical (1 explained) 0.04% ✅
explore-unwrap-rate-sum 1h detailed ✅ identical identical (1 explained) 0.04% ✅
explore-without-nested-under-aggregation 1h detailed ✅ identical identical (1 explained) 0.04% ✅
explore-without-over-inner-aggregation 1h detailed ✅ identical identical (1 explained) 0.04% ✅

Gate: a base-vs-PR data difference passes when the PR is closer to Loki, and fails when the PR diverges from Loki or Loki cannot decide it (at a range Loki does not hold, a difference passes when the same page proved that query to answer like Loki at a shorter range; otherwise label the pull request visual-change-expected to accept an intended change). Also failing: a panel empty on the PR but not on the base, an error banner, panel error, error answer or new "No data" panel on the PR, a PR side that never settled, a difference that did not reproduce on the recapture. Pixel differences only warn.

Core set montages (5): base | PR | Loki

dd-fields-1h

dd-fields-1h

dd-landing-1h

dd-landing-1h

dd-service-logs-1h

dd-service-logs-1h

explore-logs-plain-1h

explore-logs-plain-1h

explore-metric-plain-1h

explore-metric-plain-1h

All montages of this run: pr-visuals/pr-742.

@github-actions

github-actions Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

PR Quality Report

Compared against base branch main.

Coverage and tests

Signal Base PR Delta
Test count 15642 15672 30
Coverage 88.7% 88.7% 0.0% (stable)

Compatibility

Track Base PR Delta
Loki API 100.0% 11/11 (100.0%) 0.0% (stable)
Logs Drilldown 100.0% 17/17 (100.0%) 0.0% (stable)
VictoriaLogs 100.0% 11/11 (100.0%) 0.0% (stable)

Performance smoke

Lower CPU cost (ns/op) is better. Lower benchmark memory cost (B/op, allocs/op) is better. Higher throughput is better. Lower load-test memory growth is better. Benchmark rows are medians from repeated samples.

Signal Base PR Delta
QueryRange cache-hit CPU cost 3180.0 ns/op 3181.0 ns/op +0.0% (stable)
QueryRange cache-hit memory 1240.0 B/op 1240.0 B/op 0.0% (stable)
QueryRange cache-hit allocations 27.0 allocs/op 27.0 allocs/op 0.0% (stable)
QueryRange cache-bypass CPU cost 3809.0 ns/op 3777.0 ns/op -0.8% (stable)
QueryRange cache-bypass memory 1296.0 B/op 1297.0 B/op +0.1% (stable)
QueryRange cache-bypass allocations 27.0 allocs/op 27.0 allocs/op 0.0% (stable)
Labels cache-hit CPU cost 945.2 ns/op 948.2 ns/op +0.3% (stable)
Labels cache-hit memory 48.0 B/op 48.0 B/op 0.0% (stable)
Labels cache-hit allocations 3.0 allocs/op 3.0 allocs/op 0.0% (stable)
Labels cache-bypass CPU cost 1516.0 ns/op 1538.0 ns/op +1.5% (stable)
Labels cache-bypass memory 399.0 B/op 399.0 B/op 0.0% (stable)
Labels cache-bypass allocations 14.0 allocs/op 14.0 allocs/op 0.0% (stable)

State

  • Coverage, compatibility, and sampled performance are reported here from the same PR workflow.
  • This is a delta report, not a release gate by itself. Required checks still decide merge safety.
  • Performance is a smoke comparison, not a full benchmark lab run.
  • Delta states use the same noise guards as the quality gate (percent + absolute + low-baseline checks), so report labels match merge-gate behavior.

@github-actions github-actions Bot added size/XL Extra large change and removed size/XL Extra large change labels Oct 12, 2026
szibis added a commit that referenced this pull request Oct 28, 2026
@szibis
szibis force-pushed the fix/binary-ignoring-matching branch 2 times, most recently from 6c2ff79 to 504ee73 Compare October 28, 2026 11:24
@github-actions github-actions Bot added size/XL Extra large change and removed size/XL Extra large change labels Oct 28, 2026
@szibis
szibis marked this pull request as ready for review October 28, 2026 11:27
…p where Loki fails

The right-hand duplicate error joined its two halves with "; " where Loki
v3.7.7 uses ";" (evaluator.go vectorBinop). The cardinality checks ran over
every step before the group-label checks, where Loki stops at the first
failing step. Adds a differential test against a reference written from
vectorBinop, an ignoring() edge table, handler tests on range and instant
queries and the live comparison with Loki.
@szibis
szibis force-pushed the fix/binary-ignoring-matching branch from 504ee73 to 896c4d1 Compare October 28, 2026 11:52
@github-actions github-actions Bot added size/XL Extra large change and removed size/XL Extra large change labels Oct 28, 2026
@szibis
szibis merged commit e13759d into main Oct 28, 2026
47 checks passed
@szibis
szibis deleted the fix/binary-ignoring-matching branch October 28, 2026 12:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugfix Bug fix scope/docs Documentation scope/proxy Proxy core scope/tests Tests size/XL Extra large change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant