diff --git a/Event.go b/Event.go index cede35b..7e90f11 100644 --- a/Event.go +++ b/Event.go @@ -58,6 +58,10 @@ type EventUpSessionBroken struct { Slot int } +type EventUpSessionFull struct { + Slot int +} + type EventSubmitShareBTC struct { ID interface{} Message *ExMessageSubmitShareBTC diff --git a/UpSessionBTC.go b/UpSessionBTC.go index 6838ed3..6fa1ec3 100644 --- a/UpSessionBTC.go +++ b/UpSessionBTC.go @@ -307,7 +307,7 @@ func (up *UpSessionBTC) close() { up.manager.SendEvent(EventUpSessionBroken{up.slot}) } - if up.config.AlwaysKeepDownconn { + if up.stat != StatExit && up.config.AlwaysKeepDownconn { if up.lastJob != nil { up.manager.SendEvent(EventUpdateFakeJobBTC{up.lastJob}) } diff --git a/UpSessionETH.go b/UpSessionETH.go index 956b8ba..0ce9435 100644 --- a/UpSessionETH.go +++ b/UpSessionETH.go @@ -295,7 +295,7 @@ func (up *UpSessionETH) close() { up.manager.SendEvent(EventUpSessionBroken{up.slot}) } - if up.config.AlwaysKeepDownconn { + if up.stat != StatExit && up.config.AlwaysKeepDownconn { if up.lastJob != nil { up.manager.SendEvent(EventUpdateFakeJobETH{up.lastJob}) } @@ -702,6 +702,11 @@ func (up *UpSessionETH) handleExMessageSetExtraNonce(ex *ExMessage) { return } + // 矿池服务器满了,无法连接新矿机 + if msg.ExtraNonce == EthereumInvalidExtraNonce { + up.manager.SendEvent(EventUpSessionFull{up.slot}) + } + down := up.downSessions[msg.SessionID] if down != nil { down.SendEvent(EventSetExtraNonce{msg.ExtraNonce}) diff --git a/UpSessionManager.go b/UpSessionManager.go index 56f82c8..7b771f8 100644 --- a/UpSessionManager.go +++ b/UpSessionManager.go @@ -10,6 +10,7 @@ import ( type UpSessionInfo struct { minerNum int ready bool + full bool upSession UpSession } @@ -90,7 +91,7 @@ func (manager *UpSessionManager) addDownSession(e EventAddDownSession) { // 寻找连接数最少的服务器 for i := range manager.upSessions { info := &manager.upSessions[i] - if info.ready && (selected == nil || info.minerNum < selected.minerNum) { + if info.ready && !info.full && (selected == nil || info.minerNum < selected.minerNum) { selected = info } } @@ -155,13 +156,19 @@ func (manager *UpSessionManager) upSessionBroken(e EventUpSessionBroken) { go manager.connect(e.Slot) } +func (manager *UpSessionManager) upSessionFull(e EventUpSessionFull) { + info := &manager.upSessions[e.Slot] + info.full = true +} + func (manager *UpSessionManager) updateMinerNum(e EventUpdateMinerNum) { defer manager.tryPrintMinerNum() - manager.upSessions[e.Slot].minerNum -= e.DisconnectedMinerCounter + up := &manager.upSessions[e.Slot] + up.minerNum -= e.DisconnectedMinerCounter if glog.V(3) { - glog.Info(manager.id, "miner num update, slot: ", e.Slot, ", miners: ", manager.upSessions[e.Slot].minerNum) + glog.Info(manager.id, "miner num update, slot: ", e.Slot, ", miners: ", up.minerNum) } if manager.config.MultiUserMode { @@ -174,6 +181,15 @@ func (manager *UpSessionManager) updateMinerNum(e EventUpdateMinerNum) { manager.parent.SendEvent(EventStopUpSessionManager{manager.subAccount}) } } + + if up.full && up.minerNum == 0 { + // 重连矿池服务器已满的空闲连接 + go func() { + glog.Info(manager.id, "reconnect full pool session #", e.Slot) + up.upSession.SendEvent(EventExit{}) + manager.SendEvent(EventUpSessionBroken{e.Slot}) + }() + } } func (manager *UpSessionManager) updateFakeMinerNum(e EventUpdateFakeMinerNum) { @@ -233,6 +249,8 @@ func (manager *UpSessionManager) handleEvent() { manager.addDownSession(e) case EventUpSessionBroken: manager.upSessionBroken(e) + case EventUpSessionFull: + manager.upSessionFull(e) case EventUpdateMinerNum: manager.updateMinerNum(e) case EventUpdateFakeMinerNum: