diff --git a/src/stratifier.c b/src/stratifier.c index 23a3df30..aed4cee0 100644 --- a/src/stratifier.c +++ b/src/stratifier.c @@ -1232,9 +1232,32 @@ static void send_node_transactions(ckpool_t *ckp, sdata_t *sdata, const json_t * } } +/* Submit the transactions in node/remote mode so the local btcd has all the + * transactions that will go into the next blocksolve. */ +static void submit_transaction(ckpool_t *ckp, const char *hash) +{ + char *buf; + + if (unlikely(!ckp->generator_ready)) + return; + ASPRINTF(&buf, "submittxn:%s", hash); + send_proc(ckp->generator,buf); + free(buf); +} + +static void submit_transaction_array(ckpool_t *ckp, const json_t *arr) +{ + json_t *arr_val; + size_t index; + + json_array_foreach(arr, index, arr_val) { + submit_transaction(ckp, json_string_value(arr_val)); + } +} + static void update_txns(ckpool_t *ckp, sdata_t *sdata, txntable_t *txns, bool local) { - json_t *val, *txn_array = json_array(); + json_t *val, *txn_array = json_array(), *purged_txns = json_array(); int added = 0, purged = 0; txntable_t *tmp, *tmpa; @@ -1242,6 +1265,8 @@ static void update_txns(ckpool_t *ckp, sdata_t *sdata, txntable_t *txns, bool lo * and remove them. */ ck_wlock(&sdata->workbase_lock); HASH_ITER(hh, sdata->txns, tmp, tmpa) { + json_t *txn_val; + if (tmp->seen) { tmp->seen = false; continue; @@ -1249,6 +1274,8 @@ static void update_txns(ckpool_t *ckp, sdata_t *sdata, txntable_t *txns, bool lo if (tmp->refcount-- > 0) continue; HASH_DEL(sdata->txns, tmp); + txn_val = json_string(tmp->data); + json_array_append_new(purged_txns, txn_val); dealloc(tmp->data); dealloc(tmp); purged++; @@ -1267,13 +1294,21 @@ static void update_txns(ckpool_t *ckp, sdata_t *sdata, txntable_t *txns, bool lo } ck_wunlock(&sdata->workbase_lock); - if (json_array_size(txn_array)) { + if (added) { JSON_CPACK(val, "{so}", "transaction", txn_array); send_node_transactions(ckp, sdata, val); json_decref(val); } else json_decref(txn_array); + /* Submit transactions to bitcoind again when we're purging them in + * case they've been removed from its mempool as well and we need them + * again in the future for a remote workinfo that hasn't forgotten + * about them. */ + if (purged) + submit_transaction_array(ckp, purged_txns); + json_decref(purged_txns); + if (added || purged) { LOGINFO("Stratifier added %d %stransactions and purged %d", added, local ? "" : "remote ", purged); @@ -6664,19 +6699,6 @@ static user_instance_t *generate_remote_user(ckpool_t *ckp, const char *workerna return user; } -/* Submit the transactions in node/remote mode so the local btcd has all the - * transactions that will go into the next blocksolve. */ -static void submit_transaction(ckpool_t *ckp, const char *hash) -{ - char *buf; - - if (unlikely(!ckp->generator_ready)) - return; - ASPRINTF(&buf, "submittxn:%s", hash); - send_proc(ckp->generator,buf); - free(buf); -} - static void parse_remote_share(ckpool_t *ckp, sdata_t *sdata, json_t *val, const char *buf) { json_t *workername_val = json_object_get(val, "workername");