From 1c66abb0a98403d6ea277dec230ab2a9c6d52cbd Mon Sep 17 00:00:00 2001 From: kanoi Date: Wed, 20 Aug 2014 05:14:35 +1000 Subject: [PATCH] ckdb - add round share count to 'homepage' and php --- pool/page.php | 28 ++++++++++++++++++------ src/ckdb.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 79 insertions(+), 8 deletions(-) diff --git a/pool/page.php b/pool/page.php index 9d2ad252..66772e24 100644 --- a/pool/page.php +++ b/pool/page.php @@ -126,6 +126,8 @@ function pgtop($dotop, $user, $douser) $phr = '?THs'; $plb = '?'; $nlb = '?'; + $pac = '0'; + $per = '0'; $uhr = '?GHs'; $u1hr = ''; if ($info !== false) @@ -168,10 +170,11 @@ function pgtop($dotop, $user, $douser) } else { - $min = round(($sec % 3600) / 60); - $hr = round($sec / 3600); + $min = round($sec / 60); + $hr = round($min / 60); + $min -= ($hr * 60); $plb = $hr.'h'; - if ($min != 0) + if ($min > 0) $plb .= ' '.$min.'m'; } } @@ -183,15 +186,21 @@ function pgtop($dotop, $user, $douser) $nlb = $info['lastbc']; if ($nlb != '?') { - $sec = $now - $info['lastbc']; + $sec = $now - $nlb; $min = round($sec / 60); $nlb = $min.'m'; - $s = $sec % 60; + $s = $sec - $min * 60; if ($s > 0) $nlb .= " ${s}s"; } } + if (isset($info['blockacc'])) + $pac = $info['blockacc']; + + if (isset($info['blockerr'])) + $per = $info['blockerr']; + if (isset($info['u_hashrate5m'])) { $uhr = $info['u_hashrate5m']; @@ -235,12 +244,19 @@ function pgtop($dotop, $user, $douser) $top .= '
'; if ($dotop === true) { + $top .= '
'; $top .= 'CKPool:'; $top .= "$phr"; + $top .= '
'; + $top .= 'Block Shares:'; + $top .= "$pac"; + $top .= '
'; $top .= 'Pool, Last Block:'; $top .= "$plb"; + $top .= '
'; $top .= 'Network, Last Block:'; $top .= "$nlb"; + $top .= '
'; if ($douser === true) { @@ -273,7 +289,7 @@ Pass: else $top .= ' '; - $top .= ''; + $top .= '
'; return $top; } # diff --git a/src/ckdb.c b/src/ckdb.c index 207e484b..3c24d5b4 100644 --- a/src/ckdb.c +++ b/src/ckdb.c @@ -223,6 +223,18 @@ typedef struct loadstatus { } LOADSTATUS; static LOADSTATUS dbstatus; +// Share stats since last block +typedef struct poolstatus { + int64_t workinfoid; // Last block + double diffacc; + double differr; + double best_sdiff; // TODO +} POOLSTATUS; +static POOLSTATUS pool; +/* TODO: when we know about orphans, the count reset to zero + * will need to be undone - i.e. recalculate this data from + * the memory tables */ + // size limit on the command string #define CMD_SIZ 31 #define ID_SIZ 31 @@ -3576,6 +3588,11 @@ static bool shares_add(PGconn *conn, char *workinfoid, char *username, char *wor } if (!DATA_SHARESUMMARY(ss_item)->reset) { + if (DATA_SHARESUMMARY(ss_item)->workinfoid >= pool.workinfoid) { + // Negate coz the shares will re-add + pool.diffacc -= DATA_SHARESUMMARY(ss_item)->sharecount; + pool.differr -= DATA_SHARESUMMARY(ss_item)->errorcount; + } zero_sharesummary(DATA_SHARESUMMARY(ss_item), cd, shares->diff); DATA_SHARESUMMARY(ss_item)->reset = true; } @@ -3686,6 +3703,11 @@ static bool shareerrors_add(PGconn *conn, char *workinfoid, char *username, } if (!DATA_SHARESUMMARY(ss_item)->reset) { + if (DATA_SHARESUMMARY(ss_item)->workinfoid >= pool.workinfoid) { + // Negate coz the shares will re-add + pool.diffacc -= DATA_SHARESUMMARY(ss_item)->sharecount; + pool.differr -= DATA_SHARESUMMARY(ss_item)->errorcount; + } zero_sharesummary(DATA_SHARESUMMARY(ss_item), cd, 0.0); DATA_SHARESUMMARY(ss_item)->reset = true; } @@ -3862,22 +3884,32 @@ static bool _sharesummary_update(PGconn *conn, SHARES *s_row, SHAREERRORS *e_row case SE_NONE: row->diffacc += s_row->diff; row->shareacc++; + if (row->workinfoid >= pool.workinfoid) + pool.diffacc += s_row->diff; break; case SE_STALE: row->diffsta += s_row->diff; row->sharesta++; + if (row->workinfoid >= pool.workinfoid) + pool.differr += s_row->diff; break; case SE_DUPE: row->diffdup += s_row->diff; row->sharedup++; + if (row->workinfoid >= pool.workinfoid) + pool.differr += s_row->diff; break; case SE_HIGH_DIFF: row->diffhi += s_row->diff; row->sharehi++; + if (row->workinfoid >= pool.workinfoid) + pool.differr += s_row->diff; break; default: row->diffrej += s_row->diff; row->sharerej++; + if (row->workinfoid >= pool.workinfoid) + pool.differr += s_row->diff; break; } } @@ -4236,6 +4268,12 @@ static bool sharesummary_fill(PGconn *conn) } else if (tv_newer(&(dbstatus.newest_sharesummary_firstshare), &(row->firstshare))) copy_tv(&(dbstatus.newest_sharesummary_firstshare), &(row->firstshare)); + if (row->workinfoid >= pool.workinfoid) { + pool.diffacc += row->diffacc; + pool.differr += row->diffsta + row->diffdup + + row->diffhi + row->diffrej; + } + tick(); } if (!ok) @@ -4563,9 +4601,14 @@ flail: tmp[0] = '\0'; else { snprintf(tmp, sizeof(tmp), - " Reward: %f, User: %s, Worker: %s", + " Reward: %f, User: %s, Worker: %s, ShareEst: %.1f", BTC_TO_D(DATA_BLOCKS(b_item)->reward), - username, workername); + username, workername, pool.diffacc); + if (pool.workinfoid < DATA_BLOCKS(b_item)->workinfoid) { + pool.workinfoid = DATA_BLOCKS(b_item)->workinfoid; + pool.diffacc = pool.differr = + pool.best_sdiff = 0.0; + } } LOGWARNING("%s(): BLOCK! Status: %s, Block: %s/...%s%s", @@ -4684,6 +4727,9 @@ static bool blocks_fill(PGconn *conn) if (tv_newer(&(dbstatus.newest_createdate_blocks), &(row->createdate))) copy_tv(&(dbstatus.newest_createdate_blocks), &(row->createdate)); + + if (pool.workinfoid < row->workinfoid) + pool.workinfoid = row->workinfoid; } if (!ok) k_add_head(blocks_free, item); @@ -7282,6 +7328,15 @@ static char *cmd_homepage(__maybe_unused PGconn *conn, char *cmd, char *id, APPEND_REALLOC(buf, off, len, tmp); } + + snprintf(tmp, sizeof(tmp), "blockacc=%.1f%c", + pool.diffacc, FLDSEP); + APPEND_REALLOC(buf, off, len, tmp); + + snprintf(tmp, sizeof(tmp), "blockerr=%.1f%c", + pool.differr, FLDSEP); + APPEND_REALLOC(buf, off, len, tmp); + // TODO: assumes only one poolinstance (for now) p_item = last_in_ktree(poolstats_root, ctx);