Skip to content

Commit 83d0249

Browse files
author
YihaoPeng
committed
send client.reconnect if version rolling disabled mid-way. (a temp way to avoid hashrate lose of Antminer S9i).
1 parent 9bbcab0 commit 83d0249

File tree

2 files changed

+34
-7
lines changed

2 files changed

+34
-7
lines changed

src/Server.cc

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,8 @@ void SessionIDManager::freeSessionId(const uint16_t sessionId) {
189189

190190
///////////////////////////////// StratumMessage //////////////////////////////
191191
StratumMessage::StratumMessage(const string &content):
192-
content_(content), isStringId_(false), r_(0), diff_(0) {
192+
content_(content), isStringId_(false), r_(0), diff_(0),
193+
versionMask_(0), hasVersionMask_(false) {
193194
parse();
194195
}
195196
StratumMessage::~StratumMessage() {
@@ -240,7 +241,7 @@ void StratumMessage::_parseMiningSubmit() {
240241
// [Worker Name, Job ID, ExtraNonce2(hex), nTime(hex), nonce(hex)]
241242
//
242243
if (jsoneq(&t_[i], "params") == 0 && t_[i+1].type == JSMN_ARRAY && t_[i+1].size >= 5) {
243-
bool hasVersionMask = t_[i+1].size >= 6;
244+
hasVersionMask_ = t_[i+1].size >= 6;
244245

245246
i++; // ptr move to params
246247
i++; // ptr move to params[0]
@@ -254,7 +255,7 @@ void StratumMessage::_parseMiningSubmit() {
254255
// nonce(hex)
255256
share_.nonce_ = (uint32_t)strtoul(getJsonStr(&t_[i+4]).c_str(), NULL, 16);
256257

257-
if (hasVersionMask) {
258+
if (hasVersionMask_) {
258259
// versionMask(hex)
259260
share_.versionMask_ = (uint32_t)strtoul(getJsonStr(&t_[i+5]).c_str(), NULL, 16);
260261
}
@@ -905,7 +906,8 @@ StratumSession::StratumSession(const int8_t upSessionIdx,
905906
struct bufferevent *bev, StratumServer *server,
906907
struct in_addr saddr)
907908
: state_(DOWN_CONNECTED), minerAgent_(NULL), upSessionIdx_(upSessionIdx),
908-
sessionId_(sessionId), bev_(bev), server_(server), saddr_(saddr)
909+
sessionId_(sessionId), bev_(bev), server_(server), saddr_(saddr),
910+
versionRollingShareCounter_(0)
909911
{
910912
inBuf_ = evbuffer_new();
911913
assert(inBuf_ != NULL);
@@ -1061,13 +1063,13 @@ void StratumSession::handleRequest_Authorize(const string &idStr,
10611063
// eg. {"params": ["slush.miner1", "password"], "id": 2, "method": "mining.authorize"}
10621064
//
10631065

1064-
string workerName, fullWorkerName;
1065-
if (!smsg.parseMiningAuthorize(fullWorkerName)) {
1066+
string workerName;
1067+
if (!smsg.parseMiningAuthorize(fullWorkerName_)) {
10661068
responseError(idStr, StratumError::INVALID_USERNAME);
10671069
return;
10681070
}
10691071

1070-
workerName = getWorkerName(fullWorkerName); // split by '.'
1072+
workerName = getWorkerName(fullWorkerName_); // split by '.'
10711073
if (workerName.empty())
10721074
workerName = DEFAULT_WORKER_NAME;
10731075

@@ -1147,6 +1149,27 @@ void StratumSession::handleRequest_Submit(const string &idStr,
11471149
server_->submitShare(share, this);
11481150

11491151
responseTrue(idStr); // we assume shares are valid
1152+
1153+
if (smsg.hasVersionMask()) {
1154+
versionRollingShareCounter_++;
1155+
}
1156+
else if (versionRollingShareCounter_ > 100) {
1157+
// Version rolling disabled mid-way, it may be a firmware issue.
1158+
// Reconnect to avoid loss of hashrate.
1159+
const string s = "{\"id\":null,\"method\":\"client.reconnect\",\"params\":[]}\n";
1160+
sendData(s);
1161+
1162+
// get source IP address
1163+
char saddrBuffer[INET_ADDRSTRLEN];
1164+
evutil_inet_ntop(AF_INET, &saddr_, saddrBuffer, INET_ADDRSTRLEN);
1165+
1166+
LOG(INFO) << "version rolling disabled mid-way, send client.reconnect. "
1167+
<< "worker: " << fullWorkerName_
1168+
<< ", ip: " << saddrBuffer
1169+
<< ", version rolling shares: " << versionRollingShareCounter_
1170+
<< std::endl;
1171+
}
1172+
11501173
}
11511174

11521175

src/Server.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ class StratumMessage {
173173
string password_;
174174
uint32_t diff_; // mining.set_difficulty
175175
uint32_t versionMask_; // mining.set_version_mask
176+
bool hasVersionMask_;
176177

177178
set<string> serverCapabilities_; // agent.get_capabilities
178179

@@ -201,6 +202,7 @@ class StratumMessage {
201202
bool getResultBoolean() const;
202203
string getId() const;
203204
bool isStringId() const;
205+
bool hasVersionMask() const { return hasVersionMask_; }
204206

205207
bool parseMiningSubmit(Share &share) const;
206208
bool parseMiningSubscribe(string &minerAgent) const;
@@ -401,6 +403,8 @@ class StratumSession {
401403
struct bufferevent *bev_;
402404
StratumServer *server_;
403405
struct in_addr saddr_;
406+
size_t versionRollingShareCounter_; // Used to detect and prevent potential problems with version rolling
407+
string fullWorkerName_;
404408

405409

406410
public:

0 commit comments

Comments
 (0)