2026-03-09 17:48:29 +08:00
|
|
|
package admin
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"ragflow/internal/common"
|
|
|
|
|
"sync"
|
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// ServerStatusStore is a thread-safe global server status storage
|
|
|
|
|
type ServerStatusStore struct {
|
|
|
|
|
mu sync.RWMutex
|
|
|
|
|
servers map[string]*common.BaseMessage // key: server_id
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GlobalServerStatusStore is the global instance
|
|
|
|
|
var GlobalServerStatusStore = &ServerStatusStore{
|
|
|
|
|
servers: make(map[string]*common.BaseMessage),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// UpdateStatus updates or adds a server status
|
2026-03-10 09:56:43 +08:00
|
|
|
func (s *ServerStatusStore) UpdateStatus(serverName string, status *common.BaseMessage) {
|
2026-03-09 17:48:29 +08:00
|
|
|
s.mu.Lock()
|
|
|
|
|
defer s.mu.Unlock()
|
2026-03-10 09:56:43 +08:00
|
|
|
s.servers[serverName] = status
|
2026-03-09 17:48:29 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetStatus gets a single server status
|
2026-03-10 09:56:43 +08:00
|
|
|
func (s *ServerStatusStore) GetStatus(serverName string) (*common.BaseMessage, bool) {
|
2026-03-09 17:48:29 +08:00
|
|
|
s.mu.RLock()
|
|
|
|
|
defer s.mu.RUnlock()
|
2026-03-10 09:56:43 +08:00
|
|
|
status, ok := s.servers[serverName]
|
2026-03-09 17:48:29 +08:00
|
|
|
return status, ok
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetAllStatuses gets all server statuses
|
|
|
|
|
func (s *ServerStatusStore) GetAllStatuses() []*common.BaseMessage {
|
|
|
|
|
s.mu.RLock()
|
|
|
|
|
defer s.mu.RUnlock()
|
|
|
|
|
result := make([]*common.BaseMessage, 0, len(s.servers))
|
|
|
|
|
for _, status := range s.servers {
|
|
|
|
|
result = append(result, status)
|
|
|
|
|
}
|
|
|
|
|
return result
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetStatusesByType gets server statuses by type
|
|
|
|
|
func (s *ServerStatusStore) GetStatusesByType(serverType common.ServerType) []*common.BaseMessage {
|
|
|
|
|
s.mu.RLock()
|
|
|
|
|
defer s.mu.RUnlock()
|
|
|
|
|
result := make([]*common.BaseMessage, 0)
|
|
|
|
|
for _, status := range s.servers {
|
|
|
|
|
if status.ServerType == serverType {
|
|
|
|
|
result = append(result, status)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return result
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// RemoveStatus removes a server status
|
|
|
|
|
func (s *ServerStatusStore) RemoveStatus(serverID string) {
|
|
|
|
|
s.mu.Lock()
|
|
|
|
|
defer s.mu.Unlock()
|
|
|
|
|
delete(s.servers, serverID)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CleanupStaleStatuses cleans up servers that haven't reported for a specified duration
|
|
|
|
|
func (s *ServerStatusStore) CleanupStaleStatuses(maxAge time.Duration) {
|
|
|
|
|
s.mu.Lock()
|
|
|
|
|
defer s.mu.Unlock()
|
|
|
|
|
now := time.Now()
|
|
|
|
|
for id, status := range s.servers {
|
|
|
|
|
if now.Sub(status.Timestamp) > maxAge {
|
|
|
|
|
delete(s.servers, id)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|