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.
This commit is contained in:
root 2026-04-24 22:08:00 +08:00
parent c74b1cfb0f
commit db2c78d0bb
3 changed files with 24 additions and 5 deletions

View file

@ -1 +1 @@
v1.6.4 v1.6.5

View file

@ -1,6 +1,7 @@
package controller package controller
import ( import (
"log"
"os" "os"
"strconv" "strconv"
"time" "time"
@ -48,13 +49,18 @@ type NodeView struct {
func getNodeStatesFromShared() ([]model.NodeState, error) { func getNodeStatesFromShared() ([]model.NodeState, error) {
// If current DB is already MariaDB, use it directly // If current DB is already MariaDB, use it directly
if config.GetDBTypeFromJSON() == "mariadb" { 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 // Otherwise, open a temporary connection to the shared MariaDB
dbConfig := config.GetDBConfigFromJSON() dbConfig := config.GetDBConfigFromJSON()
db, err := database.OpenMariaDB(dbConfig) db, err := database.OpenMariaDB(dbConfig)
if err != nil { if err != nil {
log.Printf("[NodeList] failed to open shared MariaDB: %v", err)
return nil, err return nil, err
} }
sqlDB, _ := db.DB() sqlDB, _ := db.DB()
@ -62,6 +68,9 @@ func getNodeStatesFromShared() ([]model.NodeState, error) {
var states []model.NodeState var states []model.NodeState
err = db.Order("node_id").Find(&states).Error 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 return states, err
} }
@ -73,6 +82,7 @@ func (a *NodeController) list(c *gin.Context) {
jsonMsg(c, "get node states", err) jsonMsg(c, "get node states", err)
return return
} }
log.Printf("[NodeList] role=%s nodeId=%s, found %d states in shared DB", nodeCfg.Role, nodeCfg.NodeID, len(states))
syncInterval := nodeCfg.SyncIntervalSeconds syncInterval := nodeCfg.SyncIntervalSeconds
if syncInterval <= 0 { if syncInterval <= 0 {

View file

@ -3,6 +3,7 @@ package service
import ( import (
"context" "context"
"errors" "errors"
"log"
"os" "os"
"time" "time"
@ -45,7 +46,10 @@ func (s *NodeSyncService) updateNodeState(version int64, syncErr error, didSync
} }
now := time.Now().Unix() now := time.Now().Unix()
state := &model.NodeState{} 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.NodeID = nodeCfg.NodeID
state.NodeRole = string(nodeCfg.Role) state.NodeRole = string(nodeCfg.Role)
state.LastHeartbeatAt = now state.LastHeartbeatAt = now
@ -58,7 +62,9 @@ func (s *NodeSyncService) updateNodeState(version int64, syncErr error, didSync
} else { } else {
state.LastError = "" 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 // Master also writes heartbeat to shared MariaDB so workers can see it
if nodeCfg.Role == config.NodeRoleMaster { if nodeCfg.Role == config.NodeRoleMaster {
@ -78,11 +84,14 @@ func (s *NodeSyncService) writeStateToSharedMariaDB(state *model.NodeState) {
} }
sharedDB, err := database.OpenMariaDB(dbConfig) sharedDB, err := database.OpenMariaDB(dbConfig)
if err != nil { if err != nil {
log.Printf("[NodeSync] failed to open shared MariaDB for heartbeat: %v", err)
return return
} }
sqlDB, _ := sharedDB.DB() sqlDB, _ := sharedDB.DB()
defer sqlDB.Close() 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 { func (s *NodeSyncService) BootstrapFromCache() error {