refactor(proxy): use clearer runtime names
Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
parent
22d3cd9c09
commit
f16c9033e3
9 changed files with 80 additions and 80 deletions
|
|
@ -76,7 +76,7 @@ func (w *ConfigWatcher) Start() {
|
|||
ticker := time.NewTicker(time.Second)
|
||||
defer ticker.Stop()
|
||||
if info, errorValue := os.Stat(w.path); errorValue == nil {
|
||||
w.lastMod = info.ModTime()
|
||||
w.lastModified = info.ModTime()
|
||||
}
|
||||
|
||||
for {
|
||||
|
|
@ -87,10 +87,10 @@ func (w *ConfigWatcher) Start() {
|
|||
continue
|
||||
}
|
||||
|
||||
if !info.ModTime().After(w.lastMod) {
|
||||
if !info.ModTime().After(w.lastModified) {
|
||||
continue
|
||||
}
|
||||
w.lastMod = info.ModTime()
|
||||
w.lastModified = info.ModTime()
|
||||
|
||||
config, errorValue := LoadConfig(w.path)
|
||||
if errorValue == nil && w.onChange != nil {
|
||||
|
|
|
|||
|
|
@ -27,12 +27,12 @@ import (
|
|||
// client := pool.NewStratumClient(poolCfg, listener)
|
||||
// client.Connect()
|
||||
type StratumClient struct {
|
||||
cfg proxy.PoolConfig
|
||||
config proxy.PoolConfig
|
||||
listener StratumListener
|
||||
conn net.Conn
|
||||
tlsConn *tls.Conn // nil if plain TCP
|
||||
sessionID string // pool-assigned session id from login reply
|
||||
seq int64 // atomic JSON-RPC request id counter
|
||||
sequence int64 // atomic JSON-RPC request id counter
|
||||
active bool // true once first job received
|
||||
disconnectOnce sync.Once
|
||||
sendMu sync.Mutex
|
||||
|
|
@ -73,7 +73,7 @@ type jsonRPCErrorBody struct {
|
|||
// client := pool.NewStratumClient(poolCfg, listener)
|
||||
func NewStratumClient(cfg proxy.PoolConfig, listener StratumListener) *StratumClient {
|
||||
return &StratumClient{
|
||||
cfg: cfg,
|
||||
config: cfg,
|
||||
listener: listener,
|
||||
}
|
||||
}
|
||||
|
|
@ -85,18 +85,18 @@ func (c *StratumClient) Connect() error {
|
|||
var connection net.Conn
|
||||
var errorValue error
|
||||
dialer := net.Dialer{}
|
||||
if c.cfg.Keepalive {
|
||||
if c.config.Keepalive {
|
||||
dialer.KeepAlive = 30 * time.Second
|
||||
}
|
||||
|
||||
if c.cfg.TLS {
|
||||
connection, errorValue = dialer.Dial("tcp", c.cfg.URL)
|
||||
if c.config.TLS {
|
||||
connection, errorValue = dialer.Dial("tcp", c.config.URL)
|
||||
if errorValue != nil {
|
||||
return errorValue
|
||||
}
|
||||
|
||||
serverName := c.cfg.URL
|
||||
if host, _, splitError := net.SplitHostPort(c.cfg.URL); splitError == nil && host != "" {
|
||||
serverName := c.config.URL
|
||||
if host, _, splitError := net.SplitHostPort(c.config.URL); splitError == nil && host != "" {
|
||||
serverName = host
|
||||
}
|
||||
|
||||
|
|
@ -106,7 +106,7 @@ func (c *StratumClient) Connect() error {
|
|||
_ = connection.Close()
|
||||
return errorValue
|
||||
}
|
||||
if c.cfg.TLSFingerprint != "" {
|
||||
if c.config.TLSFingerprint != "" {
|
||||
state := tlsConnection.ConnectionState()
|
||||
if len(state.PeerCertificates) == 0 {
|
||||
_ = connection.Close()
|
||||
|
|
@ -114,7 +114,7 @@ func (c *StratumClient) Connect() error {
|
|||
}
|
||||
|
||||
fingerprint := sha256.Sum256(state.PeerCertificates[0].Raw)
|
||||
if hex.EncodeToString(fingerprint[:]) != strings.ToLower(c.cfg.TLSFingerprint) {
|
||||
if hex.EncodeToString(fingerprint[:]) != strings.ToLower(c.config.TLSFingerprint) {
|
||||
_ = connection.Close()
|
||||
return errors.New("pool fingerprint mismatch")
|
||||
}
|
||||
|
|
@ -122,7 +122,7 @@ func (c *StratumClient) Connect() error {
|
|||
connection = tlsConnection
|
||||
c.tlsConn = tlsConnection
|
||||
} else {
|
||||
connection, errorValue = dialer.Dial("tcp", c.cfg.URL)
|
||||
connection, errorValue = dialer.Dial("tcp", c.config.URL)
|
||||
if errorValue != nil {
|
||||
return errorValue
|
||||
}
|
||||
|
|
@ -139,12 +139,12 @@ func (c *StratumClient) Connect() error {
|
|||
// client.Login()
|
||||
func (c *StratumClient) Login() {
|
||||
params := map[string]interface{}{
|
||||
"login": c.cfg.User,
|
||||
"pass": c.cfg.Pass,
|
||||
"rigid": c.cfg.RigID,
|
||||
"login": c.config.User,
|
||||
"pass": c.config.Pass,
|
||||
"rigid": c.config.RigID,
|
||||
}
|
||||
if c.cfg.Algo != "" {
|
||||
params["algo"] = []string{c.cfg.Algo}
|
||||
if c.config.Algo != "" {
|
||||
params["algo"] = []string{c.config.Algo}
|
||||
}
|
||||
|
||||
_ = c.writeJSON(jsonRPCRequest{
|
||||
|
|
@ -158,7 +158,7 @@ func (c *StratumClient) Login() {
|
|||
//
|
||||
// seq := client.Submit(jobID, "deadbeef", "HASH64HEX", "cn/r")
|
||||
func (c *StratumClient) Submit(jobID string, nonce string, result string, algo string) int64 {
|
||||
sequence := atomic.AddInt64(&c.seq, 1)
|
||||
sequence := atomic.AddInt64(&c.sequence, 1)
|
||||
params := map[string]string{
|
||||
"id": c.sessionID,
|
||||
"job_id": jobID,
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ type FailoverStrategy struct {
|
|||
current int
|
||||
client *StratumClient
|
||||
listener StratumListener
|
||||
cfg *proxy.Config
|
||||
config *proxy.Config
|
||||
closed bool
|
||||
running bool
|
||||
mu sync.Mutex
|
||||
|
|
@ -58,7 +58,7 @@ func NewFailoverStrategy(pools []proxy.PoolConfig, listener StratumListener, cfg
|
|||
return &FailoverStrategy{
|
||||
pools: append([]proxy.PoolConfig(nil), pools...),
|
||||
listener: listener,
|
||||
cfg: cfg,
|
||||
config: cfg,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -87,8 +87,8 @@ func (s *FailoverStrategy) connectFrom(start int) {
|
|||
}()
|
||||
|
||||
pools := s.pools
|
||||
if s.cfg != nil && len(s.cfg.Pools) > 0 {
|
||||
pools = s.cfg.Pools
|
||||
if s.config != nil && len(s.config.Pools) > 0 {
|
||||
pools = s.config.Pools
|
||||
}
|
||||
if len(pools) == 0 {
|
||||
return
|
||||
|
|
@ -96,12 +96,12 @@ func (s *FailoverStrategy) connectFrom(start int) {
|
|||
|
||||
retries := 1
|
||||
pause := time.Duration(0)
|
||||
if s.cfg != nil {
|
||||
if s.cfg.Retries > 0 {
|
||||
retries = s.cfg.Retries
|
||||
if s.config != nil {
|
||||
if s.config.Retries > 0 {
|
||||
retries = s.config.Retries
|
||||
}
|
||||
if s.cfg.RetryPause > 0 {
|
||||
pause = time.Duration(s.cfg.RetryPause) * time.Second
|
||||
if s.config.RetryPause > 0 {
|
||||
pause = time.Duration(s.config.RetryPause) * time.Second
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
14
proxy.go
14
proxy.go
|
|
@ -96,10 +96,10 @@ type CloseEvent struct {
|
|||
// })
|
||||
// w.Start()
|
||||
type ConfigWatcher struct {
|
||||
path string
|
||||
onChange func(*Config)
|
||||
lastMod time.Time
|
||||
done chan struct{}
|
||||
path string
|
||||
onChange func(*Config)
|
||||
lastModified time.Time
|
||||
done chan struct{}
|
||||
}
|
||||
|
||||
// RateLimiter implements per-IP token bucket connection rate limiting.
|
||||
|
|
@ -110,7 +110,7 @@ type ConfigWatcher struct {
|
|||
// rl := proxy.NewRateLimiter(cfg.RateLimit)
|
||||
// if !rl.Allow("1.2.3.4") { conn.Close(); return }
|
||||
type RateLimiter struct {
|
||||
cfg RateLimit
|
||||
config RateLimit
|
||||
buckets map[string]*tokenBucket
|
||||
banned map[string]time.Time
|
||||
mu sync.Mutex
|
||||
|
|
@ -128,8 +128,8 @@ type tokenBucket struct {
|
|||
// cd := proxy.NewCustomDiff(cfg.CustomDiff)
|
||||
// bus.Subscribe(proxy.EventLogin, cd.OnLogin)
|
||||
type CustomDiff struct {
|
||||
globalDiff uint64
|
||||
mu sync.RWMutex
|
||||
defaultDifficulty uint64
|
||||
mu sync.RWMutex
|
||||
}
|
||||
|
||||
var splitterFactories = map[string]func(*Config, *EventBus) Splitter{
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ func TestProxy_Reload_Good(t *testing.T) {
|
|||
if proxyValue.config.CustomDiff != 250 {
|
||||
t.Fatalf("expected custom diff to reload, got %d", proxyValue.config.CustomDiff)
|
||||
}
|
||||
if proxyValue.customDiff == nil || proxyValue.customDiff.globalDiff != 250 {
|
||||
if proxyValue.customDiff == nil || proxyValue.customDiff.defaultDifficulty != 250 {
|
||||
t.Fatalf("expected live custom diff to update, got %+v", proxyValue.customDiff)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ import (
|
|||
// rl := proxy.NewRateLimiter(cfg.RateLimit)
|
||||
func NewRateLimiter(config RateLimit) *RateLimiter {
|
||||
return &RateLimiter{
|
||||
cfg: config,
|
||||
config: config,
|
||||
buckets: make(map[string]*tokenBucket),
|
||||
banned: make(map[string]time.Time),
|
||||
}
|
||||
|
|
@ -26,7 +26,7 @@ func (rateLimiter *RateLimiter) SetConfig(config RateLimit) {
|
|||
}
|
||||
|
||||
rateLimiter.mu.Lock()
|
||||
rateLimiter.cfg = config
|
||||
rateLimiter.config = config
|
||||
rateLimiter.mu.Unlock()
|
||||
}
|
||||
|
||||
|
|
@ -44,7 +44,7 @@ func (rateLimiter *RateLimiter) Allow(ip string) bool {
|
|||
rateLimiter.mu.Lock()
|
||||
defer rateLimiter.mu.Unlock()
|
||||
|
||||
if rateLimiter.cfg.MaxConnectionsPerMinute <= 0 {
|
||||
if rateLimiter.config.MaxConnectionsPerMinute <= 0 {
|
||||
return true
|
||||
}
|
||||
|
||||
|
|
@ -58,7 +58,7 @@ func (rateLimiter *RateLimiter) Allow(ip string) bool {
|
|||
bucket, exists := rateLimiter.buckets[host]
|
||||
if !exists {
|
||||
bucket = &tokenBucket{
|
||||
tokens: rateLimiter.cfg.MaxConnectionsPerMinute,
|
||||
tokens: rateLimiter.config.MaxConnectionsPerMinute,
|
||||
lastRefill: now,
|
||||
}
|
||||
rateLimiter.buckets[host] = bucket
|
||||
|
|
@ -66,8 +66,8 @@ func (rateLimiter *RateLimiter) Allow(ip string) bool {
|
|||
|
||||
rateLimiter.refillBucket(bucket, now)
|
||||
if bucket.tokens <= 0 {
|
||||
if rateLimiter.cfg.BanDurationSeconds > 0 {
|
||||
rateLimiter.banned[host] = now.Add(time.Duration(rateLimiter.cfg.BanDurationSeconds) * time.Second)
|
||||
if rateLimiter.config.BanDurationSeconds > 0 {
|
||||
rateLimiter.banned[host] = now.Add(time.Duration(rateLimiter.config.BanDurationSeconds) * time.Second)
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
|
@ -88,7 +88,7 @@ func (rateLimiter *RateLimiter) Tick() {
|
|||
rateLimiter.mu.Lock()
|
||||
defer rateLimiter.mu.Unlock()
|
||||
|
||||
if rateLimiter.cfg.MaxConnectionsPerMinute <= 0 {
|
||||
if rateLimiter.config.MaxConnectionsPerMinute <= 0 {
|
||||
return
|
||||
}
|
||||
|
||||
|
|
@ -104,11 +104,11 @@ func (rateLimiter *RateLimiter) Tick() {
|
|||
}
|
||||
|
||||
func (rateLimiter *RateLimiter) refillBucket(bucket *tokenBucket, now time.Time) {
|
||||
if bucket == nil || rateLimiter.cfg.MaxConnectionsPerMinute <= 0 {
|
||||
if bucket == nil || rateLimiter.config.MaxConnectionsPerMinute <= 0 {
|
||||
return
|
||||
}
|
||||
|
||||
refillEvery := time.Minute / time.Duration(rateLimiter.cfg.MaxConnectionsPerMinute)
|
||||
refillEvery := time.Minute / time.Duration(rateLimiter.config.MaxConnectionsPerMinute)
|
||||
if refillEvery <= 0 {
|
||||
refillEvery = time.Second
|
||||
}
|
||||
|
|
@ -120,8 +120,8 @@ func (rateLimiter *RateLimiter) refillBucket(bucket *tokenBucket, now time.Time)
|
|||
|
||||
tokensToAdd := int(elapsed / refillEvery)
|
||||
bucket.tokens += tokensToAdd
|
||||
if bucket.tokens > rateLimiter.cfg.MaxConnectionsPerMinute {
|
||||
bucket.tokens = rateLimiter.cfg.MaxConnectionsPerMinute
|
||||
if bucket.tokens > rateLimiter.config.MaxConnectionsPerMinute {
|
||||
bucket.tokens = rateLimiter.config.MaxConnectionsPerMinute
|
||||
}
|
||||
bucket.lastRefill = bucket.lastRefill.Add(time.Duration(tokensToAdd) * refillEvery)
|
||||
}
|
||||
|
|
@ -130,7 +130,7 @@ func (rateLimiter *RateLimiter) refillBucket(bucket *tokenBucket, now time.Time)
|
|||
//
|
||||
// cd := proxy.NewCustomDiff(50000)
|
||||
func NewCustomDiff(globalDiff uint64) *CustomDiff {
|
||||
return &CustomDiff{globalDiff: globalDiff}
|
||||
return &CustomDiff{defaultDifficulty: globalDiff}
|
||||
}
|
||||
|
||||
// SetGlobalDiff updates the default custom difficulty override.
|
||||
|
|
@ -142,7 +142,7 @@ func (customDiff *CustomDiff) SetGlobalDiff(globalDiff uint64) {
|
|||
}
|
||||
|
||||
customDiff.mu.Lock()
|
||||
customDiff.globalDiff = globalDiff
|
||||
customDiff.defaultDifficulty = globalDiff
|
||||
customDiff.mu.Unlock()
|
||||
}
|
||||
|
||||
|
|
@ -172,7 +172,7 @@ func (customDiff *CustomDiff) OnLogin(event Event) {
|
|||
}
|
||||
|
||||
customDiff.mu.RLock()
|
||||
globalDiff := customDiff.globalDiff
|
||||
globalDiff := customDiff.defaultDifficulty
|
||||
customDiff.mu.RUnlock()
|
||||
if globalDiff > 0 {
|
||||
event.Miner.SetCustomDiff(globalDiff)
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ type NonceMapper struct {
|
|||
storage *NonceStorage
|
||||
strategy pool.Strategy // manages pool client lifecycle and failover
|
||||
pending map[int64]SubmitContext // sequence → {requestID, minerID, jobID}
|
||||
cfg *proxy.Config
|
||||
config *proxy.Config
|
||||
events *proxy.EventBus
|
||||
active bool // true once pool has sent at least one job
|
||||
suspended int // > 0 when pool connection is in error/reconnecting
|
||||
|
|
@ -46,7 +46,7 @@ func NewNonceMapper(id int64, cfg *proxy.Config, strategy pool.Strategy) *NonceM
|
|||
id: id,
|
||||
storage: NewNonceStorage(),
|
||||
strategy: strategy,
|
||||
cfg: cfg,
|
||||
config: cfg,
|
||||
pending: make(map[int64]SubmitContext),
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,13 +19,13 @@ import (
|
|||
//
|
||||
// s := simple.NewSimpleSplitter(cfg, eventBus, strategyFactory)
|
||||
type SimpleSplitter struct {
|
||||
active map[int64]*SimpleMapper // minerID → mapper
|
||||
idle map[int64]*SimpleMapper // mapperID → mapper (reuse pool, keyed by mapper seq)
|
||||
cfg *proxy.Config
|
||||
events *proxy.EventBus
|
||||
factory pool.StrategyFactory
|
||||
mu sync.Mutex
|
||||
seq int64 // monotonic mapper sequence counter
|
||||
active map[int64]*SimpleMapper // minerID → mapper
|
||||
idle map[int64]*SimpleMapper // mapperID → mapper (reuse pool, keyed by mapper seq)
|
||||
config *proxy.Config
|
||||
events *proxy.EventBus
|
||||
strategyFactory pool.StrategyFactory
|
||||
mu sync.Mutex
|
||||
sequence int64 // monotonic mapper sequence counter
|
||||
}
|
||||
|
||||
// NewSimpleSplitter creates the passthrough splitter.
|
||||
|
|
@ -33,11 +33,11 @@ type SimpleSplitter struct {
|
|||
// s := simple.NewSimpleSplitter(cfg, bus, factory)
|
||||
func NewSimpleSplitter(cfg *proxy.Config, events *proxy.EventBus, factory pool.StrategyFactory) *SimpleSplitter {
|
||||
return &SimpleSplitter{
|
||||
active: make(map[int64]*SimpleMapper),
|
||||
idle: make(map[int64]*SimpleMapper),
|
||||
cfg: cfg,
|
||||
events: events,
|
||||
factory: factory,
|
||||
active: make(map[int64]*SimpleMapper),
|
||||
idle: make(map[int64]*SimpleMapper),
|
||||
config: cfg,
|
||||
events: events,
|
||||
strategyFactory: factory,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -52,8 +52,8 @@ func (s *SimpleSplitter) OnLogin(event *proxy.LoginEvent) {
|
|||
defer s.mu.Unlock()
|
||||
|
||||
timeout := time.Duration(0)
|
||||
if s.cfg != nil && s.cfg.ReuseTimeout > 0 {
|
||||
timeout = time.Duration(s.cfg.ReuseTimeout) * time.Second
|
||||
if s.config != nil && s.config.ReuseTimeout > 0 {
|
||||
timeout = time.Duration(s.config.ReuseTimeout) * time.Second
|
||||
}
|
||||
|
||||
var mapper *SimpleMapper
|
||||
|
|
@ -72,12 +72,12 @@ func (s *SimpleSplitter) OnLogin(event *proxy.LoginEvent) {
|
|||
}
|
||||
|
||||
if mapper == nil {
|
||||
s.seq++
|
||||
s.sequence++
|
||||
var strategy pool.Strategy
|
||||
mapper = NewSimpleMapper(s.seq, nil)
|
||||
mapper = NewSimpleMapper(s.sequence, nil)
|
||||
mapper.events = s.events
|
||||
if s.factory != nil {
|
||||
strategy = s.factory(mapper)
|
||||
if s.strategyFactory != nil {
|
||||
strategy = s.strategyFactory(mapper)
|
||||
}
|
||||
mapper.strategy = strategy
|
||||
if mapper.strategy != nil {
|
||||
|
|
@ -152,7 +152,7 @@ func (s *SimpleSplitter) OnClose(event *proxy.CloseEvent) {
|
|||
mapper.clearPending()
|
||||
mapper.miner = nil
|
||||
mapper.idleAt = time.Now().UTC()
|
||||
if s.cfg != nil && s.cfg.ReuseTimeout > 0 {
|
||||
if s.config != nil && s.config.ReuseTimeout > 0 {
|
||||
s.idle[mapper.id] = mapper
|
||||
return
|
||||
}
|
||||
|
|
@ -174,8 +174,8 @@ func (s *SimpleSplitter) GC() {
|
|||
defer s.mu.Unlock()
|
||||
|
||||
timeout := time.Duration(0)
|
||||
if s.cfg != nil && s.cfg.ReuseTimeout > 0 {
|
||||
timeout = time.Duration(s.cfg.ReuseTimeout) * time.Second
|
||||
if s.config != nil && s.config.ReuseTimeout > 0 {
|
||||
timeout = time.Duration(s.config.ReuseTimeout) * time.Second
|
||||
}
|
||||
|
||||
now := time.Now().UTC()
|
||||
|
|
|
|||
|
|
@ -39,8 +39,8 @@ func TestSimpleSplitter_OnLogin_Ugly(t *testing.T) {
|
|||
idleAt: time.Now().UTC(),
|
||||
},
|
||||
},
|
||||
cfg: &proxy.Config{ReuseTimeout: 60},
|
||||
factory: func(listener pool.StratumListener) pool.Strategy {
|
||||
config: &proxy.Config{ReuseTimeout: 60},
|
||||
strategyFactory: func(listener pool.StratumListener) pool.Strategy {
|
||||
return liveStrategy
|
||||
},
|
||||
}
|
||||
|
|
@ -73,8 +73,8 @@ func TestSimpleSplitter_OnLogin_Bad(t *testing.T) {
|
|||
idleAt: time.Now().UTC().Add(-2 * time.Minute),
|
||||
},
|
||||
},
|
||||
cfg: &proxy.Config{ReuseTimeout: 60},
|
||||
factory: func(listener pool.StratumListener) pool.Strategy {
|
||||
config: &proxy.Config{ReuseTimeout: 60},
|
||||
strategyFactory: func(listener pool.StratumListener) pool.Strategy {
|
||||
return activeStrategy
|
||||
},
|
||||
}
|
||||
|
|
@ -95,8 +95,8 @@ func TestSimpleSplitter_OnClose_Ugly(t *testing.T) {
|
|||
splitter := &SimpleSplitter{
|
||||
active: make(map[int64]*SimpleMapper),
|
||||
idle: make(map[int64]*SimpleMapper),
|
||||
cfg: &proxy.Config{ReuseTimeout: 60},
|
||||
factory: func(listener pool.StratumListener) pool.Strategy {
|
||||
config: &proxy.Config{ReuseTimeout: 60},
|
||||
strategyFactory: func(listener pool.StratumListener) pool.Strategy {
|
||||
return activeStrategy
|
||||
},
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue