|
|
@ -1780,10 +1780,11 @@ share_diff(char *coinbase, const uchar *enonce1bin, const workbase_t *wb, const |
|
|
|
return diff_from_target(hash); |
|
|
|
return diff_from_target(hash); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* passthrough subclients have client_ids in the high bits */ |
|
|
|
/* Subclients have client_ids in the high bits. Returns the value of the parent
|
|
|
|
static inline bool subclient(const int64_t client_id) |
|
|
|
* client if one exists. */ |
|
|
|
|
|
|
|
static inline int64_t subclient(const int64_t client_id) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return (client_id > 0xffffffffll); |
|
|
|
return (client_id >> 32); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Note recursive lock here - entered with workbase lock held, grabs instance lock */ |
|
|
|
/* Note recursive lock here - entered with workbase lock held, grabs instance lock */ |
|
|
@ -1797,10 +1798,7 @@ static void send_node_block(sdata_t *sdata, const char *enonce1, const char *non |
|
|
|
|
|
|
|
|
|
|
|
/* Don't send the block back to a remote node if that's where it was
|
|
|
|
/* Don't send the block back to a remote node if that's where it was
|
|
|
|
* found. */ |
|
|
|
* found. */ |
|
|
|
if (subclient(client_id)) |
|
|
|
skip = subclient(client_id); |
|
|
|
skip = client_id >> 32; |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
skip = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ck_rlock(&sdata->instance_lock); |
|
|
|
ck_rlock(&sdata->instance_lock); |
|
|
|
if (sdata->node_instances) { |
|
|
|
if (sdata->node_instances) { |
|
|
@ -2993,11 +2991,29 @@ static inline stratum_instance_t *ref_instance_by_id(sdata_t *sdata, const int64 |
|
|
|
static void __drop_client(sdata_t *sdata, stratum_instance_t *client, bool lazily, char **msg) |
|
|
|
static void __drop_client(sdata_t *sdata, stratum_instance_t *client, bool lazily, char **msg) |
|
|
|
{ |
|
|
|
{ |
|
|
|
user_instance_t *user = client->user_instance; |
|
|
|
user_instance_t *user = client->user_instance; |
|
|
|
|
|
|
|
bool parent = false; |
|
|
|
|
|
|
|
|
|
|
|
if (unlikely(client->node)) |
|
|
|
if (unlikely(client->node)) { |
|
|
|
DL_DELETE(sdata->node_instances, client); |
|
|
|
DL_DELETE(sdata->node_instances, client); |
|
|
|
if (unlikely(client->trusted)) |
|
|
|
parent = true; |
|
|
|
|
|
|
|
} else if (unlikely(client->trusted)) { |
|
|
|
DL_DELETE(sdata->remote_instances, client); |
|
|
|
DL_DELETE(sdata->remote_instances, client); |
|
|
|
|
|
|
|
parent = true; |
|
|
|
|
|
|
|
} else if (unlikely(client->passthrough)) |
|
|
|
|
|
|
|
parent = true; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Tag any subclients of this parent to be dropped lazily */ |
|
|
|
|
|
|
|
if (parent) { |
|
|
|
|
|
|
|
stratum_instance_t *tmp; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (tmp = sdata->stratum_instances; tmp; tmp = tmp->hh.next) { |
|
|
|
|
|
|
|
int64_t subid = subclient(tmp->id); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (subid && subid == client->id) |
|
|
|
|
|
|
|
tmp->dropped = true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (client->workername) { |
|
|
|
if (client->workername) { |
|
|
|
if (user) { |
|
|
|
if (user) { |
|
|
|
ASPRINTF(msg, "Dropped client %s %s %suser %s worker %s %s", |
|
|
|
ASPRINTF(msg, "Dropped client %s %s %suser %s worker %s %s", |
|
|
@ -3071,8 +3087,9 @@ static stratum_instance_t *__recruit_stratum_instance(sdata_t *sdata) |
|
|
|
static stratum_instance_t *__stratum_add_instance(ckpool_t *ckp, int64_t id, const char *address, |
|
|
|
static stratum_instance_t *__stratum_add_instance(ckpool_t *ckp, int64_t id, const char *address, |
|
|
|
int server) |
|
|
|
int server) |
|
|
|
{ |
|
|
|
{ |
|
|
|
stratum_instance_t *client; |
|
|
|
|
|
|
|
sdata_t *sdata = ckp->sdata; |
|
|
|
sdata_t *sdata = ckp->sdata; |
|
|
|
|
|
|
|
stratum_instance_t *client; |
|
|
|
|
|
|
|
int64_t pass_id; |
|
|
|
|
|
|
|
|
|
|
|
client = __recruit_stratum_instance(sdata); |
|
|
|
client = __recruit_stratum_instance(sdata); |
|
|
|
client->start_time = time(NULL); |
|
|
|
client->start_time = time(NULL); |
|
|
@ -3090,12 +3107,10 @@ static stratum_instance_t *__stratum_add_instance(ckpool_t *ckp, int64_t id, con |
|
|
|
/* Points to ckp sdata in ckpool mode, but is changed later in proxy
|
|
|
|
/* Points to ckp sdata in ckpool mode, but is changed later in proxy
|
|
|
|
* mode . */ |
|
|
|
* mode . */ |
|
|
|
client->sdata = sdata; |
|
|
|
client->sdata = sdata; |
|
|
|
if (subclient(id)) { |
|
|
|
if ((pass_id = subclient(id))) { |
|
|
|
stratum_instance_t *remote; |
|
|
|
stratum_instance_t *remote = __instance_by_id(sdata, pass_id); |
|
|
|
int64_t pass_id = id >> 32; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
id &= 0xffffffffll; |
|
|
|
id &= 0xffffffffll; |
|
|
|
remote = __instance_by_id(sdata, pass_id); |
|
|
|
|
|
|
|
if (remote && remote->node) { |
|
|
|
if (remote && remote->node) { |
|
|
|
client->latency = remote->latency; |
|
|
|
client->latency = remote->latency; |
|
|
|
LOGINFO("Client %s inherited node latency of %d", |
|
|
|
LOGINFO("Client %s inherited node latency of %d", |
|
|
@ -3213,8 +3228,9 @@ static void stratum_broadcast(sdata_t *sdata, json_t *val, const int msg_type) |
|
|
|
static void stratum_add_send(sdata_t *sdata, json_t *val, const int64_t client_id, |
|
|
|
static void stratum_add_send(sdata_t *sdata, json_t *val, const int64_t client_id, |
|
|
|
const int msg_type) |
|
|
|
const int msg_type) |
|
|
|
{ |
|
|
|
{ |
|
|
|
smsg_t *msg; |
|
|
|
|
|
|
|
ckpool_t *ckp = sdata->ckp; |
|
|
|
ckpool_t *ckp = sdata->ckp; |
|
|
|
|
|
|
|
int64_t remote_id; |
|
|
|
|
|
|
|
smsg_t *msg; |
|
|
|
|
|
|
|
|
|
|
|
if (ckp->node) { |
|
|
|
if (ckp->node) { |
|
|
|
/* Node shouldn't be sending any messages as it only uses the
|
|
|
|
/* Node shouldn't be sending any messages as it only uses the
|
|
|
@ -3223,11 +3239,9 @@ static void stratum_add_send(sdata_t *sdata, json_t *val, const int64_t client_i |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (subclient(client_id)) { |
|
|
|
if ((remote_id = subclient(client_id))) { |
|
|
|
int64_t remote_id = client_id >> 32; |
|
|
|
stratum_instance_t *remote = ref_instance_by_id(sdata, remote_id); |
|
|
|
stratum_instance_t *remote; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
remote = ref_instance_by_id(sdata, remote_id); |
|
|
|
|
|
|
|
if (unlikely(!remote)) { |
|
|
|
if (unlikely(!remote)) { |
|
|
|
json_decref(val); |
|
|
|
json_decref(val); |
|
|
|
return; |
|
|
|
return; |
|
|
|