diff --git a/build/bazelutil/bazel-generate.sh b/build/bazelutil/bazel-generate.sh index d09a8b5b33c5..c6f91fe72671 100755 --- a/build/bazelutil/bazel-generate.sh +++ b/build/bazelutil/bazel-generate.sh @@ -55,14 +55,14 @@ else bazel run pkg/cmd/generate-staticcheck --run_under="cd $PWD && " fi +bazel run //:gazelle + if files_unchanged_from_upstream WORKSPACE $(find_relevant ./pkg/sql/logictest/logictestbase -name BUILD.bazel -or -name '*.go') $(find_relevant ./pkg/sql/logictest/testdata -name '*') $(find_relevant ./pkg/sql/sqlitelogictest -name BUILD.bazel -or -name '*.go') $(find_relevant ./pkg/ccl/logictestccl/testdata -name '*') $(find_relevant pkg/sql/opt/exec/execbuilder/testdata -name '*'); then echo "Skipping //pkg/cmd/generate-logictest (relevant files are unchanged from upstream)" else bazel run pkg/cmd/generate-logictest -- -out-dir="$PWD" fi -bazel run //:gazelle - if files_unchanged_from_upstream c-deps/archived.bzl c-deps/REPOSITORIES.bzl DEPS.bzl WORKSPACE $(find_relevant ./pkg/cmd/generate-distdir -name BUILD.bazel -or -name '*.go') $(find_relevant ./pkg/build/bazel -name BUILD.bazel -or -name '*.go') $(find_relevant pkg/build/starlarkutil -name BUILD.bazel -or -name '*.go'); then echo "Skipping //pkg/cmd/generate-distdir (relevant files are unchanged from upstream)." else diff --git a/pkg/sql/distsql_physical_planner.go b/pkg/sql/distsql_physical_planner.go index bbb8d0392334..12a3cd8787b6 100644 --- a/pkg/sql/distsql_physical_planner.go +++ b/pkg/sql/distsql_physical_planner.go @@ -13,7 +13,6 @@ package sql import ( "context" "fmt" - "math/rand" "reflect" "sort" @@ -135,8 +134,6 @@ type DistSQLPlanner struct { codec keys.SQLCodec clock *hlc.Clock - - rng *rand.Rand } // DistributionType is an enum defining when a plan should be distributed. @@ -182,7 +179,6 @@ func NewDistSQLPlanner( sqlInstanceProvider sqlinstance.Provider, clock *hlc.Clock, ) *DistSQLPlanner { - rng, _ := randutil.NewPseudoRand() dsp := &DistSQLPlanner{ planVersion: planVersion, st: st, @@ -203,7 +199,6 @@ func NewDistSQLPlanner( sqlInstanceProvider: sqlInstanceProvider, codec: codec, clock: clock, - rng: rng, } dsp.parallelLocalScansSem = quotapool.NewIntPool("parallel local scans concurrency", @@ -1300,6 +1295,7 @@ func (dsp *DistSQLPlanner) makeSQLInstanceIDForKVNodeIDTenantResolver( regionToSQLInstanceIDs[region] = instancesInRegion } + rng, _ := randutil.NewPseudoRand() if len(regionToSQLInstanceIDs) > 0 { // If we were able to determine the region information at least for some // instances, use the region-aware resolver. @@ -1332,7 +1328,7 @@ func (dsp *DistSQLPlanner) makeSQLInstanceIDForKVNodeIDTenantResolver( // favor those that are closed to the gateway. However, we need to // be careful since non-query code paths (like CDC and BulkIO) do // benefit from the even spread of the spans. - return instancesInRegion[dsp.rng.Intn(len(instancesInRegion))] + return instancesInRegion[rng.Intn(len(instancesInRegion))] } } else { // If it just so happens that we couldn't determine the region for all @@ -1341,7 +1337,7 @@ func (dsp *DistSQLPlanner) makeSQLInstanceIDForKVNodeIDTenantResolver( hasLocalitySet = false // Randomize the order in which we choose instances so that work is // allocated fairly across queries. - dsp.rng.Shuffle(len(instances), func(i, j int) { + rng.Shuffle(len(instances), func(i, j int) { instances[i], instances[j] = instances[j], instances[i] }) var i int diff --git a/pkg/sql/set_cluster_setting.go b/pkg/sql/set_cluster_setting.go index a3dfd262d26f..5b9c3b8ed5b4 100644 --- a/pkg/sql/set_cluster_setting.go +++ b/pkg/sql/set_cluster_setting.go @@ -238,6 +238,7 @@ func (n *setClusterSettingNode) startExec(params runParams) error { params.p.EvalContext(), params.extendedEvalCtx.Codec.ForSystemTenant(), params.p.logEvent, + params.p.descCollection.ReleaseLeases, ) if err != nil { return err @@ -317,6 +318,7 @@ func writeSettingInternal( evalCtx *eval.Context, forSystemTenant bool, logFn func(context.Context, descpb.ID, eventpb.EventPayload) error, + releaseLeases func(context.Context), ) (expectedEncodedValue string, err error) { err = execCfg.DB.Txn(ctx, func(ctx context.Context, txn *kv.Txn) error { var reportedValue string @@ -336,6 +338,7 @@ func writeSettingInternal( reportedValue, expectedEncodedValue, err = writeNonDefaultSettingValue( ctx, execCfg, setting, name, txn, user, st, value, forSystemTenant, + releaseLeases, ) if err != nil { return err @@ -384,6 +387,7 @@ func writeNonDefaultSettingValue( st *cluster.Settings, value tree.Datum, forSystemTenant bool, + releaseLeases func(context.Context), ) (reportedValue string, expectedEncodedValue string, err error) { // Stringify the value set by the statement for reporting in errors, logs etc. reportedValue = tree.AsStringWithFlags(value, tree.FmtBareStrings) @@ -398,7 +402,9 @@ func writeNonDefaultSettingValue( verSetting, isSetVersion := setting.(*settings.VersionSetting) if isSetVersion { if err := setVersionSetting( - ctx, execCfg, verSetting, name, txn, user, st, value, encoded, forSystemTenant); err != nil { + ctx, execCfg, verSetting, name, txn, user, st, value, encoded, + forSystemTenant, releaseLeases, + ); err != nil { return reportedValue, expectedEncodedValue, err } } else { @@ -438,6 +444,7 @@ func setVersionSetting( value tree.Datum, encoded string, forSystemTenant bool, + releaseLeases func(context.Context), ) error { // In the special case of the 'version' cluster setting, // we must first read the previous value to validate that the @@ -534,6 +541,12 @@ func setVersionSetting( }) } + // If we're here, we know we aren't in a transaction because we don't + // allow setting cluster settings in a transaction. We need to release + // our leases because the underlying migrations may affect descriptors + // we currently have a lease for. We don't need to hold on to any leases + // because the code isn't relying on them. + releaseLeases(ctx) return runMigrationsAndUpgradeVersion( ctx, execCfg, user, prev, value, updateVersionSystemSetting, ) diff --git a/pkg/ui/workspaces/db-console/src/util/proto.ts b/pkg/ui/workspaces/db-console/src/util/proto.ts index a80767eaebb2..fb6eb0cc9dc0 100644 --- a/pkg/ui/workspaces/db-console/src/util/proto.ts +++ b/pkg/ui/workspaces/db-console/src/util/proto.ts @@ -64,6 +64,8 @@ export namespace MetricConstants { export const liveBytes: string = "livebytes"; export const keyBytes: string = "keybytes"; export const valBytes: string = "valbytes"; + export const rangeKeyBytes: string = "rangekeybytes"; + export const rangeValBytes: string = "rangevalbytes"; export const totalBytes: string = "totalbytes"; export const intentBytes: string = "intentbytes"; export const liveCount: string = "livecount"; diff --git a/pkg/ui/workspaces/db-console/src/views/cluster/containers/nodeOverview/index.tsx b/pkg/ui/workspaces/db-console/src/views/cluster/containers/nodeOverview/index.tsx index 805eb6da7df2..d6c1d75f3b20 100644 --- a/pkg/ui/workspaces/db-console/src/views/cluster/containers/nodeOverview/index.tsx +++ b/pkg/ui/workspaces/db-console/src/views/cluster/containers/nodeOverview/index.tsx @@ -44,6 +44,8 @@ import { NodeUsedCapacityTooltip, NodeAvailableCapacityTooltip, NodeMaximumCapacityTooltip, + MVCCRangeKeyBytesTooltip, + MVCCRangeValueBytesTooltip, } from "./tooltips"; import { TooltipProps } from "src/components/tooltip/tooltip"; @@ -187,6 +189,24 @@ export class NodeOverview extends React.Component { nodeName={nodesSummary.nodeDisplayNameByID[node.desc.node_id]} CellTooltip={ValueBytesTooltip} /> + + Bytes(metrics[MetricConstants.rangeKeyBytes] || 0) + } + nodeName={nodesSummary.nodeDisplayNameByID[node.desc.node_id]} + CellTooltip={MVCCRangeKeyBytesTooltip} + /> + + Bytes(metrics[MetricConstants.rangeValBytes] || 0) + } + nodeName={nodesSummary.nodeDisplayNameByID[node.desc.node_id]} + CellTooltip={MVCCRangeValueBytesTooltip} + /> ); +export const MVCCRangeKeyBytesTooltip: React.FC< + TooltipProps & { + nodeName: string; + } +> = props => ( + +

+ Number of bytes stored in MVCC range keys on node{" "} + {props.nodeName || "NodeName"}. +

+ + } + > + {props.children} +
+); + +export const MVCCRangeValueBytesTooltip: React.FC< + TooltipProps & { + nodeName: string; + } +> = props => ( + +

+ Number of bytes stored in MVCC range values on node{" "} + {props.nodeName || "NodeName"}. +

+ + } + > + {props.children} +
+); + export const IntentBytesTooltip: React.FC = props => ( { FixLong(mvcc.val_bytes), FixLong(mvcc.val_count), ), + mvccRangeKeyBytesCount: this.contentMVCC( + FixLong(mvcc.range_key_bytes || 0), + FixLong(mvcc.range_key_count || 0), + ), + mvccRangeValueBytesCount: this.contentMVCC( + FixLong(mvcc.range_val_bytes || 0), + FixLong(mvcc.range_val_count || 0), + ), mvccIntentBytesCount: this.contentMVCC( FixLong(mvcc.intent_bytes), FixLong(mvcc.intent_count),