diff --git a/pool/page.php b/pool/page.php
index 3fdf0525..54eafadd 100644
--- a/pool/page.php
+++ b/pool/page.php
@@ -129,6 +129,10 @@ h1 {margin-top: 20px; float:middle; font-size: 20px;}
.dls {text-align: left; padding: 2px 8px; text-decoration:line-through; font-weight:lighter; }
.drs {text-align: right; padding: 2px 8px; text-decoration:line-through; font-weight:lighter; }
.dcs {text-align: center; padding: 2px 8px; text-decoration:line-through; font-weight:lighter; }
+.st0 {font-weight:bold; }
+.st1 {color:red; font-weight:bold; }
+.st2 {color:green; font-weight:bold; }
+.st3 {color:blue; font-weight:bold; }
\n";
$head .= '';
diff --git a/pool/page_blocks.php b/pool/page_blocks.php
index 4fda69df..043569ff 100644
--- a/pool/page_blocks.php
+++ b/pool/page_blocks.php
@@ -76,6 +76,16 @@ function doblocks($data, $user)
if ($stat == '1-Confirm')
$stat = 'Conf';
+ $stara = '';
+ $starp = '';
+ if (isset($ans['status:'.($i+1)]))
+ if ($ans['status:'.($i+1)] == 'Orphan'
+ && $stat != 'Orphan')
+ {
+ $stara = '*';
+ $starp = '*';
+ }
+
$hi = $ans['height:'.$i];
$hifld = "$blink$hi>$hi";
@@ -87,11 +97,11 @@ function doblocks($data, $user)
{
$pct = 100.0 * $diffacc / $netdiff;
list($fg, $bg) = pctcolour($pct);
- $bpct = "".number_format($pct, 2).'%';
+ $bpct = "$starp".number_format($pct, 2).'%';
$bg = " bgcolor=$bg";
- $nettot += $netdiff;
+ $blktot += $diffacc;
if ($stat != 'Orphan')
- $blktot += $diffacc;
+ $nettot += $netdiff;
}
else
{
@@ -105,8 +115,8 @@ function doblocks($data, $user)
$pg .= "
".btcfmt($ans['reward:'.$i]).' | ';
$pg .= "".gmdate('Y-m-d H:i:s+00', $ans['firstcreatedate:'.$i]).' | ';
$pg .= "".$stat.' | ';
- $pg .= "".$acc.' | ';
- $pg .= "".$bpct.' | ';
+ $pg .= "$stara$acc | ";
+ $pg .= "$bpct | ";
$pg .= "\n";
}
}
diff --git a/pool/page_workers.php b/pool/page_workers.php
index 84b306d3..4eb8707b 100644
--- a/pool/page_workers.php
+++ b/pool/page_workers.php
@@ -144,7 +144,7 @@ function doworker($data, $user)
$row = 'even';
else
$row = 'odd';
- $pg .= " | ";
+ $pg .= "
Total: | | ";
$shareacc = number_format($tsh, 0);
$pg .= "$shareacc | ";
$diffacc = number_format($tdif, 0);
diff --git a/src/ckdb.c b/src/ckdb.c
index a006b71a..80492eba 100644
--- a/src/ckdb.c
+++ b/src/ckdb.c
@@ -47,7 +47,7 @@
#define DB_VLOCK "1"
#define DB_VERSION "0.9"
-#define CKDB_VERSION DB_VERSION"-0.252"
+#define CKDB_VERSION DB_VERSION"-0.273"
#define WHERE_FFL " - from %s %s() line %d"
#define WHERE_FFL_HERE __FILE__, __func__, __LINE__
@@ -674,7 +674,8 @@ static const tv_t date_begin = { DATE_BEGIN, 0L };
#define PQPARAM14 PQPARAM8 ",$9,$10,$11,$12,$13,$14"
#define PQPARAM15 PQPARAM8 ",$9,$10,$11,$12,$13,$14,$15"
#define PQPARAM16 PQPARAM8 ",$9,$10,$11,$12,$13,$14,$15,$16"
-#define PQPARAM27 PQPARAM16 ",$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27"
+#define PQPARAM22 PQPARAM16 ",$17,$18,$19,$20,$21,$22"
+#define PQPARAM27 PQPARAM22 ",$23,$24,$25,$26,$27"
#define PARCHK(_par, _params) do { \
if (_par != (int)(sizeof(_params)/sizeof(_params[0]))) { \
@@ -911,7 +912,7 @@ static char *_transfer_data(K_ITEM *item, WHERE_FFL_ARGS)
* since mvalue is NULL */
quitfrom(1, file, func, line,
"Transfer '%s' '%s' has NULL mvalue",
- transfer->name, transfer->mvalue);
+ transfer->name, transfer->svalue);
}
return mvalue;
}
@@ -960,6 +961,7 @@ typedef struct users {
#define LIMIT_USERS 0
#define INIT_USERS(_item) INIT_GENERIC(_item, users)
#define DATA_USERS(_var, _item) DATA_GENERIC(_var, _item, users, true)
+#define DATA_USERS_NULL(_var, _item) DATA_GENERIC(_var, _item, users, false)
static K_TREE *users_root;
static K_TREE *userid_root;
@@ -1302,7 +1304,9 @@ typedef struct blocks {
#define BLOCKS_ORPHAN_STR "O"
#define BLOCKS_STATSPENDING FALSE_CHR
+#define BLOCKS_STATSPENDING_STR FALSE_STR
#define BLOCKS_STATSCONFIRMED TRUE_CHR
+#define BLOCKS_STATSCONFIRMED_STR TRUE_STR
static const char *blocks_new = "New";
static const char *blocks_confirm = "1-Confirm";
@@ -2460,7 +2464,7 @@ static void set_block_share_counters()
ss_item = prev_in_ktree(ctx);
}
- K_RLOCK(sharesummary_free);
+ K_RUNLOCK(sharesummary_free);
}
/* All data is loaded, now update workerstatus fields
@@ -4196,7 +4200,6 @@ static bool workinfo_age(PGconn *conn, int64_t workinfoid, char *poolinstance,
if (error[0])
LOGERR("%s(): %s", __func__, error);
}
- K_RUNLOCK(sharesummary_free);
if (conned)
PQfinish(conn);
@@ -4305,9 +4308,7 @@ static void auto_age_older(PGconn *conn, int64_t workinfoid, char *poolinstance,
wid_count++;
K_RLOCK(sharesummary_free);
while (ss_item && sharesummary->workinfoid == to_id) {
- K_RLOCK(sharesummary_free);
ss_item = next_in_ktree(ctx);
- K_RUNLOCK(sharesummary_free);
DATA_SHARESUMMARY_NULL(sharesummary, ss_item);
}
K_RUNLOCK(sharesummary_free);
@@ -5224,7 +5225,6 @@ static bool sharesummary_fill(PGconn *conn)
n = PQntuples(res);
LOGDEBUG("%s(): tree build count %d", __func__, n);
ok = true;
- K_WLOCK(sharesummary_free);
for (i = 0; i < n; i++) {
item = k_unlink_head(sharesummary_free);
DATA_SHARESUMMARY(row, item);
@@ -5369,7 +5369,6 @@ static bool sharesummary_fill(PGconn *conn)
if (!ok)
k_add_head(sharesummary_free, item);
- K_WUNLOCK(sharesummary_free);
PQclear(res);
if (ok) {
@@ -5384,11 +5383,9 @@ void sharesummary_reload()
{
PGconn *conn = dbconnect();
- K_WLOCK(sharesummary_free);
sharesummary_root = free_ktree(sharesummary_root, NULL);
sharesummary_workinfoid_root = free_ktree(sharesummary_workinfoid_root, NULL);
k_list_transfer_to_head(sharesummary_store, sharesummary_free);
- K_WUNLOCK(sharesummary_free);
sharesummary_fill(conn);
@@ -5420,9 +5417,10 @@ static void dsp_blocks(K_ITEM *item, FILE *stream)
dsp_hash(b->blockhash, hash_dsp, sizeof(hash_dsp));
tv_to_buf(&(b->createdate), createdate_buf, sizeof(createdate_buf));
tv_to_buf(&(b->expirydate), expirydate_buf, sizeof(expirydate_buf));
- fprintf(stream, " hi=%d hash='%.16s' uid=%"PRId64" w='%s' "
- "cd=%s ed=%s\n",
- b->height, hash_dsp, b->userid, b->workername,
+ fprintf(stream, " hi=%d hash='%.16s' conf=%s uid=%"PRId64
+ " w='%s' sconf=%s cd=%s ed=%s\n",
+ b->height, hash_dsp, b->confirmed, b->userid,
+ b->workername, b->statsconfirmed,
createdate_buf, expirydate_buf);
}
}
@@ -5532,12 +5530,12 @@ static bool blocks_stats(PGconn *conn, int32_t height, char *blockhash,
K_RUNLOCK(blocks_free);
if (!old_b_item) {
- LOGERR("%s(): Non-existent Block: %s/...%s",
+ LOGERR("%s(): Non-existent Block: %d/...%s",
__func__, height, hash_dsp);
return false;
}
- DATA_BLOCKS_NULL(oldblocks, old_b_item);
+ DATA_BLOCKS(oldblocks, old_b_item);
K_WLOCK(blocks_free);
b_item = k_unlink_head(blocks_free);
@@ -5666,7 +5664,7 @@ static bool blocks_add(PGconn *conn, char *height, char *blockhash,
BLOCKS *row, *oldblocks;
USERS *users;
char *upd, *ins;
- char *params[11 + HISTORYDATECOUNT];
+ char *params[17 + HISTORYDATECOUNT];
bool ok = false, update_old = false;
int par = 0;
char want = '?';
@@ -5685,14 +5683,16 @@ static bool blocks_add(PGconn *conn, char *height, char *blockhash,
dsp_hash(blockhash, hash_dsp, sizeof(hash_dsp));
- K_WLOCK(blocks_free);
+ K_RLOCK(blocks_free);
old_b_item = find_blocks(row->height, blockhash);
+ K_RUNLOCK(blocks_free);
DATA_BLOCKS_NULL(oldblocks, old_b_item);
switch (confirmed[0]) {
case BLOCKS_NEW:
// None should exist - so must be a duplicate
if (old_b_item) {
+ K_WLOCK(blocks_free);
k_add_head(blocks_free, b_item);
K_WUNLOCK(blocks_free);
if (!igndup) {
@@ -5706,7 +5706,6 @@ static bool blocks_add(PGconn *conn, char *height, char *blockhash,
}
return true;
}
- K_WUNLOCK(blocks_free);
K_RLOCK(users_free);
u_item = find_users(username);
@@ -5726,6 +5725,13 @@ static bool blocks_add(PGconn *conn, char *height, char *blockhash,
STRNCPY(row->nonce2, nonce2);
STRNCPY(row->nonce, nonce);
TXT_TO_BIGINT("reward", reward, row->reward);
+ // Specify them
+ row->diffacc = 0;
+ row->diffinv = 0;
+ row->shareacc = 0;
+ row->shareinv = 0;
+ row->elapsed = 0;
+ STRNCPY(row->statsconfirmed, BLOCKS_STATSPENDING_STR);
HISTORYDATEINIT(row, cd, by, code, inet);
HISTORYDATETRANSFER(trf_root, row);
@@ -5742,14 +5748,21 @@ static bool blocks_add(PGconn *conn, char *height, char *blockhash,
params[par++] = str_to_buf(row->nonce, NULL, 0);
params[par++] = bigint_to_buf(row->reward, NULL, 0);
params[par++] = str_to_buf(row->confirmed, NULL, 0);
+ params[par++] = double_to_buf(row->diffacc, NULL, 0);
+ params[par++] = double_to_buf(row->diffinv, NULL, 0);
+ params[par++] = double_to_buf(row->shareacc, NULL, 0);
+ params[par++] = double_to_buf(row->shareinv, NULL, 0);
+ params[par++] = bigint_to_buf(row->elapsed, NULL, 0);
+ params[par++] = str_to_buf(row->statsconfirmed, NULL, 0);
HISTORYDATEPARAMS(params, par, row);
PARCHK(par, params);
- // db default stats values
ins = "insert into blocks "
"(height,blockhash,workinfoid,userid,workername,"
- "clientid,enonce1,nonce2,nonce,reward,confirmed"
- HISTORYDATECONTROL ") values (" PQPARAM16 ")";
+ "clientid,enonce1,nonce2,nonce,reward,confirmed,"
+ "diffacc,diffinv,shareacc,shareinv,elapsed,"
+ "statsconfirmed"
+ HISTORYDATECONTROL ") values (" PQPARAM22 ")";
if (conn == NULL) {
conn = dbconnect();
@@ -5767,7 +5780,6 @@ static bool blocks_add(PGconn *conn, char *height, char *blockhash,
case BLOCKS_42:
// These shouldn't be possible until startup completes
if (!startup_complete) {
- K_WUNLOCK(blocks_free);
tv_to_buf(cd, cd_buf, sizeof(cd_buf));
LOGERR("%s(): Status: %s invalid during startup. "
"Ignored: Block: %s/...%s/%s",
@@ -5779,7 +5791,6 @@ static bool blocks_add(PGconn *conn, char *height, char *blockhash,
want = BLOCKS_CONFIRM;
case BLOCKS_CONFIRM:
if (!old_b_item) {
- K_WUNLOCK(blocks_free);
tv_to_buf(cd, cd_buf, sizeof(cd_buf));
LOGERR("%s(): Can't %s a non-existent Block: %s/...%s/%s",
__func__, blocks_confirmed(confirmed),
@@ -5789,8 +5800,6 @@ static bool blocks_add(PGconn *conn, char *height, char *blockhash,
if (confirmed[0] == BLOCKS_CONFIRM)
want = BLOCKS_NEW;
if (oldblocks->confirmed[0] != want) {
- k_add_head(blocks_free, b_item);
- K_WUNLOCK(blocks_free);
// No mismatch messages during startup
if (startup_complete) {
tv_to_buf(cd, cd_buf, sizeof(cd_buf));
@@ -5803,7 +5812,6 @@ static bool blocks_add(PGconn *conn, char *height, char *blockhash,
}
goto flail;
}
- K_WUNLOCK(blocks_free);
upd = "update blocks set expirydate=$1 where blockhash=$2 and expirydate=$3";
par = 0;
@@ -5887,7 +5895,7 @@ static bool blocks_add(PGconn *conn, char *height, char *blockhash,
"height,blockhash,workinfoid,userid,workername,"
"clientid,enonce1,nonce2,nonce,reward,"
"$3,diffacc,diffinv,shareacc,shareinv,elapsed,"
- "statsconfirmed"
+ "statsconfirmed,"
"$4,$5,$6,$7,$8 from blocks where "
"blockhash=$1 and expirydate=$2";
}
@@ -5906,7 +5914,6 @@ static bool blocks_add(PGconn *conn, char *height, char *blockhash,
res = PQexec(conn, "Commit", CKPQ_WRITE);
break;
default:
- K_WUNLOCK(blocks_free);
LOGERR("%s(): %s.failed.invalid confirm='%s'",
__func__, id, confirmed);
goto flail;
@@ -6034,7 +6041,6 @@ static bool blocks_fill(PGconn *conn)
n = PQntuples(res);
LOGDEBUG("%s(): tree build count %d", __func__, n);
ok = true;
- K_WLOCK(blocks_free);
for (i = 0; i < n; i++) {
item = k_unlink_head(blocks_free);
DATA_BLOCKS(row, item);
@@ -6140,7 +6146,6 @@ static bool blocks_fill(PGconn *conn)
if (!ok)
k_add_head(blocks_free, item);
- K_WUNLOCK(blocks_free);
PQclear(res);
if (ok) {
@@ -6155,10 +6160,8 @@ void blocks_reload()
{
PGconn *conn = dbconnect();
- K_WLOCK(blocks_free);
blocks_root = free_ktree(blocks_root, NULL);
k_list_transfer_to_head(blocks_store, blocks_free);
- K_WUNLOCK(blocks_free);
blocks_fill(conn);
@@ -7994,7 +7997,7 @@ static char *cmd_userset(PGconn *conn, char *cmd, char *id,
}
} else {
if (strcasecmp(transfer_data(i_passwordhash),
- users->passwordhash) == 0) {
+ users->passwordhash)) {
reason = "Incorrect password";
goto struckout;
}
@@ -8749,23 +8752,23 @@ static char *cmd_workers(__maybe_unused PGconn *conn, char *cmd, char *id,
snprintf(tmp, sizeof(tmp), "w_lastshare:%d=%s%c", rows, reply, FLDSEP);
APPEND_REALLOC(buf, off, len, tmp);
- double_to_buf((int)(w_lastdiff), reply, sizeof(reply));
+ double_to_buf(w_lastdiff, reply, sizeof(reply));
snprintf(tmp, sizeof(tmp), "w_lastdiff:%d=%s%c", rows, reply, FLDSEP);
APPEND_REALLOC(buf, off, len, tmp);
- double_to_buf((int)(w_diffacc), reply, sizeof(reply));
+ double_to_buf(w_diffacc, reply, sizeof(reply));
snprintf(tmp, sizeof(tmp), "w_diffacc:%d=%s%c", rows, reply, FLDSEP);
APPEND_REALLOC(buf, off, len, tmp);
- double_to_buf((int)(w_diffinv), reply, sizeof(reply));
+ double_to_buf(w_diffinv, reply, sizeof(reply));
snprintf(tmp, sizeof(tmp), "w_diffinv:%d=%s%c", rows, reply, FLDSEP);
APPEND_REALLOC(buf, off, len, tmp);
- double_to_buf((int)(w_shareacc), reply, sizeof(reply));
+ double_to_buf(w_shareacc, reply, sizeof(reply));
snprintf(tmp, sizeof(tmp), "w_shareacc:%d=%s%c", rows, reply, FLDSEP);
APPEND_REALLOC(buf, off, len, tmp);
- double_to_buf((int)(w_shareinv), reply, sizeof(reply));
+ double_to_buf(w_shareinv, reply, sizeof(reply));
snprintf(tmp, sizeof(tmp), "w_shareinv:%d=%s%c", rows, reply, FLDSEP);
APPEND_REALLOC(buf, off, len, tmp);