From b29cf2f08b8f83a280ceb42b9852ec309a3a481f Mon Sep 17 00:00:00 2001 From: Intel Date: Tue, 13 May 2014 16:19:01 -0400 Subject: [PATCH 1/2] Added mutexes for shared access variables --- src/server/poolserver/Stratum/Server.cpp | 2 ++ src/server/poolserver/Stratum/Server.h | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) 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; }; } From 456fd374764601a12026db5552657db837510027 Mon Sep 17 00:00:00 2001 From: Intel Date: Wed, 14 May 2014 12:19:55 -0400 Subject: [PATCH 2/2] Fix bug with winning share difficulty --- src/server/poolserver/Stratum/Client.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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;