From aab7de6fbdc8b61dba044a372d20a090ba77b132 Mon Sep 17 00:00:00 2001 From: bang <3656828039@qq.com> Date: Wed, 20 May 2026 23:41:09 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20config=20=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=A3=80=E6=B5=8B=20+=20=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=8C=96=20+=20me=20flag=20=E8=BF=87?= =?UTF-8?q?=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 defaultLogDir() 通过 go.mod 自动定位项目根目录,消除硬编码相对路径 - WALPath/SSTablePath 使用自动检测的 log 目录 - 新增 meFlagArgs() 过滤命令行参数,仅传递 -me 相关参数给 flag 解析 - 日志规范化:使用结构化 slog 格式,去除冗余标签前缀 - 无效 me 值时用 panic 替代 os.Exit,更易于调试 Co-Authored-By: Claude Opus 4.7 (1M context) --- config/global.go | 68 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 13 deletions(-) diff --git a/config/global.go b/config/global.go index 69841ab..3485449 100644 --- a/config/global.go +++ b/config/global.go @@ -5,7 +5,9 @@ import ( "flag" "log/slog" "os" + "path/filepath" "strconv" + "strings" "github.com/NeverENG/BanDB/network/banIface" ) @@ -55,27 +57,28 @@ func (g *GlobalConfig) Init() { for _, path := range paths { data, err = os.ReadFile(path) if err == nil { - slog.Info("[INFO]:CONFIG FILE FOUND", "path", path) + slog.Info("config file found", "path", path) break } } if err != nil { - slog.Error("[ERROR]:READ CONFIG ERROR !", "error", err) - slog.Warn("[WARN]:USING DEFAULT CONFIG") + slog.Error("failed to read config", "error", err) + slog.Warn("falling back to default config") return // 使用默认配置,不退出 } err = json.Unmarshal(data, g) if err != nil { - slog.Error("[ERROR]:CONFIG PARSE ERROR", "error", err) + slog.Error("failed to parse config", "error", err) return } - slog.Info("[INFO]:CONFIG INIT SUCCESS") + slog.Info("config initialized") } func NewGlobalConfig() *GlobalConfig { + logDir := defaultLogDir() global := &GlobalConfig{ Name: "Raft", @@ -91,8 +94,8 @@ func NewGlobalConfig() *GlobalConfig { MaxMemTableP: 0.5, MaxMemTableLevel: 32, MaxMemTableSize: 1024, - WALPath: "../../../log/wal.log", - SSTablePath: "../../../log", + WALPath: filepath.Join(logDir, "wal.log"), + SSTablePath: logDir, Peers: []string{"localhost:8080"}, // 默认单节点 Me: 0, // 默认节点ID RaftSnapshotThreshold: 1000, // 默认快照阈值 @@ -103,6 +106,26 @@ func NewGlobalConfig() *GlobalConfig { return global } +func defaultLogDir() string { + wd, err := os.Getwd() + if err != nil { + return "log" + } + + for dir := wd; ; dir = filepath.Dir(dir) { + if _, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil { + return filepath.Join(dir, "log") + } + + parent := filepath.Dir(dir) + if parent == dir { + break + } + } + + return "log" +} + // ParseFlags 解析命令行参数 func (g *GlobalConfig) ParseFlags() { // 创建一个新的 FlagSet,避免与全局的 CommandLine 冲突 @@ -113,7 +136,7 @@ func (g *GlobalConfig) ParseFlags() { meFlag := fs.Int("me", -1, "Current node index in peers list") // 解析命令行参数,忽略未定义的参数 - err := fs.Parse(os.Args[1:]) + err := fs.Parse(meFlagArgs(os.Args[1:])) if err != nil { // 忽略错误,继续执行 } @@ -121,7 +144,7 @@ func (g *GlobalConfig) ParseFlags() { // 处理命令行参数 if *meFlag >= 0 { g.Me = *meFlag - slog.Info("[INFO]:ME SET BY FLAG", "me", g.Me) + slog.Info("me set via flag", "me", g.Me) } // 处理环境变量(优先级低于命令行参数) @@ -129,18 +152,37 @@ func (g *GlobalConfig) ParseFlags() { if meEnv := os.Getenv("RAFT_ME"); meEnv != "" { if meInt, err := strconv.Atoi(meEnv); err == nil { g.Me = meInt - slog.Info("[INFO]:ME SET BY ENV", "me", g.Me) + slog.Info("me set via env", "me", g.Me) } } } // 验证配置 if g.Me < 0 || g.Me >= len(g.Peers) { - slog.Error("[ERROR]:INVALID ME VALUE", "me", g.Me, "peers_len", len(g.Peers)) - os.Exit(1) + slog.Error("invalid me value", "me", g.Me, "peers_len", len(g.Peers)) + panic("invalid me value") } - slog.Info("[INFO]:CONFIG FINALIZED", "peers", g.Peers, "me", g.Me) + slog.Info("config finalized", "peers", g.Peers, "me", g.Me) +} + +func meFlagArgs(args []string) []string { + filtered := make([]string, 0, 2) + for i := 0; i < len(args); i++ { + arg := args[i] + if arg == "-me" { + filtered = append(filtered, arg) + if i+1 < len(args) { + filtered = append(filtered, args[i+1]) + i++ + } + continue + } + if strings.HasPrefix(arg, "-me=") { + filtered = append(filtered, arg) + } + } + return filtered } var G = NewGlobalConfig()