diff --git a/pool/base.php b/pool/base.php index 3e4c7c02..583ebcf6 100644 --- a/pool/base.php +++ b/pool/base.php @@ -99,7 +99,7 @@ function howlongago($sec) return $des; } # -function howmanyhrs($tot) +function howmanyhrs($tot, $days = false) { $sec = round($tot); if ($sec < 60) @@ -114,7 +114,14 @@ function howmanyhrs($tot) { $hr = floor($min / 60); $min -= $hr * 60; - $des = $hr.'hr '.$min.'m '.$sec.'s'; + if ($days && $hr > 23) + { + $dy = floor($hr / 24); + $hr -= $dy * 24; + $des = $dy.'d '.$hr.'hr '.$min.'m '.$sec.'s'; + } + else + $des = $hr.'hr '.$min.'m '.$sec.'s'; } } return $des; diff --git a/pool/page_pplns2.php b/pool/page_pplns2.php index 1d87007f..9455b655 100644 --- a/pool/page_pplns2.php +++ b/pool/page_pplns2.php @@ -121,6 +121,9 @@ function fmtdata($code, $val) case '.': $ret = number_format($val, 1); break; + case '@': + $ret = howmanyhrs($val, true); + break; default: $ret = $val; } @@ -186,6 +189,7 @@ Block: 'PPLNS Wanted' => '.diff_want', 'PPLNS Used' => '.diffacc_total', 'Elapsed Seconds' => ',pplns_elapsed', + 'Elapsed Time' => '@pplns_elapsed', 'Users' => 'rows', 'Oldest Workinfoid' => 'begin_workinfoid', 'Oldest Time' => 'begin_stamp', @@ -241,6 +245,7 @@ Block: { case ',': case '.': + case '@': $nm = substr($name, 1); $fmt = fmtdata($name[0], $ans[$nm]); break; diff --git a/pool/page_workers.php b/pool/page_workers.php index adf5ebf0..78173010 100644 --- a/pool/page_workers.php +++ b/pool/page_workers.php @@ -61,6 +61,7 @@ function workuser($data, $user, &$offset, &$totshare, &$totdiff, $all[] = array('workername' => $ans['workername:'.$i], 'w_lastshare' => $ans['w_lastshare:'.$i], + 'w_lastshareacc' => $ans['w_lastshareacc:'.$i], 'w_lastdiff' => $ans['w_lastdiff:'.$i], 'w_shareacc' => $ans['w_shareacc:'.$i], 'w_diffacc' => $ans['w_diffacc:'.$i], @@ -80,6 +81,8 @@ function workuser($data, $user, &$offset, &$totshare, &$totdiff, if ($old !== false && $lst > $old) continue; + $lstacc = $now - $all[$i]['w_lastshareacc']; + if ((($offset) % 2) == 0) $row = 'even'; else @@ -93,7 +96,7 @@ function workuser($data, $user, &$offset, &$totshare, &$totdiff, $ld = ' '; $pg .= "$ld"; - $pg .= "".howlongago($lst).''; + $pg .= "".howlongago($lstacc).''; $shareacc = number_format($all[$i]['w_shareacc'], 0); $totshare += $all[$i]['w_shareacc']; diff --git a/sql/ckdb.sql b/sql/ckdb.sql index f7d9775b..4f39ba26 100644 --- a/sql/ckdb.sql +++ b/sql/ckdb.sql @@ -247,6 +247,8 @@ CREATE TABLE sharesummary ( -- per workinfo for each user+worker errorcount bigint NOT NULL, firstshare timestamp with time zone NOT NULL, lastshare timestamp with time zone NOT NULL, + firstshareacc timestamp with time zone NOT NULL, + lastshareacc timestamp with time zone NOT NULL, lastdiffacc float NOT NULL, complete char NOT NULL, createdate timestamp with time zone NOT NULL, @@ -311,6 +313,8 @@ CREATE TABLE markersummary ( -- sum of sharesummary for a workinfo range errorcount bigint NOT NULL, firstshare timestamp with time zone NOT NULL, lastshare timestamp with time zone NOT NULL, + firstshareacc timestamp with time zone NOT NULL, + lastshareacc timestamp with time zone NOT NULL, lastdiffacc float NOT NULL, createdate timestamp with time zone NOT NULL, createby character varying(64) NOT NULL, @@ -464,4 +468,4 @@ CREATE TABLE version ( PRIMARY KEY (vlock) ); -insert into version (vlock,version) values (1,'1.0.2'); +insert into version (vlock,version) values (1,'1.0.3'); diff --git a/sql/v1.0.2-v1.0.3.sql b/sql/v1.0.2-v1.0.3.sql new file mode 100644 index 00000000..86494661 --- /dev/null +++ b/sql/v1.0.2-v1.0.3.sql @@ -0,0 +1,38 @@ +SET SESSION AUTHORIZATION 'postgres'; + +BEGIN transaction; + +DO $$ +DECLARE ver TEXT; +BEGIN + + UPDATE version set version='1.0.3' where vlock=1 and version='1.0.2'; + + IF found THEN + RETURN; + END IF; + + SELECT version into ver from version + WHERE vlock=1; + + RAISE EXCEPTION 'Wrong DB version - expect "1.0.2" - found "%"', ver; + +END $$; + +ALTER TABLE ONLY markersummary + ADD COLUMN firstshareacc timestamp with time zone DEFAULT '1970-01-01 00:00:00+00' NOT NULL, + ADD COLUMN lastshareacc timestamp with time zone DEFAULT '1970-01-01 00:00:00+00' NOT NULL; + +ALTER TABLE ONLY markersummary + ALTER COLUMN firstshareacc DROP DEFAULT, + ALTER COLUMN lastshareacc DROP DEFAULT; + +ALTER TABLE ONLY sharesummary + ADD COLUMN firstshareacc timestamp with time zone DEFAULT '1970-01-01 00:00:00+00' NOT NULL, + ADD COLUMN lastshareacc timestamp with time zone DEFAULT '1970-01-01 00:00:00+00' NOT NULL; + +ALTER TABLE ONLY sharesummary + ALTER COLUMN firstshareacc DROP DEFAULT, + ALTER COLUMN lastshareacc DROP DEFAULT; + +END transaction; diff --git a/src/ckdb.c b/src/ckdb.c index 6e4e03a7..63a51dfe 100644 --- a/src/ckdb.c +++ b/src/ckdb.c @@ -267,6 +267,7 @@ static bool seqdata_reload_lost = false; tv_t last_heartbeat; tv_t last_workinfo; tv_t last_share; +tv_t last_share_acc; tv_t last_share_inv; tv_t last_auth; cklock_t last_lock; @@ -2950,12 +2951,14 @@ static void summarise_blocks() return; } has_ss = true; - if (elapsed_start.tv_sec == 0 || - !tv_newer(&elapsed_start, &(sharesummary->firstshare))) { - copy_tv(&elapsed_start, &(sharesummary->firstshare)); + if (sharesummary->diffacc > 0) { + if (elapsed_start.tv_sec == 0 || + !tv_newer(&elapsed_start, &(sharesummary->firstshareacc))) { + copy_tv(&elapsed_start, &(sharesummary->firstshareacc)); + } + if (tv_newer(&elapsed_finish, &(sharesummary->lastshareacc))) + copy_tv(&elapsed_finish, &(sharesummary->lastshareacc)); } - if (tv_newer(&elapsed_finish, &(sharesummary->lastshare))) - copy_tv(&elapsed_finish, &(sharesummary->lastshare)); diffacc += sharesummary->diffacc; diffinv += sharesummary->diffsta + sharesummary->diffdup + @@ -3003,12 +3006,14 @@ static void summarise_blocks() DATA_MARKERSUMMARY_NULL(markersummary, ms_item); while (ms_item && markersummary->markerid == workmarkers->markerid) { has_ms = true; - if (elapsed_start.tv_sec == 0 || - !tv_newer(&elapsed_start, &(markersummary->firstshare))) { - copy_tv(&elapsed_start, &(markersummary->firstshare)); + if (markersummary->diffacc > 0) { + if (elapsed_start.tv_sec == 0 || + !tv_newer(&elapsed_start, &(markersummary->firstshareacc))) { + copy_tv(&elapsed_start, &(markersummary->firstshareacc)); + } + if (tv_newer(&elapsed_finish, &(markersummary->lastshareacc))) + copy_tv(&elapsed_finish, &(markersummary->lastshareacc)); } - if (tv_newer(&elapsed_finish, &(markersummary->lastshare))) - copy_tv(&elapsed_finish, &(markersummary->lastshare)); diffacc += markersummary->diffacc; diffinv += markersummary->diffsta + markersummary->diffdup + @@ -3149,7 +3154,7 @@ static void make_a_shift_mark() MARKS *marks = NULL, *sh_marks = NULL; int64_t ss_age_wid, last_marks_wid, marks_wid, prev_wid; bool was_block = false, ok; - char cd_buf[DATE_BUFSIZ], cd_buf2[DATE_BUFSIZ]; + char cd_buf[DATE_BUFSIZ], cd_buf2[DATE_BUFSIZ], cd_buf3[DATE_BUFSIZ]; int used_wid; /* If there are no CURRENT marks, make the first one by @@ -3225,12 +3230,13 @@ static void make_a_shift_mark() } K_RUNLOCK(sharesummary_free); if (ss_item) { - tv_to_buf(&(sharesummary->lastshare), cd_buf, sizeof(cd_buf)); - tv_to_buf(&(sharesummary->createdate), cd_buf2, sizeof(cd_buf2)); - LOGDEBUG("%s() last sharesummary %s/%s/%"PRId64"/%s/%s", + tv_to_buf(&(sharesummary->lastshareacc), cd_buf, sizeof(cd_buf)); + tv_to_buf(&(sharesummary->lastshare), cd_buf2, sizeof(cd_buf2)); + tv_to_buf(&(sharesummary->createdate), cd_buf3, sizeof(cd_buf3)); + LOGDEBUG("%s() last sharesummary %s/%s/%"PRId64"/%s/%s/%s", __func__, sharesummary->complete, sharesummary->workername, - ss_age_wid, cd_buf, cd_buf2); + ss_age_wid, cd_buf, cd_buf2, cd_buf3); } LOGDEBUG("%s() age sharesummary limit wid %"PRId64, __func__, ss_age_wid); @@ -3407,16 +3413,18 @@ static void make_a_shift_mark() /* Not aged = shift not complete * Though, it shouldn't happen */ if (sharesummary->complete[0] == SUMMARY_NEW) { - tv_to_buf(&(sharesummary->lastshare), + tv_to_buf(&(sharesummary->lastshareacc), cd_buf, sizeof(cd_buf)); - tv_to_buf(&(sharesummary->createdate), + tv_to_buf(&(sharesummary->lastshare), cd_buf2, sizeof(cd_buf2)); + tv_to_buf(&(sharesummary->createdate), + cd_buf3, sizeof(cd_buf3)); LOGEMERG("%s() ERR unaged sharesummary " - "%s/%s/%"PRId64"/%s/%s", + "%s/%s/%"PRId64"/%s/%s/%s", __func__, sharesummary->complete, sharesummary->workername, sharesummary->workinfoid, - cd_buf, cd_buf2); + cd_buf, cd_buf2, cd_buf3); return; } } @@ -4690,6 +4698,7 @@ static void *listener(void *arg) setnow(&last_heartbeat); copy_tv(&last_workinfo, &last_heartbeat); copy_tv(&last_share, &last_heartbeat); + copy_tv(&last_share_acc, &last_heartbeat); copy_tv(&last_share_inv, &last_heartbeat); copy_tv(&last_auth, &last_heartbeat); ck_wunlock(&last_lock); diff --git a/src/ckdb.h b/src/ckdb.h index 6eadecff..8b4360be 100644 --- a/src/ckdb.h +++ b/src/ckdb.h @@ -54,8 +54,8 @@ */ #define DB_VLOCK "1" -#define DB_VERSION "1.0.2" -#define CKDB_VERSION DB_VERSION"-1.311" +#define DB_VERSION "1.0.3" +#define CKDB_VERSION DB_VERSION"-1.320" #define WHERE_FFL " - from %s %s() line %d" #define WHERE_FFL_HERE __FILE__, __func__, __LINE__ @@ -312,6 +312,7 @@ extern bool everyone_die; extern tv_t last_heartbeat; extern tv_t last_workinfo; extern tv_t last_share; +extern tv_t last_share_acc; extern tv_t last_share_inv; extern tv_t last_auth; extern cklock_t last_lock; @@ -1435,6 +1436,8 @@ typedef struct sharesummary { int64_t errorcount; tv_t firstshare; tv_t lastshare; + tv_t firstshareacc; + tv_t lastshareacc; double lastdiffacc; char complete[TXT_FLAG+1]; MODIFYDATECONTROLPOINTERS; @@ -1830,7 +1833,8 @@ typedef struct workerstatus { char workername[TXT_BIG+1]; tv_t last_auth; tv_t last_share; - double last_diff; + tv_t last_share_acc; + double last_diff_acc; tv_t last_stats; tv_t last_idle; // Below gets reset on each block @@ -1890,6 +1894,8 @@ typedef struct markersummary { int64_t errorcount; tv_t firstshare; tv_t lastshare; + tv_t firstshareacc; + tv_t lastshareacc; double lastdiffacc; MODIFYDATECONTROLPOINTERS; } MARKERSUMMARY; @@ -2297,7 +2303,7 @@ extern cmp_t cmp_shareerrors(K_ITEM *a, K_ITEM *b); extern void dsp_sharesummary(K_ITEM *item, FILE *stream); extern cmp_t cmp_sharesummary(K_ITEM *a, K_ITEM *b); extern cmp_t cmp_sharesummary_workinfoid(K_ITEM *a, K_ITEM *b); -extern void zero_sharesummary(SHARESUMMARY *row, tv_t *cd, double diff); +extern void zero_sharesummary(SHARESUMMARY *row); #define find_sharesummary(_userid, _workername, _workinfoid) \ _find_sharesummary(_userid, _workername, _workinfoid, false) #define find_sharesummary_p(_workinfoid) \ @@ -2518,12 +2524,16 @@ extern bool sharesummaries_to_markersummaries(PGconn *conn, WORKMARKERS *workmar char *by, char *code, char *inet, tv_t *cd, K_TREE *trf_root); extern char *ooo_status(char *buf, size_t siz); -#define sharesummary_update(_s_row, _e_row, _ss_item, _by, _code, _inet, _cd) \ - _sharesummary_update(_s_row, _e_row, _ss_item, _by, _code, _inet, _cd, \ +#define sharesummary_update(_s_row, _e_row, _by, _code, _inet, _cd) \ + _sharesummary_update(_s_row, _e_row, _by, _code, _inet, _cd, \ WHERE_FFL_HERE) -extern bool _sharesummary_update(SHARES *s_row, SHAREERRORS *e_row, K_ITEM *ss_item, - char *by, char *code, char *inet, tv_t *cd, +extern bool _sharesummary_update(SHARES *s_row, SHAREERRORS *e_row, char *by, + char *code, char *inet, tv_t *cd, WHERE_FFL_ARGS); +#define sharesummary_age(_ss_item, _by, _code, _inet, _cd) \ + _sharesummary_age(_ss_item, _by, _code, _inet, _cd, WHERE_FFL_HERE) +extern bool _sharesummary_age(K_ITEM *ss_item, char *by, char *code, char *inet, + tv_t *cd, WHERE_FFL_ARGS); extern bool sharesummary_fill(PGconn *conn); extern bool blocks_stats(PGconn *conn, int32_t height, char *blockhash, double diffacc, double diffinv, double shareacc, diff --git a/src/ckdb_cmd.c b/src/ckdb_cmd.c index 45ac8393..ff472945 100644 --- a/src/ckdb_cmd.c +++ b/src/ckdb_cmd.c @@ -2001,6 +2001,7 @@ static char *cmd_workers(__maybe_unused PGconn *conn, char *cmd, char *id, if (ws_item) { DATA_WORKERSTATUS(workerstatus, ws_item); K_RLOCK(workerstatus_free); + // good or bad - either means active copy_tv(&last_share, &(workerstatus->last_share)); K_RUNLOCK(workerstatus_free); } else @@ -2028,7 +2029,9 @@ static char *cmd_workers(__maybe_unused PGconn *conn, char *cmd, char *id, double w_hashrate24hr; int64_t w_elapsed; tv_t w_lastshare; - double w_lastdiff, w_diffacc, w_diffinv; + tv_t w_lastshareacc; + double w_lastdiffacc, w_diffacc; + double w_diffinv; double w_diffsta, w_diffdup; double w_diffhi, w_diffrej; double w_shareacc, w_shareinv; @@ -2042,8 +2045,9 @@ static char *cmd_workers(__maybe_unused PGconn *conn, char *cmd, char *id, w_elapsed = -1; if (!ws_item) { - w_lastshare.tv_sec = 0L; - w_lastdiff = w_diffacc = + w_lastshare.tv_sec = + w_lastshareacc.tv_sec = 0L; + w_lastdiffacc = w_diffacc = w_diffinv = w_diffsta = w_diffdup = w_diffhi = w_diffrej = w_shareacc = @@ -2056,7 +2060,8 @@ static char *cmd_workers(__maybe_unused PGconn *conn, char *cmd, char *id, // It's bad to read possibly changing data K_RLOCK(workerstatus_free); w_lastshare.tv_sec = workerstatus->last_share.tv_sec; - w_lastdiff = workerstatus->last_diff; + w_lastshareacc.tv_sec = workerstatus->last_share_acc.tv_sec; + w_lastdiffacc = workerstatus->last_diff_acc; w_diffacc = workerstatus->block_diffacc; w_diffinv = workerstatus->block_diffinv; w_diffsta = workerstatus->block_diffsta; @@ -2112,7 +2117,11 @@ 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(w_lastdiff, reply, sizeof(reply)); + int_to_buf((int)(w_lastshareacc.tv_sec), reply, sizeof(reply)); + snprintf(tmp, sizeof(tmp), "w_lastshareacc:%d=%s%c", rows, reply, FLDSEP); + APPEND_REALLOC(buf, off, len, tmp); + + double_to_buf(w_lastdiffacc, reply, sizeof(reply)); snprintf(tmp, sizeof(tmp), "w_lastdiff:%d=%s%c", rows, reply, FLDSEP); APPEND_REALLOC(buf, off, len, tmp); @@ -2185,7 +2194,7 @@ static char *cmd_workers(__maybe_unused PGconn *conn, char *cmd, char *id, "workername,difficultydefault,idlenotificationenabled," "idlenotificationtime", stats ? ",w_hashrate5m,w_hashrate1hr,w_hashrate24hr," - "w_elapsed,w_lastshare," + "w_elapsed,w_lastshare,w_lastshareacc," "w_lastdiff,w_diffacc,w_diffinv," "w_diffsta,w_diffdup,w_diffhi,w_diffrej," "w_shareacc,w_shareinv," @@ -2504,10 +2513,11 @@ wiconf: int32_t errn; TXT_TO_INT("errn", transfer_data(i_errn), errn); ck_wlock(&last_lock); + setnow(&last_share); if (errn == SE_NONE) - setnow(&last_share); + copy_tv(&last_share_acc, &last_share); else - setnow(&last_share_inv); + copy_tv(&last_share_inv, &last_share); ck_wunlock(&last_lock); } LOGDEBUG("%s.ok.added %s", id, transfer_data(i_nonce)); @@ -3114,6 +3124,9 @@ static char *cmd_homepage(__maybe_unused PGconn *conn, char *cmd, char *id, ftv_to_buf(&last_share, reply, siz); snprintf(tmp, sizeof(tmp), "lastsh=%s%c", reply, FLDSEP); APPEND_REALLOC(buf, off, len, tmp); + ftv_to_buf(&last_share_acc, reply, siz); + snprintf(tmp, sizeof(tmp), "lastshacc=%s%c", reply, FLDSEP); + APPEND_REALLOC(buf, off, len, tmp); ftv_to_buf(&last_share_inv, reply, siz); snprintf(tmp, sizeof(tmp), "lastshinv=%s%c", reply, FLDSEP); APPEND_REALLOC(buf, off, len, tmp); @@ -4137,7 +4150,7 @@ static char *cmd_pplns(__maybe_unused PGconn *conn, char *cmd, char *id, if (ss_item) end_workinfoid = sharesummary->workinfoid; /* add up all sharesummaries until >= diff_want - * also record the latest lastshare - that will be the end pplns time + * also record the latest lastshareacc - that will be the end pplns time * which will be >= block_tv */ while (total_diff < diff_want && ss_item) { switch (sharesummary->complete[0]) { @@ -4159,8 +4172,8 @@ static char *cmd_pplns(__maybe_unused PGconn *conn, char *cmd, char *id, acc_share_count += sharesummary->shareacc; total_diff += (int64_t)(sharesummary->diffacc); begin_workinfoid = sharesummary->workinfoid; - if (tv_newer(&end_tv, &(sharesummary->lastshare))) - copy_tv(&end_tv, &(sharesummary->lastshare)); + if (tv_newer(&end_tv, &(sharesummary->lastshareacc))) + copy_tv(&end_tv, &(sharesummary->lastshareacc)); mu_root = upd_add_mu(mu_root, mu_store, sharesummary->userid, (int64_t)(sharesummary->diffacc)); @@ -4233,8 +4246,8 @@ static char *cmd_pplns(__maybe_unused PGconn *conn, char *cmd, char *id, acc_share_count += markersummary->shareacc; total_diff += (int64_t)(markersummary->diffacc); begin_workinfoid = workmarkers->workinfoidstart; - if (tv_newer(&end_tv, &(markersummary->lastshare))) - copy_tv(&end_tv, &(markersummary->lastshare)); + if (tv_newer(&end_tv, &(markersummary->lastshareacc))) + copy_tv(&end_tv, &(markersummary->lastshareacc)); mu_root = upd_add_mu(mu_root, mu_store, markersummary->userid, (int64_t)(markersummary->diffacc)); @@ -6521,5 +6534,5 @@ struct CMDS ckdb_cmds[] = { { CMD_SHSTA, "shsta", true, false, cmd_shsta, SEQ_NONE, ACCESS_SYSTEM }, { CMD_USERINFO, "userinfo", false, false, cmd_userinfo, SEQ_NONE, ACCESS_WEB }, { CMD_BTCSET, "btcset", false, false, cmd_btcset, SEQ_NONE, ACCESS_SYSTEM }, - { CMD_END, NULL, false, false, NULL, SEQ_NONE, NULL } + { CMD_END, NULL, false, false, NULL, SEQ_NONE, 0 } }; diff --git a/src/ckdb_data.c b/src/ckdb_data.c index 3393b99f..2aa4feb4 100644 --- a/src/ckdb_data.c +++ b/src/ckdb_data.c @@ -958,7 +958,12 @@ void workerstatus_ready() &(markersummary->lastshare))) { copy_tv(&(workerstatus->last_share), &(markersummary->lastshare)); - workerstatus->last_diff = + } + if (tv_newer(&(workerstatus->last_share_acc), + &(markersummary->lastshareacc))) { + copy_tv(&(workerstatus->last_share_acc), + &(markersummary->lastshareacc)); + workerstatus->last_diff_acc = markersummary->lastdiffacc; } } @@ -973,7 +978,12 @@ void workerstatus_ready() &(sharesummary->lastshare))) { copy_tv(&(workerstatus->last_share), &(sharesummary->lastshare)); - workerstatus->last_diff = + } + if (tv_newer(&(workerstatus->last_share_acc), + &(sharesummary->lastshareacc))) { + copy_tv(&(workerstatus->last_share_acc), + &(sharesummary->lastshareacc)); + workerstatus->last_diff_acc = sharesummary->lastdiffacc; } } @@ -1017,10 +1027,8 @@ void _workerstatus_update(AUTHS *auths, SHARES *shares, if (item) { DATA_WORKERSTATUS(row, item); K_WLOCK(workerstatus_free); - if (tv_newer(&(row->last_share), &(shares->createdate))) { + if (tv_newer(&(row->last_share), &(shares->createdate))) copy_tv(&(row->last_share), &(shares->createdate)); - row->last_diff = shares->diff; - } if (row->active_start.tv_sec == 0) copy_tv(&(row->active_start), &(shares->createdate)); switch (shares->errn) { @@ -1029,6 +1037,12 @@ void _workerstatus_update(AUTHS *auths, SHARES *shares, row->block_shareacc++; row->active_diffacc += shares->diff; row->active_shareacc++; + if (tv_newer(&(row->last_share_acc), + &(shares->createdate))) { + copy_tv(&(row->last_share_acc), + &(shares->createdate)); + row->last_diff_acc = shares->diff; + } break; case SE_STALE: row->block_diffinv += shares->diff; @@ -2118,7 +2132,8 @@ bool workinfo_age(int64_t workinfoid, char *poolinstance, char *by, char *code, error[0] = '\0'; skipupdate = false; /* Reloading during a confirm will not have any old data - * so finding an aged sharesummary here is an error */ + * so finding an aged sharesummary here is an error + * N.B. this can only happen with (very) old reload files */ if (reloading) { if (sharesummary->complete[0] == SUMMARY_COMPLETE) { ss_already++; @@ -2134,7 +2149,7 @@ bool workinfo_age(int64_t workinfoid, char *poolinstance, char *by, char *code, } if (!skipupdate) { - if (!sharesummary_update(NULL, NULL, ss_item, by, code, inet, cd)) { + if (!sharesummary_age(ss_item, by, code, inet, cd)) { ss_failed++; LOGERR("%s(): Failed to age sharesummary %"PRId64"/%s/%"PRId64, __func__, sharesummary->userid, @@ -2364,17 +2379,17 @@ cmp_t cmp_sharesummary_workinfoid(K_ITEM *a, K_ITEM *b) return c; } -void zero_sharesummary(SHARESUMMARY *row, tv_t *cd, double diff) +void zero_sharesummary(SHARESUMMARY *row) { row->diffacc = row->diffsta = row->diffdup = row->diffhi = row->diffrej = row->shareacc = row->sharesta = row->sharedup = row->sharehi = row->sharerej = 0.0; row->sharecount = row->errorcount = 0; - row->firstshare.tv_sec = cd->tv_sec; - row->firstshare.tv_usec = cd->tv_usec; - row->lastshare.tv_sec = row->firstshare.tv_sec; - row->lastshare.tv_usec = row->firstshare.tv_usec; - row->lastdiffacc = diff; + DATE_ZERO(&(row->firstshare)); + DATE_ZERO(&(row->lastshare)); + DATE_ZERO(&(row->firstshareacc)); + DATE_ZERO(&(row->lastshareacc)); + row->lastdiffacc = 0; row->complete[0] = SUMMARY_NEW; row->complete[1] = '\0'; } @@ -3690,7 +3705,7 @@ bool process_pplns(int32_t height, char *blockhash, tv_t *addr_cd) if (ss_item) end_workinfoid = sharesummary->workinfoid; /* Add up all sharesummaries until >= diff_want - * also record the latest lastshare - that will be the end pplns time + * also record the latest lastshareacc - that will be the end pplns time * which will be >= blocks->blockcreatedate */ while (total_diff < diff_want && ss_item) { switch (sharesummary->complete[0]) { @@ -3723,10 +3738,8 @@ bool process_pplns(int32_t height, char *blockhash, tv_t *addr_cd) acc_share_count += sharesummary->shareacc; total_diff += sharesummary->diffacc; begin_workinfoid = sharesummary->workinfoid; - // TODO: add lastshareacc to sharesummary and markersummary - if (sharesummary->shareacc > 0 && - tv_newer(&end_tv, &(sharesummary->lastshare))) - copy_tv(&end_tv, &(sharesummary->lastshare)); + if (tv_newer(&end_tv, &(sharesummary->lastshareacc))) + copy_tv(&end_tv, &(sharesummary->lastshareacc)); mu_root = upd_add_mu(mu_root, mu_store, sharesummary->userid, sharesummary->diffacc); @@ -3760,10 +3773,8 @@ bool process_pplns(int32_t height, char *blockhash, tv_t *addr_cd) total_share_count += sharesummary->sharecount; acc_share_count += sharesummary->shareacc; total_diff += sharesummary->diffacc; - // TODO: add lastshareacc to sharesummary and markersummary - if (sharesummary->shareacc > 0 && - tv_newer(&end_tv, &(sharesummary->lastshare))) - copy_tv(&end_tv, &(sharesummary->lastshare)); + if (tv_newer(&end_tv, &(sharesummary->lastshareacc))) + copy_tv(&end_tv, &(sharesummary->lastshareacc)); mu_root = upd_add_mu(mu_root, mu_store, sharesummary->userid, sharesummary->diffacc); @@ -3812,9 +3823,8 @@ bool process_pplns(int32_t height, char *blockhash, tv_t *addr_cd) acc_share_count += markersummary->shareacc; total_diff += markersummary->diffacc; begin_workinfoid = workmarkers->workinfoidstart; - if (markersummary->shareacc > 0 && - tv_newer(&end_tv, &(markersummary->lastshare))) - copy_tv(&end_tv, &(markersummary->lastshare)); + if (tv_newer(&end_tv, &(markersummary->lastshareacc))) + copy_tv(&end_tv, &(markersummary->lastshareacc)); mu_root = upd_add_mu(mu_root, mu_store, markersummary->userid, markersummary->diffacc); diff --git a/src/ckdb_dbio.c b/src/ckdb_dbio.c index d4a91555..23abdbed 100644 --- a/src/ckdb_dbio.c +++ b/src/ckdb_dbio.c @@ -2993,9 +2993,8 @@ static bool shares_process(PGconn *conn, SHARES *shares, K_TREE *trf_root) userinfo_update(shares, NULL, NULL); } - sharesummary_update(shares, NULL, NULL, shares->createby, - shares->createcode, shares->createinet, - &(shares->createdate)); + sharesummary_update(shares, NULL, shares->createby, shares->createcode, + shares->createinet, &(shares->createdate)); return true; } @@ -3288,10 +3287,8 @@ static bool shareerrors_process(PGconn *conn, SHAREERRORS *shareerrors, } } - sharesummary_update(NULL, shareerrors, NULL, - shareerrors->createby, - shareerrors->createcode, - shareerrors->createinet, + sharesummary_update(NULL, shareerrors, shareerrors->createby, + shareerrors->createcode, shareerrors->createinet, &(shareerrors->createdate)); return true; @@ -3541,9 +3538,17 @@ static void markersummary_to_pool(MARKERSUMMARY *p_row, MARKERSUMMARY *row) !tv_newer(&(p_row->firstshare), &(row->firstshare))) { copy_tv(&(p_row->firstshare), &(row->firstshare)); } - if (tv_newer(&(p_row->lastshare), &(row->lastshare))) { + if (tv_newer(&(p_row->lastshare), &(row->lastshare))) copy_tv(&(p_row->lastshare), &(row->lastshare)); - p_row->lastdiffacc = row->lastdiffacc; + if (row->diffacc > 0) { + if (!p_row->firstshareacc.tv_sec || + !tv_newer(&(p_row->firstshareacc), &(row->firstshareacc))) { + copy_tv(&(p_row->firstshareacc), &(row->firstshareacc)); + } + if (tv_newer(&(p_row->lastshareacc), &(row->lastshareacc))) { + copy_tv(&(p_row->lastshareacc), &(row->lastshareacc)); + p_row->lastdiffacc = row->lastdiffacc; + } } } @@ -3553,7 +3558,7 @@ static void markersummary_to_pool(MARKERSUMMARY *p_row, MARKERSUMMARY *row) * so that is probably the best solution since * we should be watching the pool all the time :) * The cause would most likely be either a code bug or a DB problem - * so there many be no obvious automated fix + * so there may be no obvious automated fix * and flagging the workmarkers to be skipped may or may not be the solution, * thus manual intervention will be the rule for now */ bool sharesummaries_to_markersummaries(PGconn *conn, WORKMARKERS *workmarkers, @@ -3686,9 +3691,17 @@ bool sharesummaries_to_markersummaries(PGconn *conn, WORKMARKERS *workmarkers, !tv_newer(&(markersummary->firstshare), &(sharesummary->firstshare))) { copy_tv(&(markersummary->firstshare), &(sharesummary->firstshare)); } - if (tv_newer(&(markersummary->lastshare), &(sharesummary->lastshare))) { + if (tv_newer(&(markersummary->lastshare), &(sharesummary->lastshare))) copy_tv(&(markersummary->lastshare), &(sharesummary->lastshare)); - markersummary->lastdiffacc = sharesummary->lastdiffacc; + if (sharesummary->diffacc > 0) { + if (!markersummary->firstshareacc.tv_sec || + !tv_newer(&(markersummary->firstshareacc), &(sharesummary->firstshareacc))) { + copy_tv(&(markersummary->firstshareacc), &(sharesummary->firstshareacc)); + } + if (tv_newer(&(markersummary->lastshareacc), &(sharesummary->lastshareacc))) { + copy_tv(&(markersummary->lastshareacc), &(sharesummary->lastshareacc)); + markersummary->lastdiffacc = sharesummary->lastdiffacc; + } } diffacc += sharesummary->diffacc; @@ -3844,50 +3857,29 @@ flail: return ok; } -// no longer used -#if 0 -static void sharesummary_to_pool(SHARESUMMARY *p_row, SHARESUMMARY *row) -{ - p_row->diffacc += row->diffacc; - p_row->diffsta += row->diffsta; - p_row->diffdup += row->diffdup; - p_row->diffhi += row->diffhi; - p_row->diffrej += row->diffrej; - p_row->shareacc += row->shareacc; - p_row->sharesta += row->sharesta; - p_row->sharedup += row->sharedup; - p_row->sharehi += row->sharehi; - p_row->sharerej += row->sharerej; - p_row->sharecount += row->sharecount; - p_row->errorcount += row->errorcount; - if (!p_row->firstshare.tv_sec || - !tv_newer(&(p_row->firstshare), &(row->firstshare))) { - copy_tv(&(p_row->firstshare), &(row->firstshare)); - } - if (tv_newer(&(p_row->lastshare), &(row->lastshare))) { - copy_tv(&(p_row->lastshare), &(row->lastshare)); - p_row->lastdiffacc = row->lastdiffacc; - } -} -#endif - static void set_sharesummary_stats(SHARESUMMARY *row, SHARES *s_row, SHAREERRORS *e_row, bool new, double *tdf, double *tdl) { tv_t *createdate; - double diff; - if (s_row) { + if (s_row) createdate = &(s_row->createdate); - diff = s_row->diff; - } else { + else createdate = &(e_row->createdate); - diff = 0; - } - if (new) - zero_sharesummary(row, createdate, diff); + if (new) { + zero_sharesummary(row); + copy_tv(&(row->firstshare), createdate); + copy_tv(&(row->lastshare), createdate); + } else { + if (!row->firstshare.tv_sec || + !tv_newer(&(row->firstshare), createdate)) { + copy_tv(&(row->firstshare), createdate); + } + if (tv_newer(&(row->lastshare), createdate)) + copy_tv(&(row->lastshare), createdate); + } if (s_row) { row->sharecount += 1; @@ -3895,6 +3887,17 @@ static void set_sharesummary_stats(SHARESUMMARY *row, SHARES *s_row, case SE_NONE: row->diffacc += s_row->diff; row->shareacc++; + // should always be true + if (s_row->diff > 0) { + if (!row->firstshareacc.tv_sec || + !tv_newer(&(row->firstshareacc), createdate)) { + copy_tv(&(row->firstshareacc), createdate); + } + if (tv_newer(&(row->lastshareacc), createdate)) { + copy_tv(&(row->lastshareacc), createdate); + row->lastdiffacc = s_row->diff; + } + } break; case SE_STALE: row->diffsta += s_row->diff; @@ -3916,15 +3919,10 @@ static void set_sharesummary_stats(SHARESUMMARY *row, SHARES *s_row, } else row->errorcount += 1; + // Only if required if (!new) { *tdf = tvdiff(createdate, &(row->firstshare)); - if (*tdf < 0.0) - copy_tv(&(row->firstshare), createdate); *tdl = tvdiff(createdate, &(row->lastshare)); - if (*tdl >= 0.0) { - copy_tv(&(row->lastshare), createdate); - row->lastdiffacc = diff; - } } } @@ -3946,176 +3944,159 @@ char *ooo_status(char *buf, size_t siz) } // No longer stored in the DB but fields are updated as before -bool _sharesummary_update(SHARES *s_row, SHAREERRORS *e_row, K_ITEM *ss_item, - char *by, char *code, char *inet, tv_t *cd, - WHERE_FFL_ARGS) +bool _sharesummary_update(SHARES *s_row, SHAREERRORS *e_row, char *by, + char *code, char *inet, tv_t *cd, WHERE_FFL_ARGS) { WORKMARKERS *wm; SHARESUMMARY *row, *p_row; - K_ITEM *item, *wm_item, *p_item = NULL; + K_ITEM *ss_item, *wm_item, *p_item = NULL; bool new = false, p_new = false; int64_t userid, workinfoid; char *workername; - tv_t *createdate; char *st = NULL, *db = NULL; char ooo_buf[256]; double tdf, tdl; LOGDEBUG("%s(): update", __func__); - // this will never be a pool_ summary - if (ss_item) { - if (s_row || e_row) { - quithere(1, "ERR: only one of s_row, e_row and " - "ss_item allowed" WHERE_FFL, + if (s_row) { + if (e_row) { + quithere(1, "ERR: only one of s_row and e_row allowed" + WHERE_FFL, WHERE_FFL_PASS); } - item = ss_item; - DATA_SHARESUMMARY(row, item); - row->complete[0] = SUMMARY_COMPLETE; - row->complete[1] = '\0'; + userid = s_row->userid; + workername = s_row->workername; + workinfoid = s_row->workinfoid; } else { - if (s_row) { - if (e_row) { - quithere(1, "ERR: only one of s_row, e_row " - "(and ss_item) allowed" WHERE_FFL, - WHERE_FFL_PASS); - } - userid = s_row->userid; - workername = s_row->workername; - workinfoid = s_row->workinfoid; - createdate = &(s_row->createdate); - } else { - if (!e_row) { - quithere(1, "ERR: all s_row, e_row and " - "ss_item are NULL" WHERE_FFL, - WHERE_FFL_PASS); - } - userid = e_row->userid; - workername = e_row->workername; - workinfoid = e_row->workinfoid; - createdate = &(e_row->createdate); - } - - K_RLOCK(workmarkers_free); - wm_item = find_workmarkers(workinfoid, false, MARKER_PROCESSED, - NULL); - K_RUNLOCK(workmarkers_free); - if (wm_item) { - DATA_WORKMARKERS(wm, wm_item); - LOGERR("%s(): attempt to update sharesummary " - "with %s %"PRId64"/%"PRId64"/%s "CDDB" %s" - " but processed workmarkers %"PRId64" exists", - __func__, s_row ? "shares" : "shareerrors", - workinfoid, userid, st = safe_text(workername), - db = ctv_to_buf(createdate, NULL, 0), - wm->markerid); - FREENULL(st); - FREENULL(db); - return false; + if (!e_row) { + quithere(1, "ERR: both s_row and e_row are NULL" + WHERE_FFL, + WHERE_FFL_PASS); } + userid = e_row->userid; + workername = e_row->workername; + workinfoid = e_row->workinfoid; + } + + K_RLOCK(workmarkers_free); + wm_item = find_workmarkers(workinfoid, false, MARKER_PROCESSED, + NULL); + K_RUNLOCK(workmarkers_free); + if (wm_item) { + DATA_WORKMARKERS(wm, wm_item); + LOGERR("%s(): attempt to update sharesummary " + "with %s %"PRId64"/%"PRId64"/%s "CDDB" %s" + " but processed workmarkers %"PRId64" exists", + __func__, s_row ? "shares" : "shareerrors", + workinfoid, userid, st = safe_text(workername), + db = ctv_to_buf(cd, NULL, 0), + wm->markerid); + FREENULL(st); + FREENULL(db); + return false; + } - K_RLOCK(sharesummary_free); - item = find_sharesummary(userid, workername, workinfoid); - p_item = find_sharesummary_p(workinfoid); - K_RUNLOCK(sharesummary_free); + K_RLOCK(sharesummary_free); + ss_item = find_sharesummary(userid, workername, workinfoid); + p_item = find_sharesummary_p(workinfoid); + K_RUNLOCK(sharesummary_free); - if (item) { - DATA_SHARESUMMARY(row, item); - } else { - new = true; - K_WLOCK(sharesummary_free); - item = k_unlink_head(sharesummary_free); - K_WUNLOCK(sharesummary_free); - DATA_SHARESUMMARY(row, item); - bzero(row, sizeof(*row)); - row->userid = userid; - DUP_POINTER(sharesummary_free, row->workername, - workername); - row->workinfoid = workinfoid; - } + if (ss_item) { + DATA_SHARESUMMARY(row, ss_item); + } else { + new = true; + K_WLOCK(sharesummary_free); + ss_item = k_unlink_head(sharesummary_free); + K_WUNLOCK(sharesummary_free); + DATA_SHARESUMMARY(row, ss_item); + bzero(row, sizeof(*row)); + row->userid = userid; + DUP_POINTER(sharesummary_free, row->workername, + workername); + row->workinfoid = workinfoid; + } - // N.B. this directly updates the non-key data - set_sharesummary_stats(row, s_row, e_row, new, &tdf, &tdl); - - if (!new) { - // don't LOG '=' in case shares come from ckpool with the same timestamp - if (tdf < 0.0) { - char *tmp1, *tmp2; - int level = LOG_DEBUG; - // WARNING for shares exceeding the OOOLIMIT but not during startup - if (tdf < OOOLIMIT) { - ooof++; - if (startup_complete) - level = LOG_WARNING; - } else - ooof0++; - LOGMSG(level, "%s(): OoO %s "CDDB" (%s) is < summary" - " firstshare (%s) (%s)", - __func__, s_row ? "shares" : "shareerrors", - (tmp1 = ctv_to_buf(createdate, NULL, 0)), - (tmp2 = ctv_to_buf(&(row->firstshare), NULL, 0)), - ooo_status(ooo_buf, sizeof(ooo_buf))); - free(tmp2); - free(tmp1); - } + // N.B. this directly updates the non-key data + set_sharesummary_stats(row, s_row, e_row, new, &tdf, &tdl); - // don't LOG '=' in case shares come from ckpool with the same timestamp - if (tdl < 0.0) { - char *tmp1, *tmp2; - int level = LOG_DEBUG; - // WARNING for shares exceeding the OOOLIMIT but not during startup - if (tdl < OOOLIMIT) { - oool++; - if (startup_complete) - level = LOG_WARNING; - } else - oool0++; - LOGMSG(level, "%s(): OoO %s "CDDB" (%s) is < summary" - " lastshare (%s) (%s)", - __func__, s_row ? "shares" : "shareerrors", - (tmp1 = ctv_to_buf(createdate, NULL, 0)), - (tmp2 = ctv_to_buf(&(row->lastshare), NULL, 0)), - ooo_status(ooo_buf, sizeof(ooo_buf))); - free(tmp2); - free(tmp1); - } + if (!new) { + // don't LOG '=' in case shares come from ckpool with the same timestamp + if (tdf < 0.0) { + char *tmp1, *tmp2; + int level = LOG_DEBUG; + // WARNING for shares exceeding the OOOLIMIT but not during startup + if (tdf < OOOLIMIT) { + ooof++; + if (startup_complete) + level = LOG_WARNING; + } else + ooof0++; + LOGMSG(level, "%s(): OoO %s "CDDB" (%s) is < summary" + " firstshare (%s) (%s)", + __func__, s_row ? "shares" : "shareerrors", + (tmp1 = ctv_to_buf(cd, NULL, 0)), + (tmp2 = ctv_to_buf(&(row->firstshare), NULL, 0)), + ooo_status(ooo_buf, sizeof(ooo_buf))); + free(tmp2); + free(tmp1); + } - if (row->complete[0] != SUMMARY_NEW) { - LOGDEBUG("%s(): updating sharesummary not '%c'" - " %"PRId64"/%s/%"PRId64"/%s", - __func__, SUMMARY_NEW, row->userid, - st = safe_text_nonull(row->workername), - row->workinfoid, row->complete); - FREENULL(st); - } + // don't LOG '=' in case shares come from ckpool with the same timestamp + if (tdl < 0.0) { + char *tmp1, *tmp2; + int level = LOG_DEBUG; + // WARNING for shares exceeding the OOOLIMIT but not during startup + if (tdl < OOOLIMIT) { + oool++; + if (startup_complete) + level = LOG_WARNING; + } else + oool0++; + LOGMSG(level, "%s(): OoO %s "CDDB" (%s) is < summary" + " lastshare (%s) (%s)", + __func__, s_row ? "shares" : "shareerrors", + (tmp1 = ctv_to_buf(cd, NULL, 0)), + (tmp2 = ctv_to_buf(&(row->lastshare), NULL, 0)), + ooo_status(ooo_buf, sizeof(ooo_buf))); + free(tmp2); + free(tmp1); } - if (p_item) { - DATA_SHARESUMMARY(p_row, p_item); - } else { - p_new = true; - K_WLOCK(sharesummary_free); - p_item = k_unlink_head(sharesummary_free); - K_WUNLOCK(sharesummary_free); - DATA_SHARESUMMARY(p_row, p_item); - bzero(p_row, sizeof(*p_row)); - POOL_SS(p_row); - p_row->workinfoid = workinfoid; + if (row->complete[0] != SUMMARY_NEW) { + LOGDEBUG("%s(): updating sharesummary not '%c'" + " %"PRId64"/%s/%"PRId64"/%s", + __func__, SUMMARY_NEW, row->userid, + st = safe_text_nonull(row->workername), + row->workinfoid, row->complete); + FREENULL(st); } + } - set_sharesummary_stats(p_row, s_row, e_row, p_new, &tdf, &tdl); + if (p_item) { + DATA_SHARESUMMARY(p_row, p_item); + } else { + p_new = true; + K_WLOCK(sharesummary_free); + p_item = k_unlink_head(sharesummary_free); + K_WUNLOCK(sharesummary_free); + DATA_SHARESUMMARY(p_row, p_item); + bzero(p_row, sizeof(*p_row)); + POOL_SS(p_row); + p_row->workinfoid = workinfoid; } + set_sharesummary_stats(p_row, s_row, e_row, p_new, &tdf, &tdl); + MODIFYDATEPOINTERS(sharesummary_free, row, cd, by, code, inet); // Store either new item if (new || p_new) { K_WLOCK(sharesummary_free); if (new) { - add_to_ktree(sharesummary_root, item); - add_to_ktree(sharesummary_workinfoid_root, item); - k_add_head(sharesummary_store, item); + add_to_ktree(sharesummary_root, ss_item); + add_to_ktree(sharesummary_workinfoid_root, ss_item); + k_add_head(sharesummary_store, ss_item); } if (p_new) { add_to_ktree(sharesummary_pool_root, p_item); @@ -4127,6 +4108,23 @@ bool _sharesummary_update(SHARES *s_row, SHAREERRORS *e_row, K_ITEM *ss_item, return true; } +// No key fields are modified +bool _sharesummary_age(K_ITEM *ss_item, char *by, char *code, char *inet, + tv_t *cd, WHERE_FFL_ARGS) +{ + SHARESUMMARY *row; + + LOGDEBUG("%s(): update", __func__); + + DATA_SHARESUMMARY(row, ss_item); + row->complete[0] = SUMMARY_COMPLETE; + row->complete[1] = '\0'; + + MODIFYDATEPOINTERS(sharesummary_free, row, cd, by, code, inet); + + return true; +} + bool blocks_stats(PGconn *conn, int32_t height, char *blockhash, double diffacc, double diffinv, double shareacc, double shareinv, int64_t elapsed, @@ -6263,7 +6261,7 @@ bool markersummary_add(PGconn *conn, K_ITEM *ms_item, char *by, char *code, bool conned = false; PGresult *res; MARKERSUMMARY *row; - char *params[18 + MODIFYDATECOUNT]; + char *params[20 + MODIFYDATECOUNT]; int n, par = 0; char *ins; bool ok = false; @@ -6294,6 +6292,8 @@ bool markersummary_add(PGconn *conn, K_ITEM *ms_item, char *by, char *code, params[par++] = bigint_to_buf(row->errorcount, NULL, 0); params[par++] = tv_to_buf(&(row->firstshare), NULL, 0); params[par++] = tv_to_buf(&(row->lastshare), NULL, 0); + params[par++] = tv_to_buf(&(row->firstshareacc), NULL, 0); + params[par++] = tv_to_buf(&(row->lastshareacc), NULL, 0); params[par++] = double_to_buf(row->lastdiffacc, NULL, 0); MODIFYDATEPARAMS(params, par, row); PARCHK(par, params); @@ -6301,7 +6301,8 @@ bool markersummary_add(PGconn *conn, K_ITEM *ms_item, char *by, char *code, ins = "insert into markersummary " "(markerid,userid,workername,diffacc,diffsta,diffdup,diffhi," "diffrej,shareacc,sharesta,sharedup,sharehi,sharerej," - "sharecount,errorcount,firstshare,lastshare,lastdiffacc" + "sharecount,errorcount,firstshare,lastshare,firstshareacc," + "lastshareacc,lastdiffacc" MODIFYDATECONTROL ") values (" PQPARAM26 ")"; LOGDEBUG("%s() adding ms %"PRId64"/%"PRId64"/%s/%.0f", @@ -6344,7 +6345,7 @@ bool markersummary_fill(PGconn *conn) MARKERSUMMARY *row, *p_row; char *field; char *sel; - int fields = 18; + int fields = 20; bool ok; LOGDEBUG("%s(): select", __func__); @@ -6356,8 +6357,8 @@ bool markersummary_fill(PGconn *conn) sel = "select " "markerid,userid,workername,diffacc,diffsta,diffdup,diffhi," "diffrej,shareacc,sharesta,sharedup,sharehi,sharerej," - "sharecount,errorcount,firstshare,lastshare," - "lastdiffacc" + "sharecount,errorcount,firstshare,lastshare,firstshareacc," + "lastshareacc,lastdiffacc" MODIFYDATECONTROL " from markersummary"; res = PQexec(conn, sel, CKPQ_READ); @@ -6476,6 +6477,16 @@ bool markersummary_fill(PGconn *conn) break; TXT_TO_TV("lastshare", field, row->lastshare); + PQ_GET_FLD(res, i, "firstshareacc", field, ok); + if (!ok) + break; + TXT_TO_TV("firstshareacc", field, row->firstshareacc); + + PQ_GET_FLD(res, i, "lastshareacc", field, ok); + if (!ok) + break; + TXT_TO_TV("lastshareacc", field, row->lastshareacc); + PQ_GET_FLD(res, i, "lastdiffacc", field, ok); if (!ok) break; @@ -6485,6 +6496,16 @@ bool markersummary_fill(PGconn *conn) if (!ok) break; + /* Save having to do this everywhere in the code for old data + * It's not always accurate, but soon after when it's not, + * and also what was used before the 2 fields were added */ + if (row->diffacc > 0) { + if (row->firstshareacc.tv_sec == 0L) + copy_tv(&(row->firstshareacc), &(row->firstshare)); + if (row->lastshareacc.tv_sec == 0L) + copy_tv(&(row->lastshareacc), &(row->lastshare)); + } + add_to_ktree(markersummary_root, item); add_to_ktree(markersummary_userid_root, item); k_add_head(markersummary_store, item);