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>
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