Conversation
redis/redis#15722 (merged 2026-09-15, backported to 8.2/8.4/8.6 the same day) introduces cluster-bus-port-protected-mode, defaulting to yes. A node started with cluster-enabled yes and tls-cluster disabled now refuses to start, because its cluster bus port would be unauthenticated. That is exactly how the oss-cluster env is built, so every shard of it dies at startup and all cluster-topology tests fail at connect with "Connection refused". The refusal happens during config validation, before the server opens its logfile, so the only artifact left behind is an empty log - which made this expensive to diagnose downstream (MOD-18751: every oss-cluster leg of the RedisTimeSeries, RedisBloom and RedisJSON nightlies, public and dev forks, x64, arm64 and macOS, red since 2026-09-15). Waive the protection: the bus ports of a test env are bound to localhost on an ephemeral host, which is the condition the directive documents for waiving it, and redis waived it the same way in its own harness in that PR. It grants no new exposure, since the bus port was equally unauthenticated before. The tls-cluster path is untouched and keeps authenticating the bus. The option does not exist before 8.2.10 / 8.4.7 / 8.6.7 / 8.9.241, and an unknown directive is itself fatal, so pass it only to a server that knows it. Reuse the version we already read, rather than calling _getRedisVersion() a second time per shard: it spawns redis-server --version and polls in 0.1s steps. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
This fixes the nightly Redis startup failure, but the version gate introduces a compatibility regression that should be addressed before merging.
The same issue affects older development binaries: I reproduced it with a I recommend cached capability detection against the actual Redis binary rather than relying solely on version numbers. Alternatively, add the missing release-line boundaries and probe ambiguous development versions. Please add regression coverage for these cases; the current predicate tests do not cover them. Validation against PR head
|
|
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #255 +/- ##
==========================================
+ Coverage 32.46% 35.15% +2.69%
==========================================
Files 17 18 +1
Lines 2597 2745 +148
==========================================
+ Hits 843 965 +122
- Misses 1754 1780 +26
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
The version gate was wrong for four bands of redis. cluster-bus-port-protected- mode was added mid-release-line and backported, so the first release carrying it differs per line - 8.2.10, 8.4.7, 8.6.7, 8.8.3 and 8.10.2 - and the gate claimed support from 8.8.0 and 8.10.0, where the option does not exist. It also claimed support for any development build, whose placeholder version says nothing about the commit it was built from. In each of those cases the option was passed to a redis that rejects it, turning a working plain-cluster environment into the very startup failure this change exists to fix. Adding the two missing boundaries would patch the symptom and leave the cause: a version number cannot say which commit a binary came from, so the next backport or development build breaks it again. So ask the binary. It is started once, with --port 0 so that it exits as soon as its configuration has loaded, which neither binds a port nor leaves a server behind; an unknown directive is rejected earlier, while the configuration is still being parsed. The answer is cached per binary path, as it is needed once per server started. Tests cover the bands the version gate got wrong, using a stand-in redis whose reported version and actual support for the option disagree - which is exactly what a version number cannot get right. Verified as well against a real redis 7.2.6, which correctly probes as unsupported. Found in review by gabsow, who also reproduced the development-build case. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Thanks — you're right, and the reproduction was the useful part. Pushed Confirming your boundaries independently. The backport landed on every line the same day, and the release that carries it is the next tag on each:
So the gate was wrong on exactly the bands you name. 8.8.0 encodes as Why the probe rather than the missing boundaries. Adding 8.8.3 and 8.10.2 rows fixes these two bands and leaves the cause in place: a version number cannot say which commit a binary was built from, so the next backport, or any development build, reopens it. Your How it works. The binary is started once with The result is cached per binary path, since it is asked once per server started. Regression coverage, as requested. One process note: CI on this PR needed a maintainer to approve the fork run, and this push may well need approving again. |
|
@LiranAbir I checked The real older development binary ( There is no Could you please:
Local validation of this exact revision: 43 unit tests passed, 4 skipped; the nightly Redis revision Please also refresh the PR description: it still describes the removed version gate. The option was backported, but those released branches default protection to off; the breaking default applies to the new development line intended for 8.12+. |
| '--cluster-node-timeout', '5000' if self.clusterNodeTimeout is None else str(self.clusterNodeTimeout)] | ||
| if self.useTLS: | ||
| cmdArgs += ['--tls-cluster', 'yes'] | ||
| elif hasClusterBusProtectedMode(self.redisBinaryPath): |
There was a problem hiding this comment.
Can we maybe just add this a a parameter?
|
@LiranAbir We also need explicit caller control: please add an optional Suggested contract:
This gives the test setup control over its chosen Redis binary instead of requiring Please ensure an explicit value is honored, is forwarded to every relevant cluster node, and participates in environment comparison so RLTest cannot reuse an environment created with a different setting. Tests should cover omitted/false/true values and forwarding through This is a request to update your PR; no changes have been pushed to your branch from our side. |
Replaces the capability probe of the previous two commits, and with it the attempt to have RLTest work out on its own whether to pass the option. Nothing available to RLTest can decide that. cluster-bus-port-protected-mode was added by redis/redis#15722 and backported mid-line, so support does not follow from a version number: 8.2.10, 8.4.7, 8.6.7, 8.8.3 and 8.10.2 have it while their earlier patches do not, and the 8.12 line that enables it by default reports 8.9.241 in version.h - the same version as builds from before the change, which reject the option. Probing the binary instead needed the server's own diagnostics to tell acceptance from rejection, and those differ per build, as review of the previous commit showed. The caller does know, because it knows what it built. So take it as an option, the way every other flag here is taken: clusterBusPortProtectedMode on StandardEnv and Env, Defaults.cluster_bus_port_protected_mode, and --cluster_bus_port_protected_mode on the command line. None, the default, passes nothing and leaves behaviour as it is today. Only a cluster node opens a bus port, so the option is emitted alongside the other cluster directives and never for a standalone or replica process. MOD-18751. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Without it in EnvCompareParams, a test asking for a different setting can be handed a reused environment whose shards were started with the previous one, and the difference is invisible: the option changes whether a node will start at all, not anything observable on a node that did start. Requested in review by gabsow. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
@gabsow Your latest comment is what Against your contract:
Validation. Built redis at
The first row is MOD-18751 reproduced on a real binary and the second is it cleared, so the fix is confirmed end to end rather than only in argv. Two things to settle: Parameter name. You wrote Unit tests. Not in this push. The behaviour is covered by the validation above, but there is no committed test for omitted/false/true or for the |
|
@gabsow Closing out the two open points. Parameter name stays Unit tests are not being added in this PR. The behaviour is covered by the end-to-end validation in my previous comment — a real 3-shard No further changes planned. |
…le line (RediSearch#11545) * [MOD-18751] Disable cluster-bus-port-protected-mode for oss-cluster tests on unstable redis/redis#15722 added cluster-bus-port-protected-mode, defaulting to enabled on the unstable line. RLTest builds oss-cluster shards with tls-cluster disabled, so the new default treats the cluster bus port as unauthenticated and every shard refuses to start -- every coordinator flow-test job in the nightly matrix has failed this way since 2026-09-15. Bump rltest to 0.7.29 (RedisLabsModules/RLTest#255), which adds --cluster_bus_port_protected_mode, and pass "no" for it in the coordinator flow-test step, gated on redis-ref == 'unstable' since pinned release refs don't have the option yet and reject it outright. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * Trim comments to match single-line style used nearby Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…#1644) * MOD-18751: waive cluster bus protected mode for the oss-cluster phase redis/redis#15722 added cluster-bus-port-protected-mode, and on the 8.12 line it defaults to enabled: a node started with cluster-enabled and without tls-cluster then refuses to start, because its cluster bus port would be unauthenticated. That is how the oss-cluster phase is built, so every shard dies at startup and each test fails at connect with "Connection refused". The refusal happens while the configuration is validated, before the server opens its logfile, so the retained logs are empty and say nothing about the cause. Waive it for that phase. The bus ports here are bound to localhost on an ephemeral host, which is the condition the directive documents for waiving, and they were equally unauthenticated before the redis change - which only made running them an explicit choice. The option is not passed blind, because a redis that does not have it rejects the directive and fails to start the same way. RLTest takes it as an option rather than guessing, since nothing it can see distinguishes a build that has the option from one that does not: the 8.12 line reports 8.9.241 in version.h, the same as builds from before the change. CLUSTER_BUS_PROTECTED_MODE= omits it for anyone running the cluster phase against an older redis locally. The tls_cluster phase is left alone, since tls-cluster authenticates the bus, and so is the existing-env phase, where RLTest starts no servers. Requires RLTest with the option (RedisLabsModules/RLTest#255). * Trigger CI to build the image locally, so it installs RLTest 0.7.29 * Set CLUSTER_BUS_ARGS before the ENV_ONLY branch can use it run_env interpolates CLUSTER_BUS_ARGS for COORD=oss, but the ENV_ONLY branch calls run_env and exits 20 lines before the assignment, so that path started its cluster without the waiver and the shards refused to start on 8.12. Moving the assignment above the branch; it depends on nothing in between. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…#1068) * MOD-18751: waive cluster bus protected mode for the oss-cluster phase redis/redis#15722 added cluster-bus-port-protected-mode, and on the 8.12 line it defaults to enabled: a node started with cluster-enabled and without tls-cluster then refuses to start, because its cluster bus port would be unauthenticated. That is how the oss-cluster phase is built, so every shard dies at startup and each test fails at connect with "Connection refused". The refusal happens while the configuration is validated, before the server opens its logfile, so the retained logs are empty and say nothing about the cause. Waive it for that phase. The bus ports here are bound to localhost on an ephemeral host, which is the condition the directive documents for waiving, and they were equally unauthenticated before the redis change - which only made running them an explicit choice. The option is not passed blind, because a redis that does not have it rejects the directive and fails to start the same way. RLTest takes it as an option rather than guessing, since nothing it can see distinguishes a build that has the option from one that does not: the 8.12 line reports 8.9.241 in version.h, the same as builds from before the change. CLUSTER_BUS_PROTECTED_MODE= omits it for anyone running the cluster phase against an older redis locally. The tls_cluster phase is left alone, since tls-cluster authenticates the bus, and so is the existing-env phase, where RLTest starts no servers. Requires RLTest with the option (RedisLabsModules/RLTest#255). * Trigger CI to build the image locally, so it installs RLTest 0.7.29 * MOD-18341 - Cap redis-py below 6 so the flow suite keeps a usable client Nothing here pinned the client, and RLTest's own requirement is uncapped (redis = ">=5.0.0"), so pip installs redis-py 8.1.0. From redis-py 6 on, a connection pool carries kwargs that Redis.__init__ does not accept, so the tests that rebuild a raw client out of an existing pool's connection_kwargs fail: raw = redis.Redis(**kwargs) TypeError: Redis.__init__() got an unexpected keyword argument 'himport_registry' That is every build-linux leg on both architectures, on four tests in test_cms and test_overall. Pin the client to the 5.x series, which is what the previous RLTest pin was capping it to in effect.
…ack (#2194) * MOD-18751: waive cluster bus protected mode for the oss-cluster phase redis/redis#15722 added cluster-bus-port-protected-mode, and on the 8.12 line it defaults to enabled: a node started with cluster-enabled and without tls-cluster then refuses to start, because its cluster bus port would be unauthenticated. That is how the oss-cluster phase is built, so every shard dies at startup and each test fails at connect with "Connection refused". The refusal happens while the configuration is validated, before the server opens its logfile, so the retained logs are empty and say nothing about the cause. Waive it for that phase. The bus ports here are bound to localhost on an ephemeral host, which is the condition the directive documents for waiving, and they were equally unauthenticated before the redis change - which only made running them an explicit choice. The option is not passed blind, because a redis that does not have it rejects the directive and fails to start the same way. RLTest takes it as an option rather than guessing, since nothing it can see distinguishes a build that has the option from one that does not: the 8.12 line reports 8.9.241 in version.h, the same as builds from before the change. CLUSTER_BUS_PROTECTED_MODE= omits it for anyone running the cluster phase against an older redis locally. The tls_cluster phase is left alone, since tls-cluster authenticates the bus, and so is the existing-env phase, where RLTest starts no servers. Requires RLTest with the option (RedisLabsModules/RLTest#255). * Keep the waiver inside the oss-cluster phase Setting it on RLTEST_ARGS in the OSS_CLUSTER block leaks into the tls_cluster block below, which is a separate if and inherits the parent shell's value - the tls_cluster phase was getting the option too, which this change had claimed it would not. Set it inside each oss-cluster invocation's own subshell instead, as the other phases do. Found by dry-running tests.sh with NOP=1 and reading the generated RLTest configuration per phase. Verified after: one occurrence, in "tests on OSS cluster" only; the general, slaves, AOF and tls_cluster phases carry none. Note the pre-existing duplicate --cluster_node_timeout in the tls_cluster configuration, which comes from the same leak and is left alone here. * Trigger CI * MOD-18906 - Start the failover test's replicas on a protected cluster bus (#2196) test_topology_events:test_failover spawns its own cluster-node replicas, rather than relying on RLTest, so RLTest's cluster-bus-port-protected-mode waiver does not reach them. Since redis/redis#15722 a cluster node whose bus port is not authenticated by tls-cluster refuses to start unless protection is waived, so those replicas died at startup and the test timed out after 2308s on every oss-cluster leg. Mirror the master's value of the option onto the replica we spawn. The config is absent on older redis, which reports an empty dict and gets nothing added, since passing an unknown config would be fatal there instead. Also bound the wait for the replica to serve. It was the one unbounded wait in the helper, so a replica that never started produced only a test timeout, with the cause nowhere in the output: a config redis rejects is reported before the logfile is opened, leaving an empty log. Co-authored-by: Claude Opus 5 <noreply@anthropic.com> * MOD-18913 - Cap redis-py below 6 so the suite stays on RESP2 RLTest's own requirement on the client is uncapped (redis = ">=5.0.0"), where the commit this repo was pinned to until now capped it at "^5.0.0rc2". Moving the pin therefore let pip install redis-py 8.1.0, which negotiates RESP3 by default, and under RESP3 TS.MRANGE ... GROUPBY replies with a map rather than rows: ((filtered_by, withlabels, samples),) = result ValueError: too many values to unpack (expected 3) Pin the client to the 5.x series, which is what the old RLTest pin was silently giving us, so the pin bump does not carry a protocol change with it. Supporting RESP3 in the assertions is the real fix and stays with MOD-18913. * Restore the MOD-18906 replica fix It was reverted by accident in the previous commit, which picked up a stale staged copy of the file alongside the requirements change. * MOD-18913: absorb the RLTest upgrade - unescape moduleArgs semicolons (#2197) * MOD-18913 - Pin the RLTest fix for escaped semicolons in moduleArgs The plain-string branch of fix_modulesArgs reuses the raw input instead of the unescaped split, so an escaped semicolon reaches the module with its backslash. test_globalconfigs passes COMPACTION_POLICY that way, the module then fails to load, the server never starts, and the test reports only Connection refused against the Env it just built - on gen, slaves, aof and aof_slaves. Fixed upstream in RLTest#256; pinned to that commit until it merges. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * Trigger CI * Point the pin at upstream RLTest now that the fix has merged RedisLabsModules/RLTest#256 merged as 7e9f69ac1, so the escaped-semicolon fix is available upstream and the pin no longer has to reference a fork. Same code either way - 8dc964e was that PR's head - so this changes nothing in CI, it just stops the branch from merging with a personal fork as a dependency. * Spell the RLTest pin as a full SHA An abbreviated SHA only resolves while the commit stays reachable from the default branch, because a git fetch of a specific object needs the full hash and an abbreviation is resolved after the clone. It works today - CI on the previous commit passed - but it is a needless dependency on that reachability, and the pin this replaced was a full SHA. Same commit either way. Raised by Cursor Bugbot on 965b2db. --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…#1644) * MOD-18751: waive cluster bus protected mode for the oss-cluster phase redis/redis#15722 added cluster-bus-port-protected-mode, and on the 8.12 line it defaults to enabled: a node started with cluster-enabled and without tls-cluster then refuses to start, because its cluster bus port would be unauthenticated. That is how the oss-cluster phase is built, so every shard dies at startup and each test fails at connect with "Connection refused". The refusal happens while the configuration is validated, before the server opens its logfile, so the retained logs are empty and say nothing about the cause. Waive it for that phase. The bus ports here are bound to localhost on an ephemeral host, which is the condition the directive documents for waiving, and they were equally unauthenticated before the redis change - which only made running them an explicit choice. The option is not passed blind, because a redis that does not have it rejects the directive and fails to start the same way. RLTest takes it as an option rather than guessing, since nothing it can see distinguishes a build that has the option from one that does not: the 8.12 line reports 8.9.241 in version.h, the same as builds from before the change. CLUSTER_BUS_PROTECTED_MODE= omits it for anyone running the cluster phase against an older redis locally. The tls_cluster phase is left alone, since tls-cluster authenticates the bus, and so is the existing-env phase, where RLTest starts no servers. Requires RLTest with the option (RedisLabsModules/RLTest#255). * Trigger CI to build the image locally, so it installs RLTest 0.7.29 * Set CLUSTER_BUS_ARGS before the ENV_ONLY branch can use it run_env interpolates CLUSTER_BUS_ARGS for COORD=oss, but the ENV_ONLY branch calls run_env and exits 20 lines before the assignment, so that path started its cluster without the waiver and the shards refused to start on 8.12. Moving the assignment above the branch; it depends on nothing in between. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…#1644) * MOD-18751: waive cluster bus protected mode for the oss-cluster phase redis/redis#15722 added cluster-bus-port-protected-mode, and on the 8.12 line it defaults to enabled: a node started with cluster-enabled and without tls-cluster then refuses to start, because its cluster bus port would be unauthenticated. That is how the oss-cluster phase is built, so every shard dies at startup and each test fails at connect with "Connection refused". The refusal happens while the configuration is validated, before the server opens its logfile, so the retained logs are empty and say nothing about the cause. Waive it for that phase. The bus ports here are bound to localhost on an ephemeral host, which is the condition the directive documents for waiving, and they were equally unauthenticated before the redis change - which only made running them an explicit choice. The option is not passed blind, because a redis that does not have it rejects the directive and fails to start the same way. RLTest takes it as an option rather than guessing, since nothing it can see distinguishes a build that has the option from one that does not: the 8.12 line reports 8.9.241 in version.h, the same as builds from before the change. CLUSTER_BUS_PROTECTED_MODE= omits it for anyone running the cluster phase against an older redis locally. The tls_cluster phase is left alone, since tls-cluster authenticates the bus, and so is the existing-env phase, where RLTest starts no servers. Requires RLTest with the option (RedisLabsModules/RLTest#255). * Trigger CI to build the image locally, so it installs RLTest 0.7.29 * Set CLUSTER_BUS_ARGS before the ENV_ONLY branch can use it run_env interpolates CLUSTER_BUS_ARGS for COORD=oss, but the ENV_ONLY branch calls run_env and exits 20 lines before the assignment, so that path started its cluster without the waiver and the shards refused to start on 8.12. Moving the assignment above the branch; it depends on nothing in between. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…#1644) * MOD-18751: waive cluster bus protected mode for the oss-cluster phase redis/redis#15722 added cluster-bus-port-protected-mode, and on the 8.12 line it defaults to enabled: a node started with cluster-enabled and without tls-cluster then refuses to start, because its cluster bus port would be unauthenticated. That is how the oss-cluster phase is built, so every shard dies at startup and each test fails at connect with "Connection refused". The refusal happens while the configuration is validated, before the server opens its logfile, so the retained logs are empty and say nothing about the cause. Waive it for that phase. The bus ports here are bound to localhost on an ephemeral host, which is the condition the directive documents for waiving, and they were equally unauthenticated before the redis change - which only made running them an explicit choice. The option is not passed blind, because a redis that does not have it rejects the directive and fails to start the same way. RLTest takes it as an option rather than guessing, since nothing it can see distinguishes a build that has the option from one that does not: the 8.12 line reports 8.9.241 in version.h, the same as builds from before the change. CLUSTER_BUS_PROTECTED_MODE= omits it for anyone running the cluster phase against an older redis locally. The tls_cluster phase is left alone, since tls-cluster authenticates the bus, and so is the existing-env phase, where RLTest starts no servers. Requires RLTest with the option (RedisLabsModules/RLTest#255). * Trigger CI to build the image locally, so it installs RLTest 0.7.29 * Set CLUSTER_BUS_ARGS before the ENV_ONLY branch can use it run_env interpolates CLUSTER_BUS_ARGS for COORD=oss, but the ENV_ONLY branch calls run_env and exits 20 lines before the assignment, so that path started its cluster without the waiver and the shards refused to start on 8.12. Moving the assignment above the branch; it depends on nothing in between. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…#1644) * MOD-18751: waive cluster bus protected mode for the oss-cluster phase redis/redis#15722 added cluster-bus-port-protected-mode, and on the 8.12 line it defaults to enabled: a node started with cluster-enabled and without tls-cluster then refuses to start, because its cluster bus port would be unauthenticated. That is how the oss-cluster phase is built, so every shard dies at startup and each test fails at connect with "Connection refused". The refusal happens while the configuration is validated, before the server opens its logfile, so the retained logs are empty and say nothing about the cause. Waive it for that phase. The bus ports here are bound to localhost on an ephemeral host, which is the condition the directive documents for waiving, and they were equally unauthenticated before the redis change - which only made running them an explicit choice. The option is not passed blind, because a redis that does not have it rejects the directive and fails to start the same way. RLTest takes it as an option rather than guessing, since nothing it can see distinguishes a build that has the option from one that does not: the 8.12 line reports 8.9.241 in version.h, the same as builds from before the change. CLUSTER_BUS_PROTECTED_MODE= omits it for anyone running the cluster phase against an older redis locally. The tls_cluster phase is left alone, since tls-cluster authenticates the bus, and so is the existing-env phase, where RLTest starts no servers. Requires RLTest with the option (RedisLabsModules/RLTest#255). * Trigger CI to build the image locally, so it installs RLTest 0.7.29 * Set CLUSTER_BUS_ARGS before the ENV_ONLY branch can use it run_env interpolates CLUSTER_BUS_ARGS for COORD=oss, but the ENV_ONLY branch calls run_env and exits 20 lines before the assignment, so that path started its cluster without the waiver and the shards refused to start on 8.12. Moving the assignment above the branch; it depends on nothing in between. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
* MOD-18952 Fix MGET command key spec (#1648) * MOD-18952 Fix MGET command key spec * fix tests * MOD-18751: waive cluster bus protected mode for the oss-cluster phase (#1644) * MOD-18751: waive cluster bus protected mode for the oss-cluster phase redis/redis#15722 added cluster-bus-port-protected-mode, and on the 8.12 line it defaults to enabled: a node started with cluster-enabled and without tls-cluster then refuses to start, because its cluster bus port would be unauthenticated. That is how the oss-cluster phase is built, so every shard dies at startup and each test fails at connect with "Connection refused". The refusal happens while the configuration is validated, before the server opens its logfile, so the retained logs are empty and say nothing about the cause. Waive it for that phase. The bus ports here are bound to localhost on an ephemeral host, which is the condition the directive documents for waiving, and they were equally unauthenticated before the redis change - which only made running them an explicit choice. The option is not passed blind, because a redis that does not have it rejects the directive and fails to start the same way. RLTest takes it as an option rather than guessing, since nothing it can see distinguishes a build that has the option from one that does not: the 8.12 line reports 8.9.241 in version.h, the same as builds from before the change. CLUSTER_BUS_PROTECTED_MODE= omits it for anyone running the cluster phase against an older redis locally. The tls_cluster phase is left alone, since tls-cluster authenticates the bus, and so is the existing-env phase, where RLTest starts no servers. Requires RLTest with the option (RedisLabsModules/RLTest#255). * Trigger CI to build the image locally, so it installs RLTest 0.7.29 * Set CLUSTER_BUS_ARGS before the ENV_ONLY branch can use it run_env interpolates CLUSTER_BUS_ARGS for COORD=oss, but the ENV_ONLY branch calls run_env and exits 20 lines before the assignment, so that path started its cluster without the waiver and the shards refused to start on 8.12. Moving the assignment above the branch; it depends on nothing in between. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: LiranAbir <75354956+LiranAbir@users.noreply.github.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
* MOD-18952 Fix MGET command key spec (#1648) * MOD-18952 Fix MGET command key spec * fix tests * MOD-18751: waive cluster bus protected mode for the oss-cluster phase (#1644) * MOD-18751: waive cluster bus protected mode for the oss-cluster phase redis/redis#15722 added cluster-bus-port-protected-mode, and on the 8.12 line it defaults to enabled: a node started with cluster-enabled and without tls-cluster then refuses to start, because its cluster bus port would be unauthenticated. That is how the oss-cluster phase is built, so every shard dies at startup and each test fails at connect with "Connection refused". The refusal happens while the configuration is validated, before the server opens its logfile, so the retained logs are empty and say nothing about the cause. Waive it for that phase. The bus ports here are bound to localhost on an ephemeral host, which is the condition the directive documents for waiving, and they were equally unauthenticated before the redis change - which only made running them an explicit choice. The option is not passed blind, because a redis that does not have it rejects the directive and fails to start the same way. RLTest takes it as an option rather than guessing, since nothing it can see distinguishes a build that has the option from one that does not: the 8.12 line reports 8.9.241 in version.h, the same as builds from before the change. CLUSTER_BUS_PROTECTED_MODE= omits it for anyone running the cluster phase against an older redis locally. The tls_cluster phase is left alone, since tls-cluster authenticates the bus, and so is the existing-env phase, where RLTest starts no servers. Requires RLTest with the option (RedisLabsModules/RLTest#255). * Trigger CI to build the image locally, so it installs RLTest 0.7.29 * Set CLUSTER_BUS_ARGS before the ENV_ONLY branch can use it run_env interpolates CLUSTER_BUS_ARGS for COORD=oss, but the ENV_ONLY branch calls run_env and exits 20 lines before the assignment, so that path started its cluster without the waiver and the shards refused to start on 8.12. Moving the assignment above the branch; it depends on nothing in between. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: LiranAbir <75354956+LiranAbir@users.noreply.github.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
* MOD-18952 Fix MGET command key spec (#1648) * MOD-18952 Fix MGET command key spec * fix tests * MOD-18751: waive cluster bus protected mode for the oss-cluster phase (#1644) * MOD-18751: waive cluster bus protected mode for the oss-cluster phase redis/redis#15722 added cluster-bus-port-protected-mode, and on the 8.12 line it defaults to enabled: a node started with cluster-enabled and without tls-cluster then refuses to start, because its cluster bus port would be unauthenticated. That is how the oss-cluster phase is built, so every shard dies at startup and each test fails at connect with "Connection refused". The refusal happens while the configuration is validated, before the server opens its logfile, so the retained logs are empty and say nothing about the cause. Waive it for that phase. The bus ports here are bound to localhost on an ephemeral host, which is the condition the directive documents for waiving, and they were equally unauthenticated before the redis change - which only made running them an explicit choice. The option is not passed blind, because a redis that does not have it rejects the directive and fails to start the same way. RLTest takes it as an option rather than guessing, since nothing it can see distinguishes a build that has the option from one that does not: the 8.12 line reports 8.9.241 in version.h, the same as builds from before the change. CLUSTER_BUS_PROTECTED_MODE= omits it for anyone running the cluster phase against an older redis locally. The tls_cluster phase is left alone, since tls-cluster authenticates the bus, and so is the existing-env phase, where RLTest starts no servers. Requires RLTest with the option (RedisLabsModules/RLTest#255). * Trigger CI to build the image locally, so it installs RLTest 0.7.29 * Set CLUSTER_BUS_ARGS before the ENV_ONLY branch can use it run_env interpolates CLUSTER_BUS_ARGS for COORD=oss, but the ENV_ONLY branch calls run_env and exits 20 lines before the assignment, so that path started its cluster without the waiver and the shards refused to start on 8.12. Moving the assignment above the branch; it depends on nothing in between. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: LiranAbir <75354956+LiranAbir@users.noreply.github.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
* MOD-18952 Fix MGET command key spec (#1648) * MOD-18952 Fix MGET command key spec * fix tests * MOD-18751: waive cluster bus protected mode for the oss-cluster phase (#1644) * MOD-18751: waive cluster bus protected mode for the oss-cluster phase redis/redis#15722 added cluster-bus-port-protected-mode, and on the 8.12 line it defaults to enabled: a node started with cluster-enabled and without tls-cluster then refuses to start, because its cluster bus port would be unauthenticated. That is how the oss-cluster phase is built, so every shard dies at startup and each test fails at connect with "Connection refused". The refusal happens while the configuration is validated, before the server opens its logfile, so the retained logs are empty and say nothing about the cause. Waive it for that phase. The bus ports here are bound to localhost on an ephemeral host, which is the condition the directive documents for waiving, and they were equally unauthenticated before the redis change - which only made running them an explicit choice. The option is not passed blind, because a redis that does not have it rejects the directive and fails to start the same way. RLTest takes it as an option rather than guessing, since nothing it can see distinguishes a build that has the option from one that does not: the 8.12 line reports 8.9.241 in version.h, the same as builds from before the change. CLUSTER_BUS_PROTECTED_MODE= omits it for anyone running the cluster phase against an older redis locally. The tls_cluster phase is left alone, since tls-cluster authenticates the bus, and so is the existing-env phase, where RLTest starts no servers. Requires RLTest with the option (RedisLabsModules/RLTest#255). * Trigger CI to build the image locally, so it installs RLTest 0.7.29 * Set CLUSTER_BUS_ARGS before the ENV_ONLY branch can use it run_env interpolates CLUSTER_BUS_ARGS for COORD=oss, but the ENV_ONLY branch calls run_env and exits 20 lines before the assignment, so that path started its cluster without the waiver and the shards refused to start on 8.12. Moving the assignment above the branch; it depends on nothing in between. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: LiranAbir <75354956+LiranAbir@users.noreply.github.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Problem
redis/redis#15722 added
cluster-bus-port-protected-mode. On the 8.12 development line it defaults to enabled, and a node started withcluster-enabled yeswhiletls-clusteris disabled then refuses to start, because its cluster bus port would be unauthenticated. That is how theoss-clusterenv is built, so every shard dies at startup and all cluster-topology tests fail at connect:The refusal happens while the configuration is being validated, before the server opens its logfile, so the retained artifacts are empty and say nothing about why nothing came up. Tracked as MOD-18751: every
oss-clusterleg of the RedisTimeSeries, RedisBloom and RedisJSON nightlies — public repos and dev forks,build-linux-x64,build-linux-arm64,macos,coverage,linux-valgrind,linux-sanitizer— red on every run since 2026-09-15, around 150 failed jobs a night. Non-cluster variants of the same jobs pass.Change
Take the setting as an option and let the caller pass it, the way every other flag here is taken:
clusterBusPortProtectedModeonStandardEnvandEnvDefaults.cluster_bus_port_protected_mode--cluster_bus_port_protected_modeon the command lineNoneis the default and passes nothing, so behaviour is unchanged unless a caller asks.False/'no'waives the protection, which is what a test environment on an ephemeral host wants;True/'yes'enforces it, for anyone testing the refusal itself. Bools and the'yes'/'no'strings are both accepted, since the command line supplies strings.Only a cluster node opens a bus port, so the option is emitted alongside the other cluster directives and never for a standalone or replica process.
Why the caller and not RLTest
Earlier revisions of this PR tried to decide inside RLTest. Both ways are in the history, and neither can work.
A version gate cannot express it. The option was backported mid-line, so support does not follow from a version number:
And the 8.12 line reports
8.9.241inversion.h— the same version as builds from before the change, which reject the option. No threshold separates them.Probing the binary cannot either. It needs the server's own diagnostics to tell acceptance from rejection, and those differ per build: some reject with
Bad directive or wrong number of arguments, while a build that defers unknown directives to modules instead aborts later withUnresolved Configuration(s) Detected. Thanks to @gabsow for finding that case against a real development binary — it is what moved this to an option.The caller, on the other hand, knows: it knows which source it built. A job building the 8.12 line passes
no; a job pinning 8.10.2 need not bother, since protection is off there by default.Caveat for callers
Passing the option to a redis that does not have it stops the server from starting, whichever value is given — the directive name is what is unknown, not the value. The failure looks like
Redis server is dead (pid=N)with an empty logfile, since redis aborts before opening it. Matching the flag to the build is the caller's responsibility; RLTest does not check, just as it does not check any other flag against the build.🤖 Generated with Claude Code