Skip to content

Introduce request & response policy support#4411

Merged
ggivo merged 61 commits intomasterfrom
im/request-response-policy-support
Mar 20, 2026
Merged

Introduce request & response policy support#4411
ggivo merged 61 commits intomasterfrom
im/request-response-policy-support

Conversation

@uglide
Copy link
Contributor

@uglide uglide commented Jan 21, 2026

This PR introduces support for request/response policies in Redis cluster command execution, enabling proper handling of keyless commands and multi-shard operations. The changes implement Redis's command tips specification for cluster deployments, allowing the Jedis client to intelligently route commands to appropriate nodes and aggregate responses based on command-specific policies.

Fixes: #990


Note

High Risk
High risk because it rewires Redis Cluster command routing/execution (including keyless and broadcast behaviors), adds response aggregation logic, and changes how hash slots are tracked for pipeline/node selection.

Overview
Adds Redis Cluster command tip support by extending CommandFlagsRegistry with RequestPolicy/ResponsePolicy and updating the static registry generator output to include these policies.

Reworks cluster execution to route commands by policy in ClusterCommandExecutor (keyless commands use round-robin connections, ALL_SHARDS/ALL_NODES are broadcast with aggregated replies, and new multi-shard execution aggregates per-slot sub-commands), introducing new connection resolvers and reply aggregators plus clearer multi-node error reporting (JedisClusterOperationException now carries node info; new aggregation exceptions).

Introduces multi-shard implementations for cross-slot commands by splitting arguments by hash slot in ClusterCommandObjects and overriding RedisClusterClient methods like del/exists/mget/mset/unlink/touch/msetex to transparently execute across shards while preserving input order.

Refactors key tracking by removing ClusterCommandArguments and making CommandArguments record keys + cached hash slots (addHashSlotKey(s)), updates pipeline routing/validation to reject commands that can’t be routed to a single slot, and removes the old broadcast/round-robin config path from UnifiedJedis. Also expands CI branch triggers (topic/**) and updates pom.xml include patterns for coverage/validation.

Written by Cursor Bugbot for commit 3d286f8. This will update automatically on new commits. Configure here.

@uglide uglide force-pushed the im/request-response-policy-support branch 3 times, most recently from bd6ee0f to 0fdcacf Compare January 21, 2026 16:23
@uglide uglide added the breakingchange Pull request that has breaking changes. Must include the breaking behavior in release notes. label Jan 21, 2026
@uglide uglide added this to the 8.0.0 milestone Jan 21, 2026
@uglide uglide requested review from Copilot and ggivo January 22, 2026 10:54
@github-actions
Copy link

github-actions bot commented Jan 22, 2026

Test Results

   308 files  +  3     308 suites  +3   12m 9s ⏱️ +27s
11 136 tests +192  11 080 ✅ +351  56 💤  - 159  0 ❌ ±0 
 5 851 runs  +192   5 842 ✅ +250   9 💤  -  58  0 ❌ ±0 

Results for commit 57816a4. ± Comparison against base commit d9b979c.

This pull request removes 43 and adds 235 tests. Note that renamed tests count towards both.
redis.clients.jedis.ClusterCommandExecutorTest ‑ runAlwaysFailing
redis.clients.jedis.ClusterCommandExecutorTest ‑ runAskSuccess
redis.clients.jedis.ClusterCommandExecutorTest ‑ runFailOnFirstExecSuccessOnSecondExec
redis.clients.jedis.ClusterCommandExecutorTest ‑ runMasterFailingReplicaRecovering
redis.clients.jedis.ClusterCommandExecutorTest ‑ runMovedSuccess
redis.clients.jedis.ClusterCommandExecutorTest ‑ runMovedThenAllNodesFailing
redis.clients.jedis.ClusterCommandExecutorTest ‑ runRethrowsJedisNoReachableClusterNodeException
redis.clients.jedis.ClusterCommandExecutorTest ‑ runStopsRetryingAfterTimeout
redis.clients.jedis.ClusterCommandExecutorTest ‑ runSuccessfulExecute
redis.clients.jedis.commands.jedis.ClusterBinaryValuesCommandsTest ‑ failKeys
…
redis.clients.jedis.ClusterCommandObjectsTest ‑ testGetKeyHashSlots_withByteArrayKey_worksCorrectly
redis.clients.jedis.ClusterCommandObjectsTest ‑ testGetKeyHashSlots_withMixedRawableAndByteArrayKeys
redis.clients.jedis.ClusterCommandObjectsTest ‑ testGetKeyHashSlots_withMixedRawableAndStringKeys
redis.clients.jedis.ClusterCommandObjectsTest ‑ testGetKeyHashSlots_withMultipleRawableKeys
redis.clients.jedis.ClusterCommandObjectsTest ‑ testGetKeyHashSlots_withRawableFromByteArray
redis.clients.jedis.ClusterCommandObjectsTest ‑ testGetKeyHashSlots_withRawableFromString
redis.clients.jedis.ClusterCommandObjectsTest ‑ testGetKeyHashSlots_withStringKey_worksCorrectly
redis.clients.jedis.ClusterCommandObjectsTest ‑ testGroupArgumentsByKeyHashSlotBinary_emptyKeys
redis.clients.jedis.ClusterCommandObjectsTest ‑ testGroupArgumentsByKeyHashSlotBinary_multipleSlots
redis.clients.jedis.ClusterCommandObjectsTest ‑ testGroupArgumentsByKeyHashSlotBinary_noValuesIncluded
…

♻️ This comment has been updated with latest results.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces comprehensive support for Redis cluster request/response policies, enabling intelligent routing of keyless commands and multi-shard operations. The changes implement Redis's command tips specification for cluster deployments.

Changes:

  • Added RequestPolicy and ResponsePolicy enums with intelligent routing and aggregation strategies
  • Implemented keyless command execution with round-robin distribution across cluster nodes
  • Added multi-shard command support with automatic key-based slot splitting
  • Removed ClusterCommandArguments in favor of unified hash slot tracking in CommandArguments

Reviewed changes

Copilot reviewed 35 out of 35 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
Test files (multiple) Updated from broadcastCommand() to executeCommand() - proper API migration
ClusterReplyAggregatorTest.java Comprehensive tests for new aggregation utility
ClusterCommandExecutorTest.java Extensive tests for keyless and multi-shard execution
ClusterCommandObjectsTest.java Tests for hash slot grouping logic
CommandFlagsRegistryGenerator.java Extracts request/response policies from Redis command metadata
ClusterCommandExecutor.java Core policy-based routing implementation
ClusterReplyAggregator.java Response aggregation utility (SUM, MIN, MAX, AND, OR, etc.)
CommandArguments.java Added hash slot tracking with caching
ClusterCommandObjects.java Multi-shard command splitting methods
RedisClusterClient.java Multi-shard method overrides (del, mget, mset, etc.)
StaticCommandFlagsRegistry*.java Policy storage and lookup
UnifiedJedis.java Removed broadcast config, deprecated sendCommand methods
ClusterCommandArguments.java Deleted - functionality merged into CommandArguments

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Collaborator

@ggivo ggivo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I still need to review the read-only connection intent in more detail, but here are my findings so far:

  1. The main question, in my view, is currently missing support for the default behavior for commands that do not specify a request_policy hint.
  2. I would suggest separating the deprecation of sendCommand into a dedicated PR and targeting it for merge in 7.x.
  3. Regarding exposing a broadcast API at the RedisClient level: I understand this as sending the same command to multiple nodes. The result could either:
  • Be returned as raw replies from all contacted endpoints (List<Reply>), or
  • Be returned as a single aggregated Reply.
  • In the latter case, it would likely make sense to make the aggregation strategy configurable (e.g., by injecting an aggregator/collector responsible for processing the results).
  1. We should also consider implementing retry, redirect handling, and read replay logic in a shared/common layer. This would help ensure consistent behavior across different scenarios (keyed and keyless commands).

@uglide uglide force-pushed the im/request-response-policy-support branch from 6bfffe6 to d757662 Compare February 27, 2026 12:40
@jit-ci
Copy link

jit-ci bot commented Feb 27, 2026

🛡️ Jit Security Scan Results

CRITICAL HIGH MEDIUM

✅ No security findings were detected in this PR


Security scan by Jit

@uglide
Copy link
Contributor Author

uglide commented Mar 5, 2026

run integration tests

@uglide
Copy link
Contributor Author

uglide commented Mar 5, 2026

Testcase Errors Failures Skipped Total
redis.clients.jedis.commands.unified.client.RedisClientBitCommandsTest 0 0 3 30
redis.clients.jedis.failover.FailoverIntegrationTest 0 0 0 0
redis.clients.jedis.commands.jedis.ClusterCommandsTest 0 0 0 0
redis.clients.jedis.commands.commandobjects.CommandObjectsTopkCommandsTest 0 0 0 4
redis.clients.jedis.modules.bloom.TDigestTest 0 0 0 11
redis.clients.jedis.commands.commandobjects.CommandObjectsStreamCommandsTest 0 0 2 33
redis.clients.jedis.commands.jedis.PublishSubscribeCommandsTest 0 0 3 22
redis.clients.jedis.ACLJedisSentinelPoolTest 0 0 0 0
redis.clients.jedis.modules.search.JsonSearchWithGsonTest 0 0 0 1
redis.clients.jedis.JedisTest 0 0 8 27
redis.clients.jedis.commands.commandobjects.CommandObjectsGenericCommandsTest 0 0 12 66
redis.clients.jedis.commands.unified.cluster.ClusterSortedSetCommandsTest 0 0 0 55
redis.clients.jedis.commands.commandobjects.CommandObjectsHyperloglogCommandsTest 0 0 2 4
redis.clients.jedis.tls.SSLOptionsJedisSentinelPoolIT 0 0 0 0
redis.clients.jedis.modules.json.RedisJsonV2Test 0 0 0 41
redis.clients.jedis.commands.commandobjects.CommandObjectsScriptingCommandsTest 0 0 8 32
redis.clients.jedis.SentineledConnectionProviderTest 0 0 0 0
redis.clients.jedis.commands.commandobjects.CommandObjectsStringCommandsTest 0 0 5 28
redis.clients.jedis.commands.jedis.HotkeysCommandsTest 0 0 0 0
redis.clients.jedis.tls.ACLJedisIT 0 0 0 4
redis.clients.jedis.commands.commandobjects.CommandObjectsBloomFilterCommandsTest 0 0 0 5
redis.clients.jedis.TransactionV2Test 0 0 5 13
redis.clients.jedis.commands.unified.pipeline.GeoPipelineCommandsTest 0 0 6 24
redis.clients.jedis.commands.unified.cluster.ClusterBitCommandsTest 0 0 0 29
redis.clients.jedis.commands.commandobjects.CommandObjectsSortedSetCommandsTest 0 0 19 54
redis.clients.jedis.commands.jedis.TransactionCommandsTest 0 0 6 17
redis.clients.jedis.UnavailableConnectionTest 0 0 1 1
redis.clients.jedis.prefix.RedisClusterPrefixedKeysTest 0 0 0 2
redis.clients.jedis.commands.jedis.ClusterBinaryValuesCommandsTest 0 0 0 11
redis.clients.jedis.authentication.RedisEntraIDClusterIntegrationTests 0 0 0 0
redis.clients.jedis.commands.jedis.ControlCommandsTest 0 0 23 42
redis.clients.jedis.ReliableTransactionTest 0 0 11 11
redis.clients.jedis.mcf.PingStrategyIntegrationTest 0 0 0 0
redis.clients.jedis.tls.ACLRedisSentinelClientIT 0 0 0 0
redis.clients.jedis.commands.unified.cluster.ClusterGeoCommandsTest 0 0 0 17
redis.clients.jedis.commands.unified.cluster.ClusterSetCommandsTest 0 0 0 20
redis.clients.jedis.commands.jedis.GeoCommandsTest 0 0 6 21
redis.clients.jedis.tls.RedisClusterClientIT 1 3 0 10
redis.clients.jedis.commands.unified.client.RedisClientSortedSetCommandsTest 0 0 12 55
redis.clients.jedis.commands.unified.sentinel.SentinelAllKindOfValuesCommandsIT 0 0 0 0
redis.clients.jedis.commands.jedis.AccessControlListCommandsTest 0 0 0 0
redis.clients.jedis.ManagedConnectionProviderTest 0 0 0 1
redis.clients.jedis.commands.jedis.BitCommandsTest 0 0 11 31
redis.clients.jedis.commands.unified.client.RedisClientMiscellaneousTest 0 0 0 4
redis.clients.jedis.tls.JedisSentinelPoolIT 0 0 0 0
redis.clients.jedis.modules.timeseries.TimeSeriesTest 5 0 4 32
redis.clients.jedis.commands.unified.client.RedisClientHashesCommandsTest 0 0 0 37
redis.clients.jedis.csc.RedisClusterClientSideCacheTest 0 0 0 12
redis.clients.jedis.commands.unified.client.RedisClientHotkeysCommandsTest 0 0 0 0
redis.clients.jedis.commands.jedis.ModuleTest 0 0 0 0
redis.clients.jedis.ClusterPipeliningTest 0 0 0 0
redis.clients.jedis.modules.RedisModulesPipelineTest 0 0 0 3
redis.clients.jedis.commands.unified.client.RedisClientGeoCommandsTest 0 0 6 21
redis.clients.jedis.csc.AllowAndDenyListCacheableTest 0 0 0 5
redis.clients.jedis.commands.unified.cluster.ClusterListCommandsTest 0 0 0 27
redis.clients.jedis.tls.ACLRedisClientIT 0 0 0 4
redis.clients.jedis.commands.jedis.AllKindOfValuesCommandsTest 0 1 11 54
redis.clients.jedis.prefix.JedisPooledPrefixedKeysTest 0 0 1 2
redis.clients.jedis.MultiDbClientTest 0 0 0 0
redis.clients.jedis.TupleSortedSetTest 0 0 0 2
redis.clients.jedis.MigratePipeliningTest 0 0 0 0
redis.clients.jedis.commands.commandobjects.CommandObjectsTimeSeriesCommandsTest 3 0 1 16
redis.clients.jedis.tls.RedisSentinelClientIT 0 0 0 0
redis.clients.jedis.commands.jedis.VariadicCommandsTest 0 0 0 6
redis.clients.jedis.commands.unified.client.RedisClientTransactionIT 0 0 2 9
redis.clients.jedis.modules.json.RedisJsonV1Test 0 0 0 43
redis.clients.jedis.modules.search.SearchWithParamsTest 0 0 0 60
redis.clients.jedis.commands.unified.cluster.ClusterExtendedVectorSetCommandsTest 0 0 0 8
redis.clients.jedis.commands.unified.client.RedisClientStreamsCommandsTest 0 0 6 44
redis.clients.jedis.commands.unified.pipeline.SortedSetPipelineCommandsTest 0 0 12 54
redis.clients.jedis.commands.jedis.ClusterScriptingCommandsTest 0 0 0 11
redis.clients.jedis.commands.unified.pipeline.StreamsPipelineCommandsTest 0 0 3 34
redis.clients.jedis.authentication.TokenBasedAuthenticationClusterIntegrationTests 0 0 0 0
redis.clients.jedis.commands.jedis.ObjectCommandsTest 0 0 0 6
redis.clients.jedis.modules.bloom.CuckooTest 0 0 0 26
redis.clients.jedis.commands.jedis.SortedSetCommandsTest 0 0 12 55
redis.clients.jedis.commands.unified.cluster.ClusterHotkeysCommandsTest 0 0 0 4
redis.clients.jedis.modules.bloom.BloomTest 0 0 0 19
redis.clients.jedis.commands.jedis.StringValuesCommandsTest 0 0 3 32
redis.clients.jedis.commands.unified.pipeline.SetPipelineCommandsTest 0 0 8 20
redis.clients.jedis.commands.commandobjects.CommandObjectsBitmapCommandsTest 0 0 2 8
redis.clients.jedis.ConnectionTest 0 0 0 5
redis.clients.jedis.commands.jedis.SetCommandsTest 0 0 8 20
redis.clients.jedis.commands.jedis.BinaryValuesCommandsTest 0 0 2 38
redis.clients.jedis.modules.search.AggregationTest 0 0 0 14
redis.clients.jedis.PipeliningTest 0 0 8 37
redis.clients.jedis.commands.commandobjects.CommandObjectsServerManagementCommandsTest 0 0 0 5
redis.clients.jedis.commands.unified.cluster.ClusterVectorSetCommandsTest 0 0 0 51
redis.clients.jedis.ACLJedisTest 0 0 2 5
redis.clients.jedis.commands.jedis.HyperLogLogCommandsTest 0 0 3 7
redis.clients.jedis.prefix.RedisSentinelClientPrefixedKeysTest 0 0 0 0
redis.clients.jedis.commands.commandobjects.CommandObjectsSetCommandsTest 0 0 11 18
redis.clients.jedis.tls.SSLOptionsRedisClientIT 0 0 0 4
redis.clients.jedis.csc.RedisClientSideCacheTest 1 0 0 13
redis.clients.jedis.commands.unified.cluster.ClusterStreamsCommandsTest 0 0 6 44
redis.clients.jedis.mcf.ActiveActiveLocalFailoverTest 0 0 0 0
redis.clients.jedis.modules.search.SearchTest 0 0 0 41
redis.clients.jedis.JedisSentinelPoolTest 0 0 0 0
redis.clients.jedis.commands.jedis.ClientCommandsTest 0 0 2 24
redis.clients.jedis.mcf.HealthCheckIntegrationTest 0 1 0 7
redis.clients.jedis.authentication.RedisEntraIDManagedIdentityIntegrationTests 0 0 0 0
redis.clients.jedis.csc.ClientSideCacheFunctionalityTest 0 0 4 18
redis.clients.jedis.modules.ConsolidatedAccessControlListCommandsTest 0 0 0 0
redis.clients.jedis.ACLJedisPoolTest 0 0 17 17
redis.clients.jedis.authentication.RedisEntraIDIntegrationTests 0 0 0 0
redis.clients.jedis.commands.unified.client.RedisClientAllKindOfValuesCommandsTest 0 1 4 45
redis.clients.jedis.commands.jedis.StreamsCommandsTest 0 0 9 51
redis.clients.jedis.commands.unified.cluster.ClusterAllKindOfValuesCommandsTest 0 0 1 45
redis.clients.jedis.commands.unified.client.RedisClientListCommandsTest 0 0 10 27
redis.clients.jedis.commands.commandobjects.CommandObjectsHashCommandsTest 0 0 0 32
redis.clients.jedis.modules.search.SearchDefaultDialectTest 0 0 0 6
redis.clients.jedis.commands.unified.cluster.ClusterStreamsBinaryCommandsTest 0 0 4 29
redis.clients.jedis.commands.jedis.ListCommandsTest 0 0 10 27
redis.clients.jedis.modules.search.SpellCheckTest 0 0 0 6
redis.clients.jedis.tls.SSLOptionsRedisSentinelClientIT 0 0 0 0
redis.clients.jedis.commands.jedis.ScriptingCommandsTest 0 0 6 34
redis.clients.jedis.commands.commandobjects.CommandObjectsTDigestCommandsTest 0 0 0 10
redis.clients.jedis.commands.unified.client.RedisClientStringValuesCommandsTest 0 1 3 33
redis.clients.jedis.UnboundRedisClusterClientTest 0 0 0 0
redis.clients.jedis.RedisClientTest 0 0 2 15
redis.clients.jedis.commands.commandobjects.CommandObjectsGeospatialCommandsTest 0 0 5 16
redis.clients.jedis.commands.unified.cluster.ClusterHashesCommandsTest 0 0 0 37
redis.clients.jedis.commands.jedis.SlowlogCommandsTest 0 0 3 3
redis.clients.jedis.commands.unified.client.search.FTHybridRedisClientCommandsTest 0 0 2 18
redis.clients.jedis.commands.unified.client.RedisClientVectorSetCommandsTest 0 0 0 51
redis.clients.jedis.commands.commandobjects.CommandObjectsJsonCommandsTest 0 0 0 62
redis.clients.jedis.commands.jedis.StreamsBinaryCommandsTest 0 0 3 26
redis.clients.jedis.builders.RedisClusterClientMigrationIntegrationTest 0 0 0 7
redis.clients.jedis.commands.unified.client.RedisClientStreamsBinaryCommandsTest 0 0 4 29
redis.clients.jedis.commands.commandobjects.CommandObjectsListCommandsTest 0 0 10 28
redis.clients.jedis.commands.jedis.ClusterHotkeysCommandsTest 0 0 5 5
redis.clients.jedis.commands.unified.pipeline.ListPipelineCommandsTest 0 0 10 27
redis.clients.jedis.modules.bloom.TopKTest 0 0 0 1
redis.clients.jedis.modules.ConsolidatedConfigurationCommandsTest 0 0 1 7
redis.clients.jedis.mcf.MultiDbConnectionProviderTest 0 0 0 10
redis.clients.jedis.modules.search.JsonSearchTest 0 0 0 9
redis.clients.jedis.commands.jedis.FailoverCommandsTest 0 0 0 0
redis.clients.jedis.commands.unified.cluster.ClusterFunctionCommandsTest 0 0 0 10
redis.clients.jedis.commands.unified.cluster.ClusterStringValuesCommandsTest 0 2 1 34
redis.clients.jedis.commands.commandobjects.CommandObjectsCuckooFilterCommandsTest 0 0 0 7
redis.clients.jedis.commands.jedis.MigrateTest 0 0 0 0
redis.clients.jedis.JedisPoolTest 0 0 5 30
redis.clients.jedis.commands.jedis.VectorSetCommandsTest 0 0 0 49
redis.clients.jedis.commands.commandobjects.CommandObjectsCountMinSketchCommandsTest 0 0 0 5
redis.clients.jedis.tls.SSLOptionsJedisIT 0 0 0 7
redis.clients.jedis.commands.jedis.HashesCommandsTest 0 0 0 38
redis.clients.jedis.commands.jedis.SentinelCommandsTest 0 0 3 3
redis.clients.jedis.modules.search.SuggestionTest 0 0 0 6
redis.clients.jedis.tls.JedisIT 0 0 0 5
redis.clients.jedis.commands.unified.pipeline.HashesPipelineCommandsTest 0 0 0 15
redis.clients.jedis.commands.unified.client.RedisClientExtendedVectorSetCommandsTest 0 0 0 8
redis.clients.jedis.tls.RedisClientIT 0 0 0 4
redis.clients.jedis.commands.unified.pipeline.BinaryStreamsPipelineCommandsTest 0 0 1 7
redis.clients.jedis.commands.unified.cluster.ClusterHyperLogLogCommandsTest 0 0 0 6
redis.clients.jedis.modules.bloom.CMSTest 0 0 0 7
redis.clients.jedis.misc.AutomaticFailoverTest 0 0 6 6
redis.clients.jedis.csc.RedisSentinelClientSideCacheTest 0 0 0 0
redis.clients.jedis.commands.jedis.ClusterShardedPublishSubscribeCommandsTest 0 0 0 7
redis.clients.jedis.commands.unified.client.RedisClientHyperLogLogCommandsTest 0 0 3 7
redis.clients.jedis.commands.unified.cluster.search.FTHybridCommandsClusterTest 0 0 2 18
redis.clients.jedis.commands.unified.cluster.ClusterBinaryValuesCommandsTest 0 2 1 36
redis.clients.jedis.commands.unified.client.RedisClientBinaryValuesCommandsTest 0 0 2 39
redis.clients.jedis.commands.jedis.SortingCommandsTest 0 0 2 8
redis.clients.jedis.commands.unified.client.RedisClientSetCommandsTest 0 0 8 20
redis.clients.jedis.commands.commandobjects.CommandObjectsSearchAndQueryCommandsTest 0 0 0 12
redis.clients.jedis.mcf.FailbackMechanismIntegrationTest 0 0 0 8
redis.clients.jedis.authentication.TokenBasedAuthenticationIntegrationTests 0 0 0 5
redis.clients.jedis.JedisSentinelTest 0 0 0 0
redis.clients.jedis.commands.jedis.ClusterValuesCommandsTest 0 0 2 15
redis.clients.jedis.csc.SSLRedisClientSideCacheTest 0 0 0 13

---- Details for maintainers

ggivo added 2 commits March 18, 2026 12:35
…est policy in Cluster Pipeline (#4466)

* reject commands with ALL_NODES,ALL_SHARDS,MULTI_SHARD request policy in cluster pipeline

* run test on topic branches

* api docs fix

* If the command has keys that route to a single slot, allow it
* refactore: fix empty Map/Set should return emtpy not null

refactore: statefull aggregators fix tests

refactore: statefull aggregators

* refactore: statefull aggregators add test for ReplyAggregatorTest

* refactore: MultiNodeResultAggregator to aggregator package and mark with @internal

* refactore:  reuse LogicalAnd & LogicalOr aggregators

* format

* remove ClusterReplyAggregator replaced by aggregators/ClusterReplyAggregator

* triger test

* address review comments and fix Set[byte[]] aggregation

* address review comments

  - test puts entries into wrong map variable
  - Byte array set dedup skipped when first part empty

* address review comments

  - JedisByteHashMapAggregator.add() and JedisByteMapAggregator.add() skip empty maps

* format

* parameterize map test

* remove unused import
Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

@ggivo ggivo merged commit ae4ed55 into master Mar 20, 2026
14 checks passed
@uglide uglide deleted the im/request-response-policy-support branch March 20, 2026 11:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breakingchange Pull request that has breaking changes. Must include the breaking behavior in release notes.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add support for high level cluster commands

3 participants