diff --git a/apier/v1/replicator.go b/apier/v1/replicator.go index eef731ae3..3c5d2c25d 100644 --- a/apier/v1/replicator.go +++ b/apier/v1/replicator.go @@ -399,7 +399,7 @@ func (rplSv1 *ReplicatorSv1) GetItemLoadIDs(ctx *context.Context, itemID *utils. // GetIndexes is the remote method coresponding to the dataDb driver method func (rplSv1 *ReplicatorSv1) GetIndexes(ctx *context.Context, args *utils.GetIndexesArg, reply *map[string]utils.StringSet) error { engine.UpdateReplicationFilters(utils.CacheInstanceToPrefix[args.IdxItmType], args.TntCtx, utils.IfaceAsString(args.APIOpts[utils.RemoteHostOpt])) - indx, err := rplSv1.dm.DataDB().GetIndexesDrv(args.IdxItmType, args.TntCtx, args.IdxKey) + indx, err := rplSv1.dm.DataDB().GetIndexesDrv(args.IdxItmType, args.TntCtx, args.IdxKeys...) if err != nil { return err } @@ -1272,12 +1272,14 @@ func (rplSv1 *ReplicatorSv1) RemoveDispatcherHost(ctx *context.Context, args *ut // RemoveIndexes is the replication method coresponding to the dataDb driver method func (rplSv1 *ReplicatorSv1) RemoveIndexes(ctx *context.Context, args *utils.GetIndexesArg, reply *string) (err error) { - if err = rplSv1.dm.DataDB().RemoveIndexesDrv(args.IdxItmType, args.TntCtx, args.IdxKey); err != nil { + if err = rplSv1.dm.DataDB().RemoveIndexesDrv(args.IdxItmType, args.TntCtx, args.IdxKeys...); err != nil { return } - if err = rplSv1.v1.CallCache(utils.IfaceAsString(args.APIOpts[utils.CacheOpt]), - args.Tenant, args.IdxItmType, utils.ConcatenatedKey(args.TntCtx, args.IdxKey), utils.EmptyString, nil, nil, args.APIOpts); err != nil { - return + for _, idxKey := range args.IdxKeys { + if err = rplSv1.v1.CallCache(utils.IfaceAsString(args.APIOpts[utils.CacheOpt]), + args.Tenant, args.IdxItmType, utils.ConcatenatedKey(args.TntCtx, idxKey), utils.EmptyString, nil, nil, args.APIOpts); err != nil { + return + } } *reply = utils.OK return diff --git a/engine/datamanager.go b/engine/datamanager.go index 555ac4630..3e07762b0 100644 --- a/engine/datamanager.go +++ b/engine/datamanager.go @@ -3785,17 +3785,12 @@ func (dm *DataManager) GetIndexes(idxItmType, tntCtx string, cacheRead, cacheWri if indexes, err = dm.DataDB().GetIndexesDrv(idxItmType, tntCtx, idxKeys...); err != nil { if itm := config.CgrConfig().DataDbCfg().Items[idxItmType]; err == utils.ErrNotFound && itm.Remote { - // For remote fallback, use single key for backward compatibility - var singleKey string - if len(idxKeys) > 0 { - singleKey = idxKeys[0] - } if err = dm.connMgr.Call(context.TODO(), config.CgrConfig().DataDbCfg().RmtConns, utils.ReplicatorSv1GetIndexes, &utils.GetIndexesArg{ IdxItmType: idxItmType, TntCtx: tntCtx, - IdxKey: singleKey, + IdxKeys: idxKeys, Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, APIOpts: utils.GenerateDBItemOpts(itm.APIKey, itm.RouteID, utils.EmptyString, utils.FirstNonEmpty(config.CgrConfig().DataDbCfg().RmtConnID, @@ -3806,10 +3801,12 @@ func (dm *DataManager) GetIndexes(idxItmType, tntCtx string, cacheRead, cacheWri } if err != nil { err = utils.CastRPCErr(err) - if err == utils.ErrNotFound && cacheWrite && len(idxKeys) == 1 && idxKeys[0] != utils.EmptyString { - if errCh := Cache.Set(idxItmType, utils.ConcatenatedKey(tntCtx, idxKeys[0]), nil, []string{tntCtx}, - true, utils.NonTransactional); errCh != nil { - return nil, errCh + if err == utils.ErrNotFound && cacheWrite { + for _, key := range idxKeys { + if errCh := Cache.Set(idxItmType, utils.ConcatenatedKey(tntCtx, key), nil, []string{tntCtx}, + true, utils.NonTransactional); errCh != nil { + return nil, errCh + } } } return nil, err @@ -3858,20 +3855,17 @@ func (dm *DataManager) RemoveIndexes(idxItmType, tntCtx string, idxKeys ...strin return } itm := config.CgrConfig().DataDbCfg().Items[idxItmType] - // Handle replication for each key since replication API supports single key only - for _, idxKey := range idxKeys { - _ = dm.replicator.replicate( - utils.CacheInstanceToPrefix[idxItmType], tntCtx, // these are used to get the host IDs from cache - utils.ReplicatorSv1RemoveIndexes, - &utils.GetIndexesArg{ - IdxItmType: idxItmType, - TntCtx: tntCtx, - IdxKey: idxKey, - Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, - APIOpts: utils.GenerateDBItemOpts(itm.APIKey, itm.RouteID, - config.CgrConfig().DataDbCfg().RplCache, utils.EmptyString), - }, itm) - } + _ = dm.replicator.replicate( + utils.CacheInstanceToPrefix[idxItmType], tntCtx, // these are used to get the host IDs from cache + utils.ReplicatorSv1RemoveIndexes, + &utils.GetIndexesArg{ + IdxItmType: idxItmType, + TntCtx: tntCtx, + IdxKeys: idxKeys, + Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, + APIOpts: utils.GenerateDBItemOpts(itm.APIKey, itm.RouteID, + config.CgrConfig().DataDbCfg().RplCache, utils.EmptyString), + }, itm) return } diff --git a/engine/datamanager_test.go b/engine/datamanager_test.go index f81bbc972..8ad1e4367 100644 --- a/engine/datamanager_test.go +++ b/engine/datamanager_test.go @@ -4800,7 +4800,7 @@ func TestDmIndexes(t *testing.T) { if !cancast { return utils.ErrNotConvertible } - dm.DataDB().RemoveIndexesDrv(gIdxArg.IdxItmType, gIdxArg.Tenant, utils.EmptyString) + dm.DataDB().RemoveIndexesDrv(gIdxArg.IdxItmType, gIdxArg.Tenant, gIdxArg.IdxKeys...) return nil }, }, diff --git a/utils/coreutils.go b/utils/coreutils.go index 81fbc046d..eb5ec8797 100644 --- a/utils/coreutils.go +++ b/utils/coreutils.go @@ -930,7 +930,7 @@ func IsURL(path string) bool { type GetIndexesArg struct { IdxItmType string TntCtx string - IdxKey string + IdxKeys []string Tenant string APIOpts map[string]any }