mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-06-07 13:44:24 +00:00
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:
parent
c74b1cfb0f
commit
db2c78d0bb
3 changed files with 24 additions and 5 deletions
|
|
@ -1 +1 @@
|
||||||
v1.6.4
|
v1.6.5
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue