From db2c78d0bb7404c5d87422d62ec9d55ca1f10dd5 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 24 Apr 2026 22:08:00 +0800 Subject: [PATCH] fix: add error logging for node state writes and queries Silent error swallowing made it impossible to diagnose why worker couldn't see master's heartbeat. Now logs errors from: - updateNodeState upsert failures - writeStateToSharedMariaDB connection/write failures - getNodeStatesShared query failures - list endpoint shows state count in logs Also improved First() call to not overwrite state on error. Bump version to v1.6.5. --- config/version | 2 +- web/controller/node.go | 12 +++++++++++- web/service/node_sync.go | 15 ++++++++++++--- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/config/version b/config/version index 4f1826fe..bf991aff 100644 --- a/config/version +++ b/config/version @@ -1 +1 @@ -v1.6.4 \ No newline at end of file +v1.6.5 \ No newline at end of file diff --git a/web/controller/node.go b/web/controller/node.go index 59dc6684..1c98b078 100644 --- a/web/controller/node.go +++ b/web/controller/node.go @@ -1,6 +1,7 @@ package controller import ( + "log" "os" "strconv" "time" @@ -48,13 +49,18 @@ type NodeView struct { func getNodeStatesFromShared() ([]model.NodeState, error) { // If current DB is already MariaDB, use it directly if config.GetDBTypeFromJSON() == "mariadb" { - return database.GetNodeStates() + states, err := database.GetNodeStates() + if err != nil { + log.Printf("[NodeList] GetNodeStates error: %v", err) + } + return states, err } // Otherwise, open a temporary connection to the shared MariaDB dbConfig := config.GetDBConfigFromJSON() db, err := database.OpenMariaDB(dbConfig) if err != nil { + log.Printf("[NodeList] failed to open shared MariaDB: %v", err) return nil, err } sqlDB, _ := db.DB() @@ -62,6 +68,9 @@ func getNodeStatesFromShared() ([]model.NodeState, error) { var states []model.NodeState err = db.Order("node_id").Find(&states).Error + if err != nil { + log.Printf("[NodeList] failed to query shared MariaDB node_states: %v", err) + } return states, err } @@ -73,6 +82,7 @@ func (a *NodeController) list(c *gin.Context) { jsonMsg(c, "get node states", err) return } + log.Printf("[NodeList] role=%s nodeId=%s, found %d states in shared DB", nodeCfg.Role, nodeCfg.NodeID, len(states)) syncInterval := nodeCfg.SyncIntervalSeconds if syncInterval <= 0 { diff --git a/web/service/node_sync.go b/web/service/node_sync.go index 3c8dd95f..30faaf13 100644 --- a/web/service/node_sync.go +++ b/web/service/node_sync.go @@ -3,6 +3,7 @@ package service import ( "context" "errors" + "log" "os" "time" @@ -45,7 +46,10 @@ func (s *NodeSyncService) updateNodeState(version int64, syncErr error, didSync } now := time.Now().Unix() state := &model.NodeState{} - _ = database.GetDB().First(state, "node_id = ?", nodeCfg.NodeID).Error + if err := database.GetDB().First(state, "node_id = ?", nodeCfg.NodeID).Error; err != nil { + // First heartbeat — record doesn't exist yet, that's OK + state = &model.NodeState{} + } state.NodeID = nodeCfg.NodeID state.NodeRole = string(nodeCfg.Role) state.LastHeartbeatAt = now @@ -58,7 +62,9 @@ func (s *NodeSyncService) updateNodeState(version int64, syncErr error, didSync } else { state.LastError = "" } - _ = database.UpsertNodeState(database.GetDB(), state) + if err := database.UpsertNodeState(database.GetDB(), state); err != nil { + log.Printf("[NodeSync] failed to upsert node state for %s: %v", nodeCfg.NodeID, err) + } // Master also writes heartbeat to shared MariaDB so workers can see it if nodeCfg.Role == config.NodeRoleMaster { @@ -78,11 +84,14 @@ func (s *NodeSyncService) writeStateToSharedMariaDB(state *model.NodeState) { } sharedDB, err := database.OpenMariaDB(dbConfig) if err != nil { + log.Printf("[NodeSync] failed to open shared MariaDB for heartbeat: %v", err) return } sqlDB, _ := sharedDB.DB() defer sqlDB.Close() - _ = database.UpsertNodeState(sharedDB, state) + if err := database.UpsertNodeState(sharedDB, state); err != nil { + log.Printf("[NodeSync] failed to upsert node state to shared MariaDB: %v", err) + } } func (s *NodeSyncService) BootstrapFromCache() error {