|
|
@ -465,6 +465,7 @@ struct stratifier_data { |
|
|
|
ckmsgq_t *sshareq; // Stratum share sends
|
|
|
|
ckmsgq_t *sshareq; // Stratum share sends
|
|
|
|
ckmsgq_t *sauthq; // Stratum authorisations
|
|
|
|
ckmsgq_t *sauthq; // Stratum authorisations
|
|
|
|
ckmsgq_t *stxnq; // Transaction requests
|
|
|
|
ckmsgq_t *stxnq; // Transaction requests
|
|
|
|
|
|
|
|
ckmsg_t *postponed; // List of messages postponed till next update
|
|
|
|
|
|
|
|
|
|
|
|
int user_instance_id; |
|
|
|
int user_instance_id; |
|
|
|
|
|
|
|
|
|
|
@ -824,6 +825,32 @@ static void ssend_bulk_prepend(sdata_t *sdata, ckmsg_t *bulk_send, const int mes |
|
|
|
mutex_unlock(ssends->lock); |
|
|
|
mutex_unlock(ssends->lock); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* List of messages we intentionally want to postpone till after the next bulk
|
|
|
|
|
|
|
|
* update - eg. workinfo which is large and we don't want to delay updates */ |
|
|
|
|
|
|
|
static void ssend_bulk_postpone(sdata_t *sdata, ckmsg_t *bulk_send, const int messages) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
ckmsgq_t *ssends = sdata->ssends; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mutex_lock(ssends->lock); |
|
|
|
|
|
|
|
DL_CONCAT(sdata->postponed, bulk_send); |
|
|
|
|
|
|
|
ssends->messages += messages; |
|
|
|
|
|
|
|
mutex_unlock(ssends->lock); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Send any postponed bulk messages */ |
|
|
|
|
|
|
|
static void send_postponed(sdata_t *sdata) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
ckmsgq_t *ssends = sdata->ssends; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mutex_lock(ssends->lock); |
|
|
|
|
|
|
|
if (sdata->postponed) { |
|
|
|
|
|
|
|
DL_CONCAT(ssends->msgs, sdata->postponed); |
|
|
|
|
|
|
|
sdata->postponed = NULL; |
|
|
|
|
|
|
|
pthread_cond_signal(ssends->cond); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
mutex_unlock(ssends->lock); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
|
@ -880,9 +907,15 @@ static void send_node_workinfo(sdata_t *sdata, const workbase_t *wb) |
|
|
|
} |
|
|
|
} |
|
|
|
ck_runlock(&sdata->instance_lock); |
|
|
|
ck_runlock(&sdata->instance_lock); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* We send workinfo postponed till after the stratum updates are sent
|
|
|
|
|
|
|
|
* out to minimise any lag seen by clients getting updates. It means |
|
|
|
|
|
|
|
* the remote node will know about the block change later which will |
|
|
|
|
|
|
|
* make it think clients are sending invalid shares (which won't count) |
|
|
|
|
|
|
|
* and potentially not be able to submit a block locally if it doesn't |
|
|
|
|
|
|
|
* have the workinfo in time. */ |
|
|
|
if (bulk_send) { |
|
|
|
if (bulk_send) { |
|
|
|
LOGINFO("Sending workinfo to mining nodes"); |
|
|
|
LOGINFO("Sending workinfo to mining nodes"); |
|
|
|
ssend_bulk_append(sdata, bulk_send, messages); |
|
|
|
ssend_bulk_postpone(sdata, bulk_send, messages); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -2623,10 +2656,10 @@ static void stratum_broadcast(sdata_t *sdata, json_t *val, const int msg_type) |
|
|
|
|
|
|
|
|
|
|
|
json_decref(val); |
|
|
|
json_decref(val); |
|
|
|
|
|
|
|
|
|
|
|
if (!bulk_send) |
|
|
|
if (likely(bulk_send)) |
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ssend_bulk_append(sdata, bulk_send, messages); |
|
|
|
ssend_bulk_append(sdata, bulk_send, messages); |
|
|
|
|
|
|
|
if (msg_type == SM_UPDATE) |
|
|
|
|
|
|
|
send_postponed(sdata); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
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, |
|
|
|