|
|
@ -459,6 +459,9 @@ struct stratifier_data { |
|
|
|
int workbases_generated; |
|
|
|
int workbases_generated; |
|
|
|
txntable_t *txns; |
|
|
|
txntable_t *txns; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Is this a node and unable to rebuild workinfos due to lack of txns */ |
|
|
|
|
|
|
|
bool wbincomplete; |
|
|
|
|
|
|
|
|
|
|
|
/* Semaphore to serialise calls to add_base */ |
|
|
|
/* Semaphore to serialise calls to add_base */ |
|
|
|
sem_t update_sem; |
|
|
|
sem_t update_sem; |
|
|
|
/* Time we last sent out a stratum update */ |
|
|
|
/* Time we last sent out a stratum update */ |
|
|
@ -1489,10 +1492,17 @@ static void add_node_base(ckpool_t *ckp, json_t *val) |
|
|
|
json_intcpy(&wb->txns, val, "txns"); |
|
|
|
json_intcpy(&wb->txns, val, "txns"); |
|
|
|
txnhashes = json_object_get(val, "txn_hashes"); |
|
|
|
txnhashes = json_object_get(val, "txn_hashes"); |
|
|
|
if (!rebuild_txns(ckp, sdata, wb, txnhashes)) { |
|
|
|
if (!rebuild_txns(ckp, sdata, wb, txnhashes)) { |
|
|
|
LOGWARNING("Unable to rebuild transactions from hashes to create workinfo"); |
|
|
|
if (!sdata->wbincomplete) { |
|
|
|
|
|
|
|
sdata->wbincomplete = true; |
|
|
|
|
|
|
|
LOGWARNING("Unable to rebuild transactions to create workinfo, ignore displayed hashrate"); |
|
|
|
|
|
|
|
} |
|
|
|
free(wb); |
|
|
|
free(wb); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (sdata->wbincomplete) { |
|
|
|
|
|
|
|
LOGWARNING("Successfully resumed rebuilding transactions into workinfo"); |
|
|
|
|
|
|
|
sdata->wbincomplete = false; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
json_strdup(&wb->coinb1, val, "coinb1"); |
|
|
|
json_strdup(&wb->coinb1, val, "coinb1"); |
|
|
|
json_intcpy(&wb->coinb1len, val, "coinb1len"); |
|
|
|
json_intcpy(&wb->coinb1len, val, "coinb1len"); |
|
|
@ -5596,7 +5606,7 @@ out_unlock: |
|
|
|
} |
|
|
|
} |
|
|
|
ckdbq_add(ckp, ID_SHARES, val); |
|
|
|
ckdbq_add(ckp, ID_SHARES, val); |
|
|
|
out: |
|
|
|
out: |
|
|
|
if ((!result && !submit) || !share) { |
|
|
|
if (!sdata->wbincomplete && ((!result && !submit) || !share)) { |
|
|
|
/* Is this the first in a run of invalids? */ |
|
|
|
/* Is this the first in a run of invalids? */ |
|
|
|
if (client->first_invalid < client->last_share.tv_sec || !client->first_invalid) |
|
|
|
if (client->first_invalid < client->last_share.tv_sec || !client->first_invalid) |
|
|
|
client->first_invalid = now_t; |
|
|
|
client->first_invalid = now_t; |
|
|
|