|
| 1 | +// Copyright 2024 The Cockroach Authors. |
| 2 | +// |
| 3 | +// Use of this software is governed by the CockroachDB Software License |
| 4 | +// included in the /LICENSE file. |
| 5 | + |
| 6 | +package tests |
| 7 | + |
| 8 | +import ( |
| 9 | + "context" |
| 10 | + "math/rand" |
| 11 | + |
| 12 | + "github.com/cockroachdb/cockroach/pkg/cmd/roachtest/cluster" |
| 13 | + "github.com/cockroachdb/cockroach/pkg/cmd/roachtest/registry" |
| 14 | + "github.com/cockroachdb/cockroach/pkg/cmd/roachtest/roachtestutil" |
| 15 | + "github.com/cockroachdb/cockroach/pkg/cmd/roachtest/roachtestutil/mixedversion" |
| 16 | + "github.com/cockroachdb/cockroach/pkg/cmd/roachtest/spec" |
| 17 | + "github.com/cockroachdb/cockroach/pkg/cmd/roachtest/test" |
| 18 | + "github.com/cockroachdb/cockroach/pkg/roachprod/logger" |
| 19 | + "github.com/cockroachdb/errors" |
| 20 | +) |
| 21 | + |
| 22 | +func registerKVProberMixedVersion(r registry.Registry) { |
| 23 | + r.Add(registry.TestSpec{ |
| 24 | + Name: "kv-prober/mixed-version", |
| 25 | + Owner: registry.OwnerObservability, |
| 26 | + Cluster: r.MakeClusterSpec(5, spec.WorkloadNode()), |
| 27 | + CompatibleClouds: registry.AllClouds, |
| 28 | + Suites: registry.Suites(registry.MixedVersion, registry.Nightly), |
| 29 | + Run: runKVProberMixedVersion, |
| 30 | + }) |
| 31 | +} |
| 32 | + |
| 33 | +// runKVProber tests that accessing crdb_internal_probe_ranges works across mixed version clusters. |
| 34 | +func runKVProberMixedVersion(ctx context.Context, t test.Test, c cluster.Cluster) { |
| 35 | + mvt := mixedversion.NewTest(ctx, t, t.L(), c, |
| 36 | + c.CRDBNodes(), |
| 37 | + // We test only upgrades from ?? because it is earliest supported version. |
| 38 | + mixedversion.MinimumSupportedVersion("v23.2.0"), |
| 39 | + ) |
| 40 | + |
| 41 | + // Not sure if using a kv heavy workload is necessary for this... |
| 42 | + initWorkload := roachtestutil.NewCommand("./cockroach workload init tpcc"). |
| 43 | + Arg("{pgurl%s}", c.CRDBNodes()) |
| 44 | + runWorkload := roachtestutil.NewCommand("./cockroach workload run tpcc"). |
| 45 | + Arg("{pgurl%s}", c.CRDBNodes()). |
| 46 | + Option("tolerate-errors") |
| 47 | + |
| 48 | + kvProbeRead := func(ctx context.Context, l *logger.Logger, r *rand.Rand, h *mixedversion.Helper) error { |
| 49 | + var kv_errors int |
| 50 | + if err := h.QueryRow(r, `select COUNT(error) from crdb_internal.probe_ranges(INTERVAL '1s', 'read') WHERE error != ''`).Scan(&kv_errors); err != nil { |
| 51 | + return errors.Wrap(err, "querying crdb_internal.probe_ranges(INTERVAL '1s', 'read')") |
| 52 | + } |
| 53 | + l.Printf("Successfully queried crdb_internal.probe_ranges(INTERVAL '1s', 'read')") |
| 54 | + return nil |
| 55 | + } |
| 56 | + |
| 57 | + kvProbeWrite := func(ctx context.Context, l *logger.Logger, r *rand.Rand, h *mixedversion.Helper) error { |
| 58 | + var kv_errors int |
| 59 | + if err := h.QueryRow(r, `select COUNT(error) from crdb_internal.probe_ranges(INTERVAL '1s', 'write') WHERE error != ''`).Scan(&kv_errors); err != nil { |
| 60 | + return errors.Wrap(err, "querying crdb_internal.probe_ranges(INTERVAL '1s', 'write')") |
| 61 | + } |
| 62 | + l.Printf("Successfully queried crdb_internal.probe_ranges(INTERVAL '1s', 'write')") |
| 63 | + return nil |
| 64 | + } |
| 65 | + |
| 66 | + stopTpcc := mvt.Workload("tpcc", c.WorkloadNode(), initWorkload, runWorkload) |
| 67 | + defer stopTpcc() |
| 68 | + |
| 69 | + mvt.InMixedVersion("check kv prober reads", kvProbeRead) |
| 70 | + mvt.InMixedVersion("check kv prober writes", kvProbeWrite) |
| 71 | + |
| 72 | + mvt.Run() |
| 73 | +} |
0 commit comments