Skip to content

feat: support Redis cluster connection mode#652

Merged
Seechi-Yolo merged 1 commit into
mainfrom
dev-decathlon-redis-cluster-conn-937
Jul 23, 2026
Merged

feat: support Redis cluster connection mode#652
Seechi-Yolo merged 1 commit into
mainfrom
dev-decathlon-redis-cluster-conn-937

Conversation

@LordofAvernus

@LordofAvernus LordofAvernus commented Jul 22, 2026

Copy link
Copy Markdown
Collaborator

User description

Related issue

https://github.com/actiontech/dms-ee/issues/937

Changes

  • Support Redis standalone and Cluster connection mode submission scope for dms.
  • Preserve standalone compatibility while enabling explicit Cluster mode.

Description

  • 增加 Redis 连接模式参数支持,包括 standalone 和 cluster

  • 调整 DBService 用户必填校验,适配 Redis 集群场景

  • 新增 biz 与 service 层 Redis 连接模式辅助函数

  • 统一规范化 Redis 参数处理逻辑


Diagram Walkthrough

flowchart LR
  A["修改 DBService 结构"] --> B["添加 Redis 模式辅助函数"]
  B --> C["调整用户字段校验逻辑"]
  C --> D["统一参数规范化处理"]
Loading

File Walkthrough

Relevant files
Enhancement
db_service.go
修改用户字段必填校验逻辑                                                                                         

api/dms/service/v1/db_service.go

  • 移除用户字段必填验证
  • 保留兼容性修改
+3/-3     
db_service.go
修改 V2 用户字段验证逻辑                                                                                     

api/dms/service/v2/db_service.go

  • 移除用户字段必填验证
  • 保持接口兼容与一致性
+2/-2     
db_service.go
添加 Redis 模式支持逻辑                                                                                   

internal/dms/biz/db_service.go

  • 调用 appendRedisConnectionModeIfMissing 函数
  • 调整更新校验逻辑,支持 Redis 集群模式
+11/-3   
redis_connection_mode.go
新增 Redis 模式业务辅助函数                                                                               

internal/dms/biz/redis_connection_mode.go

  • 新增 Redis 连接模式辅助函数
  • 实现参数归一化与校验方法
+67/-0   
db_service.go
更新 DBService 方法集成 Redis 连接模式                                                         

internal/dms/service/db_service.go

  • 集成 Redis 模式参数校验入各接口
  • 调用 set/normalize/validate 辅助函数
+62/-11 
redis_connection_mode.go
新增 Redis 模式 Service 辅助支持                                                                 

internal/dms/service/redis_connection_mode.go

  • 新增 service 层 Redis 模式辅助方法
  • 实现参数设置与校验逻辑
+151/-0 

@github-actions

Copy link
Copy Markdown

PR Reviewer Guide 🔍

⏱️ Estimated effort to review: 4 🔵🔵🔵🔵⚪
🧪 No relevant tests
🔒 No security concerns identified
⚡ Recommended focus areas for review

用户验证

在更改 User 字段时取消了原有必填验证,而后续在更新逻辑中仅对非 Redis Cluster 的场景进行了检查,这可能导致各层验证逻辑不一致,在部分使用场景下容易产生未预期的行为。建议在各层保持一致的验证逻辑,确保数据完整性。

User string `json:"user"`
代码重复

与业务层中关于 Redis 连接模式辅助函数的实现逻辑重复,重复代码会增加维护难度。建议考虑将公共逻辑抽离到共用模块中以便复用,避免将来出现功能修改时遗漏同步问题。

package service

import (
	"fmt"
	"strings"

	pkgConst "github.com/actiontech/dms/internal/dms/pkg/constant"
	dmsCommonV1 "github.com/actiontech/dms/pkg/dms-common/api/dms/v1"
	"github.com/actiontech/dms/pkg/params"
)

const (
	redisConnectionModeParam      = "connection_mode"
	redisConnectionModeStandalone = "standalone"
	redisConnectionModeCluster    = "cluster"
)

func isRedisDBType(dbType string) bool {
	return strings.EqualFold(dbType, string(pkgConst.DBTypeRedis))
}

func isRedisConnectionModeParam(dbType, name string) bool {
	return isRedisDBType(dbType) && name == redisConnectionModeParam
}

func normalizeRedisConnectionModeValue(value string) (string, error) {
	switch strings.TrimSpace(value) {
	case "", redisConnectionModeStandalone:
		return redisConnectionModeStandalone, nil
	case redisConnectionModeCluster:
		return redisConnectionModeCluster, nil
	default:
		return "", fmt.Errorf("invalid redis connection_mode: %s", value)
	}
}

func setRedisConnectionModeParam(additionalParams *params.Params, value string) error {
	mode, err := normalizeRedisConnectionModeValue(value)
	if err != nil {
		return err
	}
	if additionalParams == nil {
		return fmt.Errorf("additional params is nil")
	}
	if param := additionalParams.GetParam(redisConnectionModeParam); param != nil {
		param.Value = mode
		return nil
	}
	*additionalParams = append(*additionalParams, &params.Param{
		Key:   redisConnectionModeParam,
		Value: mode,
		Desc:  "Redis connection mode",
		Type:  params.ParamTypeString,
	})
	return nil
}

func normalizeRedisConnectionModeParams(dbType string, additionalParams *params.Params) error {
	if !isRedisDBType(dbType) {
		return nil
	}
	value := ""
	if additionalParams != nil {
		value = additionalParams.GetParam(redisConnectionModeParam).String()
	}
	return setRedisConnectionModeParam(additionalParams, value)
}

func validateDBServiceUser(dbType, user string, additionalParams params.Params) error {
	if isRedisDBType(dbType) {
		mode, err := normalizeRedisConnectionModeValue(additionalParams.GetParam(redisConnectionModeParam).String())
		if err != nil {
			return err
		}
		if mode == redisConnectionModeCluster {
			return nil
		}
	}
	if user == "" {
		return fmt.Errorf("db service user can't be empty")
	}
	return nil
}

func normalizeCheckDbConnectable(dbService *dmsCommonV1.CheckDbConnectable) error {
	if dbService == nil || !isRedisDBType(dbService.DBType) {
		if dbService != nil && dbService.User == "" {
			return fmt.Errorf("db service user can't be empty")
		}
		return nil
	}
	mode := ""
	for _, item := range dbService.AdditionalParams {
		if item != nil && item.Name == redisConnectionModeParam {
			mode = item.Value
			break
		}
	}
	normalizedMode, err := normalizeRedisConnectionModeValue(mode)
	if err != nil {
		return err
	}
	found := false
	for _, item := range dbService.AdditionalParams {
		if item != nil && item.Name == redisConnectionModeParam {
			item.Value = normalizedMode
			found = true
			break
		}
	}
	if !found {
		dbService.AdditionalParams = append(dbService.AdditionalParams, &dmsCommonV1.AdditionalParam{
			Name:  redisConnectionModeParam,
			Value: normalizedMode,
			Type:  string(params.ParamTypeString),
		})
	}
	if normalizedMode != redisConnectionModeCluster && dbService.User == "" {
		return fmt.Errorf("db service user can't be empty")
	}
	return nil
}

func appendRedisConnectionModeIfMissing(dbType string, additionalParams []*dmsCommonV1.AdditionalParam) ([]*dmsCommonV1.AdditionalParam, error) {
	if !isRedisDBType(dbType) {
		return additionalParams, nil
	}
	mode := ""
	for _, item := range additionalParams {
		if item != nil && item.Name == redisConnectionModeParam {
			mode = item.Value
			break
		}
	}
	normalizedMode, err := normalizeRedisConnectionModeValue(mode)
	if err != nil {
		return nil, err
	}
	for _, item := range additionalParams {
		if item != nil && item.Name == redisConnectionModeParam {
			item.Value = normalizedMode
			return additionalParams, nil
		}
	}
	return append(additionalParams, &dmsCommonV1.AdditionalParam{
		Name:        redisConnectionModeParam,
		Value:       normalizedMode,
		Description: "Redis connection mode",
		Type:        string(params.ParamTypeString),
	}), nil
}

@github-actions

Copy link
Copy Markdown

PR Code Suggestions ✨

No code suggestions found for the PR.

@Seechi-Yolo
Seechi-Yolo merged commit 27df591 into main Jul 23, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants