diff --git a/src/stratifier.c b/src/stratifier.c index 358055b2..61a41e24 100644 --- a/src/stratifier.c +++ b/src/stratifier.c @@ -1574,6 +1574,85 @@ static void reset_bestshares(sdata_t *sdata) ck_runlock(&sdata->instance_lock); } +static user_instance_t *get_user(sdata_t *sdata, const char *username); + +static user_instance_t *user_by_workername(sdata_t *sdata, const char *workername) +{ + char *username = strdupa(workername), *ignore; + user_instance_t *user; + + ignore = username; + strsep(&ignore, "._"); + + /* Find the user first */ + user = get_user(sdata, username); + return user; +} + +static worker_instance_t *get_worker(sdata_t *sdata, user_instance_t *user, const char *workername); + +static const double nonces = 4294967296; + +static json_t *worker_stats(const worker_instance_t *worker) +{ + char suffix1[16], suffix5[16], suffix60[16], suffix1440[16], suffix10080[16]; + json_t *val; + double ghs; + + ghs = worker->dsps1 * nonces; + suffix_string(ghs, suffix1, 16, 0); + + ghs = worker->dsps5 * nonces; + suffix_string(ghs, suffix5, 16, 0); + + ghs = worker->dsps60 * nonces; + suffix_string(ghs, suffix60, 16, 0); + + ghs = worker->dsps1440 * nonces; + suffix_string(ghs, suffix1440, 16, 0); + + ghs = worker->dsps10080 * nonces; + suffix_string(ghs, suffix10080, 16, 0); + + JSON_CPACK(val, "{ss,ss,ss,ss,ss}", + "hashrate1m", suffix1, + "hashrate5m", suffix5, + "hashrate1hr", suffix60, + "hashrate1d", suffix1440, + "hashrate7d", suffix10080); + return val; +} + +static json_t *user_stats(const user_instance_t *user) +{ + char suffix1[16], suffix5[16], suffix60[16], suffix1440[16], suffix10080[16]; + json_t *val; + double ghs; + + ghs = user->dsps1 * nonces; + suffix_string(ghs, suffix1, 16, 0); + + ghs = user->dsps5 * nonces; + suffix_string(ghs, suffix5, 16, 0); + + ghs = user->dsps60 * nonces; + suffix_string(ghs, suffix60, 16, 0); + + ghs = user->dsps1440 * nonces; + suffix_string(ghs, suffix1440, 16, 0); + + ghs = user->dsps10080 * nonces; + suffix_string(ghs, suffix10080, 16, 0); + + JSON_CPACK(val, "{ss,ss,ss,ss,ss}", + "hashrate1m", suffix1, + "hashrate5m", suffix5, + "hashrate1hr", suffix60, + "hashrate1d", suffix1440, + "hashrate7d", suffix10080); + return val; +} + static void block_solve(ckpool_t *ckp, const char *blockhash) { ckmsg_t *block, *tmp, *found = NULL; @@ -1623,14 +1702,38 @@ static void block_solve(ckpool_t *ckp, const char *blockhash) ckdbq_add(ckp, ID_BLOCK, val); free(found); - if (unlikely(!workername)) - workername = strdup(""); + if (unlikely(!workername)) { + /* This should be impossible! */ + ASPRINTF(&msg, "Block %d solved by %s!", height, ckp->name); + LOGWARNING("Solved and confirmed block %d", height); + } else { + json_t *user_val, *worker_val; + worker_instance_t *worker; + user_instance_t *user; + char *s; + + ASPRINTF(&msg, "Block %d solved by %s @ %s!", height, workername, ckp->name); + LOGWARNING("Solved and confirmed block %d by %s", height, workername); + user = user_by_workername(sdata, workername); + worker = get_worker(sdata, user, workername); - ASPRINTF(&msg, "Block %d solved by %s @ %s!", height, workername, ckp->name); + ck_rlock(&sdata->instance_lock); + user_val = user_stats(user); + worker_val = worker_stats(worker); + ck_runlock(&sdata->instance_lock); + + s = json_dumps(user_val, JSON_NO_UTF8 | JSON_PRESERVE_ORDER); + json_decref(user_val); + LOGWARNING("User %s:%s", user->username, s); + dealloc(s); + s = json_dumps(worker_val, JSON_NO_UTF8 | JSON_PRESERVE_ORDER); + json_decref(worker_val); + LOGWARNING("Worker %s:%s", workername, s); + dealloc(s); + } stratum_broadcast_message(sdata, msg); free(msg); - LOGWARNING("Solved and confirmed block %d by %s", height, workername); free(workername); reset_bestshares(sdata); @@ -2096,8 +2199,6 @@ static bool test_address(ckpool_t *ckp, const char *address) return ret; } -static const double nonces = 4294967296; - static double dsps_from_key(json_t *val, const char *key) { char *string, *endptr; @@ -3345,17 +3446,13 @@ static json_params_t static void set_worker_mindiff(ckpool_t *ckp, const char *workername, int mindiff) { - char *username = strdupa(workername), *ignore; stratum_instance_t *client; sdata_t *sdata = ckp->data; worker_instance_t *worker; user_instance_t *user; - ignore = username; - strsep(&ignore, "._"); - /* Find the user first */ - user = get_user(sdata, username); + user = user_by_workername(sdata, workername); /* Then find the matching worker user */ worker = get_worker(sdata, user, workername);