mirror of
https://github.com/redis/go-redis.git
synced 2025-12-02 06:22:31 +03:00
feat(cluster): Implement Request and Response Policy Based Routing in Cluster Mode (#3422)
* Add search module builders and tests (#1) * Add search module builders and tests * Add tests * Use builders and Actions in more clean way * Update search_builders.go Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com> * Update search_builders.go Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com> * feat(routing): add internal request/response policy enums * feat: load the policy table in cluster client (#4) * feat: load the policy table in cluster client * Remove comments * modify Tips and command pplicy in commandInfo (#5) * centralize cluster command routing in osscluster_router.go and refactor osscluster.go (#6) * centralize cluster command routing in osscluster_router.go and refactor osscluster.go * enalbe ci on all branches * Add debug prints * Add debug prints * FIX: deal with nil policy * FIX: fixing clusterClient process * chore(osscluster): simplify switch case * wip(command): ai generated clone method for commands * feat: implement response aggregator for Redis cluster commands * feat: implement response aggregator for Redis cluster commands * fix: solve concurrency errors * fix: solve concurrency errors * return MaxRedirects settings * remove locks from getCommandPolicy * Handle MOVED errors more robustly, remove cluster reloading at exectutions, ennsure better routing * Fix: supports Process hook test * Fix: remove response aggregation for single shard commands * Add more preformant type conversion for Cmd type * Add router logic into processPipeline --------- Co-authored-by: Nedyalko Dyakov <nedyalko.dyakov@gmail.com> * remove thread debugging code * remove thread debugging code && reject commands with policy that cannot be used in pipeline * refactor processPipline and cmdType enum * remove FDescribe from cluster tests * Add tests * fix aggregation test * fix mget test * fix mget test * remove aggregateKeyedResponses * added scaffolding for the req-resp manager * added default policies for the search commands * split command map into module->command * cleanup, added logic to refresh the cache * added reactive cache refresh * revert cluster refresh * fixed lint * addresed first batch of comments * rewrote aggregator implementations with atomic for native or nearnative primitives * addressed more comments, fixed lint * added batch aggregator operations * fixed lint * updated batch aggregator, fixed extractcommandvalue * fixed lint * added batching to aggregateResponses * fixed deadlocks * changed aggregator logic, added error params * added preemptive return to the aggregators * more work on the aggregators * updated and and or aggregators * fixed lint * added configurable policy resolvers * slight refactor * removed the interface, slight refactor * change func signature from cmdName to cmder * added nil safety assertions * few small refactors * added read only policies * removed leftover prints * Rebased to master, resolved comnflicts * fixed lint * updated gha * fixed tests, minor consistency refactor * preallocated simple errors * changed numeric aggregators to use float64 * speculative test fix * Update command.go Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com> * Update main_test.go Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com> * Add static shard picker * Fix nil value handling in command aggregation * Modify the Clone method to return a shallow copy * Add clone method to digest command * Optimize keyless command routing to respect ShardPicker policy * Remove MGET references * Fix MGET aggregation to map individual values to keys across shards * Add clone method to hybrid search commands * Undo changes in route keyless test * remove comments * Add test for DisableRoutingPolicies option * Add Routing Policies Comprehensive Test Suite and Fix multi keyed aggregation for different step --------- Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com> Co-authored-by: Nedyalko Dyakov <nedyalko.dyakov@gmail.com> Co-authored-by: Hristo Temelski <hristo.temelski@redis.com>
This commit is contained in:
@@ -225,8 +225,9 @@ type ScanDumpCmd struct {
|
||||
func newScanDumpCmd(ctx context.Context, args ...interface{}) *ScanDumpCmd {
|
||||
return &ScanDumpCmd{
|
||||
baseCmd: baseCmd{
|
||||
ctx: ctx,
|
||||
args: args,
|
||||
ctx: ctx,
|
||||
args: args,
|
||||
cmdType: CmdTypeScanDump,
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -270,6 +271,13 @@ func (cmd *ScanDumpCmd) readReply(rd *proto.Reader) (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cmd *ScanDumpCmd) Clone() Cmder {
|
||||
return &ScanDumpCmd{
|
||||
baseCmd: cmd.cloneBaseCmd(),
|
||||
val: cmd.val, // ScanDump is a simple struct, can be copied directly
|
||||
}
|
||||
}
|
||||
|
||||
// Returns information about a Bloom filter.
|
||||
// For more information - https://redis.io/commands/bf.info/
|
||||
func (c cmdable) BFInfo(ctx context.Context, key string) *BFInfoCmd {
|
||||
@@ -296,8 +304,9 @@ type BFInfoCmd struct {
|
||||
func NewBFInfoCmd(ctx context.Context, args ...interface{}) *BFInfoCmd {
|
||||
return &BFInfoCmd{
|
||||
baseCmd: baseCmd{
|
||||
ctx: ctx,
|
||||
args: args,
|
||||
ctx: ctx,
|
||||
args: args,
|
||||
cmdType: CmdTypeBFInfo,
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -388,6 +397,13 @@ func (cmd *BFInfoCmd) readReply(rd *proto.Reader) (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cmd *BFInfoCmd) Clone() Cmder {
|
||||
return &BFInfoCmd{
|
||||
baseCmd: cmd.cloneBaseCmd(),
|
||||
val: cmd.val, // BFInfo is a simple struct, can be copied directly
|
||||
}
|
||||
}
|
||||
|
||||
// BFInfoCapacity returns information about the capacity of a Bloom filter.
|
||||
// For more information - https://redis.io/commands/bf.info/
|
||||
func (c cmdable) BFInfoCapacity(ctx context.Context, key string) *BFInfoCmd {
|
||||
@@ -625,8 +641,9 @@ type CFInfoCmd struct {
|
||||
func NewCFInfoCmd(ctx context.Context, args ...interface{}) *CFInfoCmd {
|
||||
return &CFInfoCmd{
|
||||
baseCmd: baseCmd{
|
||||
ctx: ctx,
|
||||
args: args,
|
||||
ctx: ctx,
|
||||
args: args,
|
||||
cmdType: CmdTypeCFInfo,
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -692,6 +709,13 @@ func (cmd *CFInfoCmd) readReply(rd *proto.Reader) (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cmd *CFInfoCmd) Clone() Cmder {
|
||||
return &CFInfoCmd{
|
||||
baseCmd: cmd.cloneBaseCmd(),
|
||||
val: cmd.val, // CFInfo is a simple struct, can be copied directly
|
||||
}
|
||||
}
|
||||
|
||||
// CFInfo returns information about a Cuckoo filter.
|
||||
// For more information - https://redis.io/commands/cf.info/
|
||||
func (c cmdable) CFInfo(ctx context.Context, key string) *CFInfoCmd {
|
||||
@@ -787,8 +811,9 @@ type CMSInfoCmd struct {
|
||||
func NewCMSInfoCmd(ctx context.Context, args ...interface{}) *CMSInfoCmd {
|
||||
return &CMSInfoCmd{
|
||||
baseCmd: baseCmd{
|
||||
ctx: ctx,
|
||||
args: args,
|
||||
ctx: ctx,
|
||||
args: args,
|
||||
cmdType: CmdTypeCMSInfo,
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -843,6 +868,13 @@ func (cmd *CMSInfoCmd) readReply(rd *proto.Reader) (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cmd *CMSInfoCmd) Clone() Cmder {
|
||||
return &CMSInfoCmd{
|
||||
baseCmd: cmd.cloneBaseCmd(),
|
||||
val: cmd.val, // CMSInfo is a simple struct, can be copied directly
|
||||
}
|
||||
}
|
||||
|
||||
// CMSInfo returns information about a Count-Min Sketch filter.
|
||||
// For more information - https://redis.io/commands/cms.info/
|
||||
func (c cmdable) CMSInfo(ctx context.Context, key string) *CMSInfoCmd {
|
||||
@@ -980,8 +1012,9 @@ type TopKInfoCmd struct {
|
||||
func NewTopKInfoCmd(ctx context.Context, args ...interface{}) *TopKInfoCmd {
|
||||
return &TopKInfoCmd{
|
||||
baseCmd: baseCmd{
|
||||
ctx: ctx,
|
||||
args: args,
|
||||
ctx: ctx,
|
||||
args: args,
|
||||
cmdType: CmdTypeTopKInfo,
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -1038,6 +1071,13 @@ func (cmd *TopKInfoCmd) readReply(rd *proto.Reader) (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cmd *TopKInfoCmd) Clone() Cmder {
|
||||
return &TopKInfoCmd{
|
||||
baseCmd: cmd.cloneBaseCmd(),
|
||||
val: cmd.val, // TopKInfo is a simple struct, can be copied directly
|
||||
}
|
||||
}
|
||||
|
||||
// TopKInfo returns information about a Top-K filter.
|
||||
// For more information - https://redis.io/commands/topk.info/
|
||||
func (c cmdable) TopKInfo(ctx context.Context, key string) *TopKInfoCmd {
|
||||
@@ -1227,8 +1267,9 @@ type TDigestInfoCmd struct {
|
||||
func NewTDigestInfoCmd(ctx context.Context, args ...interface{}) *TDigestInfoCmd {
|
||||
return &TDigestInfoCmd{
|
||||
baseCmd: baseCmd{
|
||||
ctx: ctx,
|
||||
args: args,
|
||||
ctx: ctx,
|
||||
args: args,
|
||||
cmdType: CmdTypeTDigestInfo,
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -1295,6 +1336,13 @@ func (cmd *TDigestInfoCmd) readReply(rd *proto.Reader) (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cmd *TDigestInfoCmd) Clone() Cmder {
|
||||
return &TDigestInfoCmd{
|
||||
baseCmd: cmd.cloneBaseCmd(),
|
||||
val: cmd.val, // TDigestInfo is a simple struct, can be copied directly
|
||||
}
|
||||
}
|
||||
|
||||
// TDigestInfo returns information about a t-Digest data structure.
|
||||
// For more information - https://redis.io/commands/tdigest.info/
|
||||
func (c cmdable) TDigestInfo(ctx context.Context, key string) *TDigestInfoCmd {
|
||||
|
||||
Reference in New Issue
Block a user