change pool hashrate calculation

This commit is contained in:
Jethro Grassie 2019-03-07 20:47:16 -05:00
parent b8c5bfdfc7
commit 590ac33709
No known key found for this signature in database
GPG Key ID: DE8ED755616565BB
1 changed files with 26 additions and 57 deletions

View File

@ -214,7 +214,7 @@ static int payout_block(block_t *block, MDB_txn *parent);
static int balance_add(const char *address, uint64_t amount, MDB_txn *parent); static int balance_add(const char *address, uint64_t amount, MDB_txn *parent);
static int send_payments(); static int send_payments();
static int startup_pauout(uint64_t height); static int startup_pauout(uint64_t height);
static void update_pool_hr(uint64_t height); static void update_pool_hr();
static void block_template_free(block_template_t *block_template); static void block_template_free(block_template_t *block_template);
static void block_templates_free(); static void block_templates_free();
static void last_block_headers_free(); static void last_block_headers_free();
@ -273,7 +273,7 @@ static MDB_dbi db_payments;
static BN_CTX *bn_ctx; static BN_CTX *bn_ctx;
static BIGNUM *base_diff; static BIGNUM *base_diff;
static pool_stats_t pool_stats; static pool_stats_t pool_stats;
static pthread_mutex_t mutex_miner_hr = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t mutex_clients = PTHREAD_MUTEX_INITIALIZER;
static FILE *fd_log; static FILE *fd_log;
#define JSON_GET_OR_ERROR(name, parent, type, client) \ #define JSON_GET_OR_ERROR(name, parent, type, client) \
@ -283,7 +283,7 @@ static FILE *fd_log;
if (!json_object_is_type(name, type)) \ if (!json_object_is_type(name, type)) \
return send_validation_error(client, #name " not a " #type); return send_validation_error(client, #name " not a " #type);
int static int
compare_uint64(const MDB_val *a, const MDB_val *b) compare_uint64(const MDB_val *a, const MDB_val *b)
{ {
const uint64_t va = *(const uint64_t *)a->mv_data; const uint64_t va = *(const uint64_t *)a->mv_data;
@ -291,7 +291,7 @@ compare_uint64(const MDB_val *a, const MDB_val *b)
return (va < vb) ? -1 : va > vb; return (va < vb) ? -1 : va > vb;
} }
int static int
compare_string(const MDB_val *a, const MDB_val *b) compare_string(const MDB_val *a, const MDB_val *b)
{ {
const char *va = (const char*) a->mv_data; const char *va = (const char*) a->mv_data;
@ -299,7 +299,7 @@ compare_string(const MDB_val *a, const MDB_val *b)
return strcmp(va, vb); return strcmp(va, vb);
} }
int static int
compare_block(const MDB_val *a, const MDB_val *b) compare_block(const MDB_val *a, const MDB_val *b)
{ {
const block_t *va = (const block_t*) a->mv_data; const block_t *va = (const block_t*) a->mv_data;
@ -311,7 +311,7 @@ compare_block(const MDB_val *a, const MDB_val *b)
return sc; return sc;
} }
int static int
compare_share(const MDB_val *a, const MDB_val *b) compare_share(const MDB_val *a, const MDB_val *b)
{ {
const share_t *va = (const share_t*) a->mv_data; const share_t *va = (const share_t*) a->mv_data;
@ -323,7 +323,7 @@ compare_share(const MDB_val *a, const MDB_val *b)
return sc; return sc;
} }
int static int
compare_payment(const MDB_val *a, const MDB_val *b) compare_payment(const MDB_val *a, const MDB_val *b)
{ {
const payment_t *va = (const payment_t*) a->mv_data; const payment_t *va = (const payment_t*) a->mv_data;
@ -465,12 +465,12 @@ store_block(uint64_t height, block_t *block)
uint64_t uint64_t
miner_hr(const char *address) miner_hr(const char *address)
{ {
pthread_mutex_lock(&mutex_miner_hr); pthread_mutex_lock(&mutex_clients);
client_t *c = pool_clients.clients; client_t *c = pool_clients.clients;
uint64_t hr = 0; uint64_t hr = 0;
for (size_t i = 0; i < pool_clients.count; i++, c++) for (size_t i = 0; i < pool_clients.count; i++, c++)
{ {
if (strncmp(c->address, address, ADDRESS_MAX) == 0) if (c->connected_since != 0 && strncmp(c->address, address, ADDRESS_MAX) == 0)
{ {
double d = difftime(time(NULL), c->connected_since); double d = difftime(time(NULL), c->connected_since);
if (d == 0.0) if (d == 0.0)
@ -479,7 +479,7 @@ miner_hr(const char *address)
break; break;
} }
} }
pthread_mutex_unlock(&mutex_miner_hr); pthread_mutex_unlock(&mutex_clients);
return hr; return hr;
} }
@ -793,7 +793,7 @@ send_payments()
char body[RPC_BODY_MAX]; char body[RPC_BODY_MAX];
snprintf(body, RPC_BODY_MAX, "{\"id\":\"0\",\"jsonrpc\":\"2.0\",\"method\":\"transfer\",\"params\":{" snprintf(body, RPC_BODY_MAX, "{\"id\":\"0\",\"jsonrpc\":\"2.0\",\"method\":\"transfer\",\"params\":{"
"\"destinations\":[{\"amount\":%"PRIu64",\"address\":\"%s\"}],\"mixin\":6}}", "\"destinations\":[{\"amount\":%"PRIu64",\"address\":\"%s\"}],\"mixin\":10}}",
amount, address); amount, address);
log_trace(body); log_trace(body);
rpc_callback_t *callback = calloc(1, sizeof(rpc_callback_t)); rpc_callback_t *callback = calloc(1, sizeof(rpc_callback_t));
@ -872,54 +872,21 @@ startup_pauout(uint64_t height)
} }
static void static void
update_pool_hr(uint64_t height) update_pool_hr()
{ {
int rc; uint64_t hr = 0;
char *err; client_t *c = pool_clients.clients;
MDB_txn *txn; for (size_t i = 0; i < pool_clients.count; i++, c++)
MDB_cursor *cursor;
if ((rc = mdb_txn_begin(env, NULL, MDB_RDONLY, &txn)) != 0)
{ {
err = mdb_strerror(rc); if (c->connected_since != 0)
log_error("%s", err);
}
if ((rc = mdb_cursor_open(txn, db_shares, &cursor)) != 0)
{
err = mdb_strerror(rc);
log_error("%s", err);
mdb_txn_abort(txn);
}
MDB_cursor_op op = MDB_SET;
uint64_t lowest = height - HR_BLOCK_COUNT;
uint64_t cd = 0;
log_trace("Getting pool hashrate from block %"PRIu64" to %"PRIu64, height, lowest+1);
while (height > lowest)
{
MDB_val val;
MDB_val key = { sizeof(height), &height };
log_trace("Checking for shares at height %"PRIu64, *((uint64_t*)key.mv_data));
rc = mdb_cursor_get(cursor, &key, &val, op);
op = MDB_NEXT_DUP;
if (rc == MDB_NOTFOUND)
{ {
op = MDB_SET; double d = difftime(time(NULL), c->connected_since);
height--; if (d == 0.0)
continue; continue;
hr += c->hashes / d;
} }
else if (rc != 0 && rc != MDB_NOTFOUND)
{
err = mdb_strerror(rc);
log_error("%s", err);
goto cleanup;
}
share_t *s = (share_t*) val.mv_data;
log_trace("Incrementing pool HR by %"PRIu64, s->difficulty);
cd += s->difficulty;
} }
pool_stats.pool_hashrate = cd / (HR_BLOCK_COUNT * BLOCK_TIME); pool_stats.pool_hashrate = hr;
cleanup:
mdb_cursor_close(cursor);
mdb_txn_abort(txn);
} }
static void static void
@ -1431,10 +1398,10 @@ rpc_on_last_block_header(const char* data, rpc_callback_t *callback)
pool_stats.network_difficulty = last_block_headers[0]->difficulty; pool_stats.network_difficulty = last_block_headers[0]->difficulty;
pool_stats.network_hashrate = last_block_headers[0]->difficulty / BLOCK_TIME; pool_stats.network_hashrate = last_block_headers[0]->difficulty / BLOCK_TIME;
update_pool_hr();
if (need_new_template) if (need_new_template)
{ {
update_pool_hr(last_block_headers[0]->height-1);
log_info("Fetching new block template"); log_info("Fetching new block template");
char *body = rpc_new_request_body("get_block_template", "sssd", "wallet_address", config.pool_wallet, "reserve_size", 17); char *body = rpc_new_request_body("get_block_template", "sssd", "wallet_address", config.pool_wallet, "reserve_size", 17);
rpc_callback_t *c1 = calloc(1, sizeof(rpc_callback_t)); rpc_callback_t *c1 = calloc(1, sizeof(rpc_callback_t));
@ -1614,7 +1581,7 @@ client_add(int fd, struct bufferevent *bev)
bool resize = true; bool resize = true;
for (size_t i = 0; i < pool_clients.count; i++, c++) for (size_t i = 0; i < pool_clients.count; i++, c++)
{ {
if (c->fd == 0) if (c->connected_since == 0)
{ {
resize = false; resize = false;
break; break;
@ -1622,10 +1589,12 @@ client_add(int fd, struct bufferevent *bev)
} }
if (resize) if (resize)
{ {
pthread_mutex_lock(&mutex_clients);
pool_clients.count += POOL_CLIENTS_GROW; pool_clients.count += POOL_CLIENTS_GROW;
c = realloc(pool_clients.clients, sizeof(client_t) * pool_clients.count); c = realloc(pool_clients.clients, sizeof(client_t) * pool_clients.count);
pool_clients.clients = c; pool_clients.clients = c;
c += pool_clients.count - POOL_CLIENTS_GROW; c += pool_clients.count - POOL_CLIENTS_GROW;
pthread_mutex_unlock(&mutex_clients);
log_debug("Client pool can now hold %zu clients", pool_clients.count); log_debug("Client pool can now hold %zu clients", pool_clients.count);
} }
memset(c, 0, sizeof(client_t)); memset(c, 0, sizeof(client_t));
@ -2375,7 +2344,7 @@ cleanup()
database_close(); database_close();
BN_free(base_diff); BN_free(base_diff);
BN_CTX_free(bn_ctx); BN_CTX_free(bn_ctx);
pthread_mutex_destroy(&mutex_miner_hr); pthread_mutex_destroy(&mutex_clients);
log_info("Pool shutdown successfully"); log_info("Pool shutdown successfully");
if (fd_log != NULL) if (fd_log != NULL)
fclose(fd_log); fclose(fd_log);