diff --git a/src/server/poolserver/Stratum/Client.cpp b/src/server/poolserver/Stratum/Client.cpp index e37d766..cddf229 100644 --- a/src/server/poolserver/Stratum/Client.cpp +++ b/src/server/poolserver/Stratum/Client.cpp @@ -243,9 +243,12 @@ namespace Stratum if (target <= job.blockTarget) { sLog.Info(LOG_STRATUM, "We have found a block candidate!"); + // copy job diff because job will be deleted after submiting share by block template update + uint64 jobDiff = job.diff; + if (_server->SubmitBlock(block)) { std::string query("INSERT INTO `shares` (`rem_host`, `username`, `our_result`, `upstream_result`, `reason`, `solution`, `time`, `difficulty`) VALUES "); - query += Util::FS("(INET_NTOA(%u), '%s', 1, 1, '', '%s', FROM_UNIXTIME(%u), %u)", _ip, username.c_str(), Util::BinToASCII(Util::Reverse(hash)).c_str(), Util::Date(), job.diff); + query += Util::FS("(INET_NTOA(%u), '%s', 1, 1, '', '%s', FROM_UNIXTIME(%u), %u)", _ip, username.c_str(), Util::BinToASCII(Util::Reverse(hash)).c_str(), Util::Date(), jobDiff); sDatabase.ExecuteAsync(query.c_str()); JSON response; diff --git a/src/server/poolserver/Stratum/Server.cpp b/src/server/poolserver/Stratum/Server.cpp index c9527d5..a8cea01 100644 --- a/src/server/poolserver/Stratum/Server.cpp +++ b/src/server/poolserver/Stratum/Server.cpp @@ -16,6 +16,7 @@ namespace Stratum void Server::SendToAll(JSON msg) { + boost::lock_guard guard(_mtxClients); std::set::iterator it; for (it = _clients.begin(); it != _clients.end(); ++it) _io_service.post(boost::bind(&Client::SendMessage, (*it), msg)); @@ -23,6 +24,7 @@ namespace Stratum void Server::SendBlockTmpl(bool resetWork) { + boost::lock_guard guard(_mtxClients); std::set::iterator it; for (it = _clients.begin(); it != _clients.end(); ++it) _io_service.post(boost::bind(&Client::SendJob, (*it), resetWork)); diff --git a/src/server/poolserver/Stratum/Server.h b/src/server/poolserver/Stratum/Server.h index 208b10d..a6e9085 100644 --- a/src/server/poolserver/Stratum/Server.h +++ b/src/server/poolserver/Stratum/Server.h @@ -71,6 +71,7 @@ namespace Stratum // Returns new extranonce uint32 GetExtranonce() { + boost::lock_guard guard(_mtxExtranonce); return _extranonce++; } @@ -100,7 +101,10 @@ namespace Stratum // Disconnects client void Disconnect(ClientPtr client) { + _mtxClients.lock(); _clients.erase(client); + _mtxClients.unlock(); + client->CloseSocket(); sLog.Info(LOG_STRATUM, "Stratum client disconnected from %s. Total clients: %u", asio::ip::address_v4(client->GetIP()).to_string().c_str(), _clients.size()); } @@ -110,11 +114,15 @@ namespace Stratum BanInfo ban; ban.ip = ip; ban.timestamp = Util::Date() + time; + + _mtxBans.lock(); _bans.push_back(ban); + _mtxBans.unlock(); } bool IsBanned(uint32 ip) { + boost::lock_guard guard(_mtxBans); for (int i = 0; i < _bans.size(); ++i) { if (_bans[i].ip == ip) { if (_bans[i].timestamp > Util::Date()) @@ -137,7 +145,10 @@ namespace Stratum { if (!error) { if (client->Start()) { + _mtxClients.lock(); _clients.insert(client); + _mtxClients.unlock(); + sLog.Info(LOG_STRATUM, "New stratum client accepted from %s. Total clients: %u", asio::ip::address_v4(client->GetIP()).to_string().c_str(), _clients.size()); } } else { @@ -154,13 +165,18 @@ namespace Stratum // Clients std::set _clients; - std::vector _bans; + boost::mutex _mtxClients; uint64 _clientId; + // Bands + std::vector _bans; + boost::mutex _mtxBans; + // Work Bitcoin::BlockPtr _currentWork; boost::mutex _mtxCurrentWork; uint32 _extranonce; + boost::mutex _mtxExtranonce; }; }