- Add log package tests (AccessLog and ShareLog Good/Bad/Ugly triads) - Fix nil pointer panic in pool.NewStrategyFactory when config is nil - Add Worker Hashrate Good/Bad/Ugly test triad - Add ConfigWatcher Start Bad test (nonexistent path) - Add FailoverStrategy CurrentPools Bad/Ugly, EnabledPools Good/Bad/Ugly, and NewStrategyFactory Good/Bad/Ugly test triads - Improve doc comments on Stats, StatsSummary, Workers, WorkerRecord with AX-compliant usage examples Co-Authored-By: Virgil <virgil@lethean.io>
37 lines
1.1 KiB
Go
37 lines
1.1 KiB
Go
package proxy
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
// Workers maintains per-worker aggregate stats. Workers are identified by name,
|
|
// derived from the miner's login fields per WorkersMode.
|
|
//
|
|
// workers := proxy.NewWorkers(proxy.WorkersByRigID, bus)
|
|
// workers.OnLogin(proxy.Event{Miner: miner})
|
|
// records := workers.List()
|
|
type Workers struct {
|
|
mode WorkersMode
|
|
entries []WorkerRecord // ordered by first-seen (stable)
|
|
nameIndex map[string]int // workerName → entries index
|
|
idIndex map[int64]int // minerID → entries index
|
|
subscribed bool
|
|
mu sync.RWMutex
|
|
}
|
|
|
|
// WorkerRecord is the per-identity aggregate with rolling hashrate windows.
|
|
//
|
|
// record := proxy.WorkerRecord{Name: "rig-alpha", Accepted: 10, Hashes: 500000}
|
|
// hr60 := record.Hashrate(60) // H/s over the last 60 seconds
|
|
type WorkerRecord struct {
|
|
Name string
|
|
LastIP string
|
|
Connections uint64
|
|
Accepted uint64
|
|
Rejected uint64
|
|
Invalid uint64
|
|
Hashes uint64 // sum of accepted share difficulties
|
|
LastHashAt time.Time
|
|
windows [5]tickWindow // 60s, 600s, 3600s, 12h, 24h
|
|
}
|