Add error on enabling memory tracking in non-clustered mode (#15005)

Enabling memory tracking is forbidden during runtime if it is already
disabled. In non-clustered mode though the checks were incorrect so this
PR enforces the correct behavior in non-clustered environment.
This commit is contained in:
Mincho Paskalev
2026-05-15 18:35:07 +03:00
committed by GitHub
parent 0c1c747062
commit b1a53ea21f
2 changed files with 21 additions and 13 deletions
+1 -1
View File
@@ -2412,7 +2412,7 @@ static int isValidShutdownOnSigFlags(int val, const char **err) {
}
static int updateMemoryTrackingEnabled(const char **err) {
int memory_tracking_enabled = server.key_memory_histograms || clusterSlotStatsEnabled(CLUSTER_SLOT_STATS_MEM);
int memory_tracking_enabled = server.key_memory_histograms || (server.cluster_slot_stats_enabled & CLUSTER_SLOT_STATS_MEM);
if (!server.memory_tracking_enabled && memory_tracking_enabled) {
*err = "memory tracking cannot be enabled at runtime";
return 0;
+20 -12
View File
@@ -158,7 +158,7 @@ proc wait_for_replica_key_exists {key key_count} {
# Test cases for CLUSTER SLOT-STATS cpu-usec metric correctness.
# -----------------------------------------------------------------------------
start_cluster 1 0 {tags {external:skip cluster} overrides {cluster-slot-stats-enabled yes}} {
start_cluster 1 0 {tags {external:skip cluster}} {
# Define shared variables.
set key "FOO"
@@ -361,7 +361,7 @@ start_cluster 1 0 {tags {external:skip cluster} overrides {cluster-slot-stats-en
# Test cases for CLUSTER SLOT-STATS network-bytes-in.
# -----------------------------------------------------------------------------
start_cluster 1 0 {tags {external:skip cluster} overrides {cluster-slot-stats-enabled yes}} {
start_cluster 1 0 {tags {external:skip cluster}} {
# Define shared variables.
set key "key"
@@ -471,7 +471,7 @@ start_cluster 1 0 {tags {external:skip cluster} overrides {cluster-slot-stats-en
R 0 FLUSHALL
}
start_cluster 1 1 {tags {external:skip cluster} overrides {cluster-slot-stats-enabled yes}} {
start_cluster 1 1 {tags {external:skip cluster}} {
set channel "channel"
set key_slot [R 0 cluster keyslot $channel]
set metrics_to_assert [list network-bytes-in]
@@ -525,7 +525,6 @@ start_cluster 1 0 {tags {external:skip cluster}} {
set key_slot [R 0 cluster keyslot $key]
set expected_slots_to_key_count [dict create $key_slot 1]
set metrics_to_assert [list network-bytes-out]
R 0 CONFIG SET cluster-slot-stats-enabled yes
test "CLUSTER SLOT-STATS network-bytes-out, for non-slot specific commands." {
R 0 INFO
@@ -583,7 +582,6 @@ start_cluster 1 1 {tags {external:skip cluster}} {
set key "FOO"
set key_slot [R 0 CLUSTER KEYSLOT $key]
set metrics_to_assert [list network-bytes-out]
R 0 CONFIG SET cluster-slot-stats-enabled yes
# Setup replication.
assert {[s -1 role] eq {slave}}
@@ -616,7 +614,6 @@ start_cluster 1 1 {tags {external:skip cluster}} {
set channel_secondary "channel2"
set key_slot_secondary [R 0 cluster keyslot $channel_secondary]
set metrics_to_assert [list network-bytes-out]
R 0 CONFIG SET cluster-slot-stats-enabled yes
test "CLUSTER SLOT-STATS network-bytes-out, sharded pub/sub, single channel." {
set slot [R 0 cluster keyslot $channel]
@@ -700,7 +697,7 @@ start_cluster 1 1 {tags {external:skip cluster}} {
# Test cases for CLUSTER SLOT-STATS key-count metric correctness.
# -----------------------------------------------------------------------------
start_cluster 1 0 {tags {external:skip cluster} overrides {cluster-slot-stats-enabled yes}} {
start_cluster 1 0 {tags {external:skip cluster}} {
# Define shared variables.
set key "FOO"
@@ -785,7 +782,7 @@ start_cluster 1 0 {tags {external:skip cluster}} {
# Test cases for CLUSTER SLOT-STATS ORDERBY sub-argument.
# -----------------------------------------------------------------------------
start_cluster 1 0 {tags {external:skip cluster} overrides {cluster-slot-stats-enabled yes}} {
start_cluster 1 0 {tags {external:skip cluster}} {
set metrics [list "key-count" "memory-bytes" "cpu-usec" "network-bytes-in" "network-bytes-out"]
@@ -891,7 +888,7 @@ start_cluster 1 0 {tags {external:skip cluster} overrides {cluster-slot-stats-en
# Test cases for CLUSTER SLOT-STATS replication.
# -----------------------------------------------------------------------------
start_cluster 1 1 {tags {external:skip cluster} overrides {cluster-slot-stats-enabled yes}} {
start_cluster 1 1 {tags {external:skip cluster}} {
# Define shared variables.
set key "key"
@@ -994,7 +991,7 @@ start_cluster 1 1 {tags {external:skip cluster} overrides {cluster-slot-stats-en
R 1 CONFIG RESETSTAT
}
start_cluster 2 2 {tags {external:skip cluster} overrides {cluster-slot-stats-enabled yes}} {
start_cluster 2 2 {tags {external:skip cluster}} {
test "CLUSTER SLOT-STATS reset upon atomic slot migration" {
# key on slot-0
set key0 "{06S}mykey0"
@@ -1044,7 +1041,7 @@ start_cluster 2 2 {tags {external:skip cluster} overrides {cluster-slot-stats-en
# Test cases for CLUSTER SLOT-STATS memory-bytes field presence.
# -----------------------------------------------------------------------------
start_cluster 1 0 {tags {external:skip cluster} overrides {cluster-slot-stats-enabled yes}} {
start_cluster 1 0 {tags {external:skip cluster}} {
# Define shared variables.
set key "FOO"
set key_slot [R 0 cluster keyslot $key]
@@ -1174,7 +1171,7 @@ start_cluster 1 0 {tags {external:skip cluster} overrides {cluster-slot-stats-en
# may change object encoding (e.g., listTypeTryConversion).
# -----------------------------------------------------------------------------
start_cluster 1 0 {tags {external:skip cluster needs:debug} overrides {cluster-slot-stats-enabled yes}} {
start_cluster 1 0 {tags {external:skip cluster needs:debug}} {
# Enable debug assertion that validates memory tracking after each command.
# This will cause a panic if tracked memory doesn't match actual memory.
R 0 DEBUG ALLOCSIZE-SLOTS-ASSERT 1
@@ -1234,3 +1231,14 @@ start_cluster 1 0 {tags {external:skip cluster needs:debug} overrides {cluster-s
R 0 CONFIG SET list-max-listpack-size [lindex $origin_conf 1]
}
}
start_server {} {
test "CLUSTER SLOT-STATS memory tracking cannot be re-enabled after being disabled (non-clustered mode)" {
# Once memory tracking is disabled, it cannot be re-enabled at runtime
assert_error "ERR*memory tracking cannot be enabled at runtime*" {r CONFIG SET cluster-slot-stats-enabled yes}
assert_error "ERR*memory tracking cannot be enabled at runtime*" {r CONFIG SET cluster-slot-stats-enabled mem}
# But cpu and net can still be enabled
assert_match "OK" [r CONFIG SET cluster-slot-stats-enabled "cpu net"]
}
}