From 7e15f31706d871fff38c4891e6b16b4748d65b5d Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Tue, 25 Nov 2014 17:09:07 +0100 Subject: [PATCH] api: pool query (uptime, ping, discon., url and user) --- api.cpp | 26 +++++++++++++++++++++++++- ccminer.cpp | 12 ++++++++++-- hashlog.cpp | 2 +- miner.h | 5 +++++ util.cpp | 2 ++ 5 files changed, 43 insertions(+), 4 deletions(-) diff --git a/api.cpp b/api.cpp index 95e9790..a9bf8d5 100644 --- a/api.cpp +++ b/api.cpp @@ -110,6 +110,8 @@ extern int device_map[8]; extern char *device_name[8]; extern int num_cpus; extern char driver_version[32]; +extern struct stratum_ctx stratum; +extern char* rpc_user; // sysinfos.cpp extern float cpu_temp(int); @@ -208,12 +210,34 @@ static char *getsummary(char *params) } /** - * Returns current pool infos + * Returns some infos about current pool */ static char *getpoolnfo(char *params) { char *p = buffer; + char jobid[128] = { 0 }; + char nonce[128] = { 0 }; *p = '\0'; + + if (!stratum.url) { + sprintf(p, "|"); + return p; + } + + if (stratum.job.job_id) + strncpy(jobid, stratum.job.job_id, sizeof(stratum.job.job_id)); + + if (stratum.job.xnonce2) { + /* used temporary to be sure all is ok */ + cbin2hex(nonce, (const char*) stratum.job.xnonce2, stratum.xnonce2_size); + } + + sprintf(p, "URL=%s;USER=%s;H=%u;JOB=%s;DIFF=%.6f;N2SZ=%zd;N2=0x%s;PING=%u;DISCO=%u;UPTIME=%u|", + stratum.url, rpc_user ? rpc_user : "", + stratum.job.height, jobid, stratum.job.diff, + stratum.xnonce2_size, nonce, stratum.answer_msec, + stratum.disconnects, (uint32_t) (time(NULL) - stratum.tm_connected)); + return p; } diff --git a/ccminer.cpp b/ccminer.cpp index 196f746..5fe114f 100644 --- a/ccminer.cpp +++ b/ccminer.cpp @@ -211,9 +211,10 @@ int num_processors; int device_map[8] = {0,1,2,3,4,5,6,7}; // CB char *device_name[8]; // CB int device_sm[8]; +char *rpc_user = NULL; static char *rpc_url; static char *rpc_userpass; -static char *rpc_user, *rpc_pass; +static char *rpc_pass; static char *short_url = NULL; char *opt_cert; char *opt_proxy; @@ -226,7 +227,7 @@ int stratum_thr_id = -1; int api_thr_id = -1; bool stratum_need_reset = false; struct work_restart *work_restart = NULL; -static struct stratum_ctx stratum; +struct stratum_ctx stratum = { 0 }; pthread_mutex_t applog_lock; static pthread_mutex_t stats_lock; @@ -602,6 +603,7 @@ static bool submit_upstream_work(CURL *curl, struct work *work) free(ntimestr); free(noncestr); + gettimeofday(&stratum.tv_submit, NULL); if (unlikely(!stratum_send_line(&stratum, s))) { applog(LOG_ERR, "submit_upstream_work stratum_send_line failed"); return false; @@ -1503,6 +1505,7 @@ static bool stratum_handle_response(char *buf) { json_t *val, *err_val, *res_val, *id_val; json_error_t err; + struct timeval tv_answer, diff; bool ret = false; val = JSON_LOADS(buf, &err); @@ -1522,6 +1525,11 @@ static bool stratum_handle_response(char *buf) if (json_integer_value(id_val) < 4) goto out; + gettimeofday(&tv_answer, NULL); + timeval_subtract(&diff, &tv_answer, &stratum.tv_submit); + // store time required to the pool to answer to a submit + stratum.answer_msec = (1000.0 * diff.tv_sec) + (uint32_t) (0.001 * diff.tv_usec); + share_result(json_is_true(res_val), err_val ? json_string_value(json_array_get(err_val, 1)) : NULL); diff --git a/hashlog.cpp b/hashlog.cpp index e466dc9..d0c8dab 100644 --- a/hashlog.cpp +++ b/hashlog.cpp @@ -92,7 +92,7 @@ void hashlog_remember_scan_range(struct work* work) data = tlastshares[key]; if (range == 0) { memset(&data, 0, sizeof(data)); - data.njobid = njobid; + data.njobid = (uint32_t) njobid; } else { // get min and max from all sent records data.scanned_from = LO_DWORD(range); diff --git a/miner.h b/miner.h index 7e5a351..5fcea1c 100644 --- a/miner.h +++ b/miner.h @@ -546,6 +546,11 @@ struct stratum_ctx { struct stratum_job job; pthread_mutex_t work_lock; + struct timeval tv_submit; + uint32_t answer_msec; + uint32_t disconnects; + time_t tm_connected; + int srvtime_diff; }; diff --git a/util.cpp b/util.cpp index e775b18..3f6842e 100644 --- a/util.cpp +++ b/util.cpp @@ -875,6 +875,7 @@ void stratum_disconnect(struct stratum_ctx *sctx) { pthread_mutex_lock(&sctx->sock_lock); if (sctx->curl) { + sctx->disconnects++; curl_easy_cleanup(sctx->curl); sctx->curl = NULL; sctx->sockbuf[0] = '\0'; @@ -1080,6 +1081,7 @@ bool stratum_authorize(struct stratum_ctx *sctx, const char *user, const char *p goto out; } + sctx->tm_connected = time(NULL); ret = true; // subscribe to extranonce (optional)