Browse Source

Send all transactions to new nodes, and set initial refcount on transactions to 10

master
Con Kolivas 9 years ago
parent
commit
8e76983fa8
  1. 46
      src/stratifier.c

46
src/stratifier.c

@ -381,7 +381,7 @@ struct txntable {
UT_hash_handle hh; UT_hash_handle hh;
int id; int id;
char hash[68]; char hash[68];
const char *data; char *data;
int refcount; int refcount;
}; };
@ -1129,14 +1129,14 @@ static void add_txn(sdata_t *sdata, txntable_t **txns, const char *hash, const c
found = true; found = true;
} }
ck_runlock(&sdata->workbase_lock); ck_runlock(&sdata->workbase_lock);
if (found) if (found)
return; return;
txn = ckzalloc(sizeof(txntable_t)); txn = ckzalloc(sizeof(txntable_t));
memcpy(txn->hash, hash, 65); memcpy(txn->hash, hash, 65);
/* Note that data is pointing to a string in a json struture which will txn->data = strdup(data);
* be destroyed so we can only use the data value until then. */ txn->refcount = 10;
txn->data = data;
HASH_ADD_STR(*txns, hash, txn); HASH_ADD_STR(*txns, hash, txn);
} }
@ -1266,6 +1266,7 @@ static void wb_merkle_bins(sdata_t *sdata, workbase_t *wb, json_t *txn_array)
if (tmp->refcount--) if (tmp->refcount--)
continue; continue;
HASH_DEL(sdata->txns, tmp); HASH_DEL(sdata->txns, tmp);
dealloc(tmp->data);
dealloc(tmp); dealloc(tmp);
purged++; purged++;
} }
@ -1278,9 +1279,6 @@ static void wb_merkle_bins(sdata_t *sdata, workbase_t *wb, json_t *txn_array)
/* Move to the sdata transaction table */ /* Move to the sdata transaction table */
HASH_DEL(txns, tmp); HASH_DEL(txns, tmp);
HASH_ADD_STR(sdata->txns, hash, tmp); HASH_ADD_STR(sdata->txns, hash, tmp);
/* Empty data once used to not dereference since the json structure
* will be destroyed. */
tmp->data = NULL;
added++; added++;
} }
ck_wunlock(&sdata->workbase_lock); ck_wunlock(&sdata->workbase_lock);
@ -5723,7 +5721,33 @@ static void init_client(sdata_t *sdata, const stratum_instance_t *client, const
stratum_send_update(sdata, client_id, true); stratum_send_update(sdata, client_id, true);
} }
static void *set_node_latency(void *arg) /* When a node first connects it has no transactions so we have to send all
* current ones to it. */
static void send_node_all_txns(sdata_t *sdata, const stratum_instance_t *client)
{
json_t *txn_array, *val, *txn_val;
txntable_t *txn, *tmp;
smsg_t *msg;
txn_array = json_array();
ck_rlock(&sdata->workbase_lock);
HASH_ITER(hh, sdata->txns, txn, tmp) {
JSON_CPACK(txn_val, "{ss,ss}", "hash", txn->hash, "data", txn->data);
json_array_append_new(txn_array, txn_val);
}
ck_runlock(&sdata->workbase_lock);
JSON_CPACK(val, "{ss,so}", "node.method", stratum_msgs[SM_TRANSACTIONS],
"transaction", txn_array);
msg = ckzalloc(sizeof(smsg_t));
msg->json_msg = val;
msg->client_id = client->id;
ckmsgq_add(sdata->ssends, msg);
LOGNOTICE("Sending new node client %"PRId64" all transactions", client->id);
}
static void *setup_node(void *arg)
{ {
stratum_instance_t *client = (stratum_instance_t *)arg; stratum_instance_t *client = (stratum_instance_t *)arg;
@ -5732,6 +5756,8 @@ static void *set_node_latency(void *arg)
client->latency = round_trip(client->address) / 2; client->latency = round_trip(client->address) / 2;
LOGNOTICE("Node client %"PRId64" %s latency set to %dms", client->id, LOGNOTICE("Node client %"PRId64" %s latency set to %dms", client->id,
client->address, client->latency); client->address, client->latency);
sleep(5);
send_node_all_txns(client->sdata, client);
dec_instance_ref(client->sdata, client); dec_instance_ref(client->sdata, client);
return NULL; return NULL;
} }
@ -5753,7 +5779,7 @@ static void add_mining_node(ckpool_t *ckp, sdata_t *sdata, stratum_instance_t *c
LOGWARNING("Added client %"PRId64" %s as mining node on server %d:%s", client->id, LOGWARNING("Added client %"PRId64" %s as mining node on server %d:%s", client->id,
client->address, client->server, ckp->serverurl[client->server]); client->address, client->server, ckp->serverurl[client->server]);
create_pthread(&pth, set_node_latency, client); create_pthread(&pth, setup_node, client);
} }
static void add_remote_server(sdata_t *sdata, stratum_instance_t *client) static void add_remote_server(sdata_t *sdata, stratum_instance_t *client)
@ -6223,7 +6249,7 @@ static void add_node_txns(sdata_t *sdata, const json_t *val)
} }
ck_wunlock(&sdata->workbase_lock); ck_wunlock(&sdata->workbase_lock);
LOGINFO("Stratifier added %d node transactions", added); LOGNOTICE("Stratifier added %d node transactions", added);
} }
/* Entered with client holding ref count */ /* Entered with client holding ref count */

Loading…
Cancel
Save