Skip to content

Commit

Permalink
xmrig#199 Fixed various bugs in donation subsystem.
Browse files Browse the repository at this point in the history
  • Loading branch information
xmrig committed May 8, 2018
1 parent 7bb9535 commit e72fb1a
Show file tree
Hide file tree
Showing 8 changed files with 104 additions and 43 deletions.
22 changes: 12 additions & 10 deletions src/common/net/Client.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include <vector>


#include "common/crypto/Algorithm.h"
#include "common/net/Id.h"
#include "common/net/Job.h"
#include "common/net/Pool.h"
Expand Down Expand Up @@ -66,16 +67,17 @@ class Client
void setPool(const Pool &pool);
void tick(uint64_t now);

inline bool isReady() const { return m_state == ConnectedState && m_failures == 0; }
inline const char *host() const { return m_pool.host(); }
inline const char *ip() const { return m_ip; }
inline const Job &job() const { return m_job; }
inline int id() const { return m_id; }
inline SocketState state() const { return m_state; }
inline uint16_t port() const { return m_pool.port(); }
inline void setQuiet(bool quiet) { m_quiet = quiet; }
inline void setRetries(int retries) { m_retries = retries; }
inline void setRetryPause(int ms) { m_retryPause = ms; }
inline bool isReady() const { return m_state == ConnectedState && m_failures == 0; }
inline const char *host() const { return m_pool.host(); }
inline const char *ip() const { return m_ip; }
inline const Job &job() const { return m_job; }
inline int id() const { return m_id; }
inline SocketState state() const { return m_state; }
inline uint16_t port() const { return m_pool.port(); }
inline void setAlgo(const xmrig::Algorithm &algo) { m_pool.setAlgo(algo); }
inline void setQuiet(bool quiet) { m_quiet = quiet; }
inline void setRetries(int retries) { m_retries = retries; }
inline void setRetryPause(int ms) { m_retryPause = ms; }

private:
enum Extensions {
Expand Down
35 changes: 25 additions & 10 deletions src/common/net/Pool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -247,17 +247,15 @@ void Pool::adjust(xmrig::Algo algorithm)
m_algorithm.setVariant(xmrig::VARIANT_1);
}

m_algorithms.push_back(m_algorithm);
rebuild();
}

# ifndef XMRIG_PROXY_PROJECT
if (m_algorithm.algo() != xmrig::CRYPTONIGHT_HEAVY) {
addVariant(xmrig::VARIANT_1);
addVariant(xmrig::VARIANT_0);
addVariant(xmrig::VARIANT_XTL);
addVariant(xmrig::VARIANT_IPBC);
addVariant(xmrig::VARIANT_AUTO);
}
# endif

void Pool::setAlgo(const xmrig::Algorithm &algorithm)
{
m_algorithm = algorithm;

rebuild();
}


Expand Down Expand Up @@ -309,3 +307,20 @@ void Pool::addVariant(xmrig::Variant variant)

m_algorithms.push_back(algorithm);
}


void Pool::rebuild()
{
m_algorithms.clear();
m_algorithms.push_back(m_algorithm);

# ifndef XMRIG_PROXY_PROJECT
if (m_algorithm.algo() != xmrig::CRYPTONIGHT_HEAVY) {
addVariant(xmrig::VARIANT_1);
addVariant(xmrig::VARIANT_0);
addVariant(xmrig::VARIANT_XTL);
addVariant(xmrig::VARIANT_IPBC);
addVariant(xmrig::VARIANT_AUTO);
}
# endif
}
2 changes: 2 additions & 0 deletions src/common/net/Pool.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ class Pool
bool setUserpass(const char *userpass);
rapidjson::Value toJSON(rapidjson::Document &doc) const;
void adjust(xmrig::Algo algorithm);
void setAlgo(const xmrig::Algorithm &algorithm);

# ifdef APP_DEBUG
void print() const;
Expand All @@ -86,6 +87,7 @@ class Pool
private:
bool parseIPv6(const char *addr);
void addVariant(xmrig::Variant variant);
void rebuild();

bool m_nicehash;
int m_keepAlive;
Expand Down
1 change: 1 addition & 0 deletions src/donate.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
*/
constexpr const int kDefaultDonateLevel = 2;
constexpr const int kMinimumDonateLevel = 0;
constexpr const uint64_t kFreeThreshold = 256;


#endif /* __DONATE_H__ */
34 changes: 22 additions & 12 deletions src/net/strategies/DonateStrategy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,20 +28,20 @@
#include "common/xmrig.h"
#include "core/Config.h"
#include "core/Controller.h"
#include "donate.h"
#include "interfaces/IStrategyListener.h"
#include "net/strategies/DonateStrategy.h"
#include "proxy/Counters.h"
#include "proxy/StatsData.h"


static inline int random(int min, int max){
return min + rand() / (RAND_MAX / (max - min + 1) + 1);
static inline float randomf(float min, float max) {
return (max - min) * ((((float) rand()) / (float) RAND_MAX)) + min;
}


DonateStrategy::DonateStrategy(xmrig::Controller *controller, IStrategyListener *listener) :
m_active(false),
m_suspended(false),
m_listener(listener),
m_donateTicks(0),
m_target(0),
Expand All @@ -58,9 +58,10 @@ DonateStrategy::DonateStrategy(xmrig::Controller *controller, IStrategyListener
m_client = new Client(-1, Platform::userAgent(), this);
m_client->setPool(Pool("proxy.fee.xmrig.com", 9999, userId, nullptr));
m_client->setRetryPause(1000);
m_client->setAlgo(controller->config()->algorithm());
m_client->setQuiet(true);

m_target = random(3000, 9000);
m_target = (100 - controller->config()->donateLevel()) * 60 * randomf(0.5, 1.5);
}


Expand All @@ -77,14 +78,28 @@ bool DonateStrategy::reschedule()
return false;
}

m_target = m_ticks + (6000 * ((double) m_donateTicks / level));
m_target = m_ticks + ((6000 - level) * ((double) m_donateTicks / level));
m_active = false;

stop();
return true;
}


void DonateStrategy::save(const Client *client, const Job &job)
{
m_pending.job = job;
m_pending.host = client->host();
m_pending.port = client->port();
}


void DonateStrategy::setAlgo(const xmrig::Algorithm &algorithm)
{
m_client->setAlgo(algorithm);
}


int64_t DonateStrategy::submit(const JobResult &result)
{
return m_client->submit(result);
Expand All @@ -93,13 +108,11 @@ int64_t DonateStrategy::submit(const JobResult &result)

void DonateStrategy::connect()
{
m_suspended = false;
}


void DonateStrategy::stop()
{
m_suspended = true;
m_donateTicks = 0;
m_client->disconnect();
}
Expand All @@ -109,18 +122,15 @@ void DonateStrategy::tick(uint64_t now)
{
m_client->tick(now);

if (m_suspended) {
return;
}

m_ticks++;

if (m_ticks == m_target) {
if (Counters::miners() < 256) {
if (kFreeThreshold > 0 && Counters::miners() < kFreeThreshold) {
m_target += 600;
return;
}

m_pending.job.reset();
m_client->connect();
}

Expand Down
20 changes: 17 additions & 3 deletions src/net/strategies/DonateStrategy.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#define __DONATESTRATEGY_H__


#include "common/utils/c_str.h"
#include "interfaces/IClientListener.h"
#include "interfaces/IStrategy.h"

Expand All @@ -42,13 +43,26 @@ namespace xmrig {
class DonateStrategy : public IStrategy, public IClientListener
{
public:
struct Pending
{
Job job;
xmrig::c_str host;
int port;
};


DonateStrategy(xmrig::Controller *controller, IStrategyListener *listener);
~DonateStrategy();

bool reschedule();
void save(const Client *client, const Job &job);
void setAlgo(const xmrig::Algorithm &algorithm);

inline bool hasPendingJob() const { return m_pending.job.isValid(); }
inline const Pending &pending() const { return m_pending; }

inline bool isActive() const override { return m_active; }
inline void resume() override {}
inline bool isActive() const override { return m_active; }
inline void resume() override {}

int64_t submit(const JobResult &result) override;
void connect() override;
Expand All @@ -63,9 +77,9 @@ class DonateStrategy : public IStrategy, public IClientListener

private:
bool m_active;
bool m_suspended;
Client *m_client;
IStrategyListener *m_listener;
Pending m_pending;
uint64_t m_donateTicks;
uint64_t m_target;
uint64_t m_ticks;
Expand Down
32 changes: 24 additions & 8 deletions src/proxy/splitters/nicehash/NonceMapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,11 @@ void NonceMapper::tick(uint64_t ticks, uint64_t now)

if (m_donate) {
m_donate->tick(now);

if (m_donate->isActive() && m_donate->hasPendingJob() && m_donate->reschedule()) {
const auto &pending = m_donate->pending();
setJob(pending.host.data(), pending.port, pending.job);
}
}
}

Expand Down Expand Up @@ -195,17 +200,16 @@ void NonceMapper::onActive(IStrategy *strategy, Client *client)

void NonceMapper::onJob(IStrategy *strategy, Client *client, const Job &job)
{
if (m_controller->config()->isVerbose()) {
LOG_INFO(isColors() ? "#%03u " MAGENTA_BOLD("new job") " from " WHITE_BOLD("%s:%d") " diff " WHITE_BOLD("%d") " algo " WHITE_BOLD("%s")
: "#%03u new job from %s:%d diff %d algo %s",
m_id, client->host(), client->port(), job.diff(), job.algorithm().shortName());
}
if (m_donate) {
if (m_donate->isActive() && client->id() != -1 && !m_donate->reschedule()) {
m_donate->save(client, job);
return;
}

if (m_donate && m_donate->isActive() && client->id() != -1 && !m_donate->reschedule()) {
return;
m_donate->setAlgo(job.algorithm());
}

m_storage->setJob(job);
setJob(client->host(), client->port(), job);
}


Expand Down Expand Up @@ -286,6 +290,18 @@ void NonceMapper::connect()
}


void NonceMapper::setJob(const char *host, int port, const Job &job)
{
if (m_controller->config()->isVerbose()) {
LOG_INFO(isColors() ? "#%03u " MAGENTA_BOLD("new job") " from " WHITE_BOLD("%s:%d") " diff " WHITE_BOLD("%d") " algo " WHITE_BOLD("%s")
: "#%03u new job from %s:%d diff %d algo %s",
m_id, host, port, job.diff(), job.algorithm().shortName());
}

m_storage->setJob(job);
}


void NonceMapper::suspend()
{
m_suspended = 1;
Expand Down
1 change: 1 addition & 0 deletions src/proxy/splitters/nicehash/NonceMapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ class NonceMapper : public IStrategyListener
IStrategy *createStrategy(const std::vector<Pool> &pools);
SubmitCtx submitCtx(int64_t seq);
void connect();
void setJob(const char *host, int port, const Job &job);
void suspend();

DonateStrategy *m_donate;
Expand Down

0 comments on commit e72fb1a

Please sign in to comment.