Browse Source

ckdb - during a reload, do all blocks and ignore errors based on the block number

master
kanoi 9 years ago
parent
commit
8577384fed
  1. 3
      src/ckdb.c
  2. 5
      src/ckdb.h
  3. 17
      src/ckdb_btc.c
  4. 45
      src/ckdb_cmd.c
  5. 17
      src/ckdb_dbio.c

3
src/ckdb.c

@ -826,7 +826,8 @@ static bool reload()
tv_to_buf(&(dbstatus.newest_createdate_poolstats), buf, sizeof(buf)); tv_to_buf(&(dbstatus.newest_createdate_poolstats), buf, sizeof(buf));
LOGWARNING("%s(): %s newest DB poolstats (ignored)", __func__, buf); LOGWARNING("%s(): %s newest DB poolstats (ignored)", __func__, buf);
tv_to_buf(&(dbstatus.newest_createdate_blocks), buf, sizeof(buf)); tv_to_buf(&(dbstatus.newest_createdate_blocks), buf, sizeof(buf));
LOGWARNING("%s(): %s newest DB blocks (ignored)", __func__, buf); LOGWARNING("%s(): %"PRId32"/%s newest DB blocks (ignored)",
__func__, dbstatus.newest_height_blocks, buf);
copy_tv(&start, &(dbstatus.newest_createdate_workmarker_workinfo)); copy_tv(&start, &(dbstatus.newest_createdate_workmarker_workinfo));
reason = "workmarkers"; reason = "workmarkers";

5
src/ckdb.h

@ -55,7 +55,7 @@
#define DB_VLOCK "1" #define DB_VLOCK "1"
#define DB_VERSION "1.0.3" #define DB_VERSION "1.0.3"
#define CKDB_VERSION DB_VERSION"-1.340" #define CKDB_VERSION DB_VERSION"-1.350"
#define WHERE_FFL " - from %s %s() line %d" #define WHERE_FFL " - from %s %s() line %d"
#define WHERE_FFL_HERE __FILE__, __func__, __LINE__ #define WHERE_FFL_HERE __FILE__, __func__, __LINE__
@ -138,6 +138,7 @@ typedef struct loadstatus {
tv_t newest_createdate_workinfo; tv_t newest_createdate_workinfo;
tv_t newest_createdate_poolstats; tv_t newest_createdate_poolstats;
tv_t newest_createdate_blocks; tv_t newest_createdate_blocks;
int32_t newest_height_blocks;
} LOADSTATUS; } LOADSTATUS;
extern LOADSTATUS dbstatus; extern LOADSTATUS dbstatus;
@ -2545,7 +2546,7 @@ extern bool blocks_stats(PGconn *conn, int32_t height, char *blockhash,
double diffacc, double diffinv, double shareacc, double diffacc, double diffinv, double shareacc,
double shareinv, int64_t elapsed, double shareinv, int64_t elapsed,
char *by, char *code, char *inet, tv_t *cd); char *by, char *code, char *inet, tv_t *cd);
extern bool blocks_add(PGconn *conn, char *height, char *blockhash, extern bool blocks_add(PGconn *conn, int32_t height, char *blockhash,
char *confirmed, char *info, char *workinfoid, char *confirmed, char *info, char *workinfoid,
char *username, char *workername, char *clientid, char *username, char *workername, char *clientid,
char *enonce1, char *nonce2, char *nonce, char *reward, char *enonce1, char *nonce2, char *nonce, char *reward,

17
src/ckdb_btc.c

@ -308,7 +308,6 @@ bool btc_valid_address(char *addr)
void btc_blockstatus(BLOCKS *blocks) void btc_blockstatus(BLOCKS *blocks)
{ {
char hash[TXT_BIG+1]; char hash[TXT_BIG+1];
char height_str[32];
char *blockhash; char *blockhash;
int32_t confirms; int32_t confirms;
size_t len; size_t len;
@ -348,14 +347,12 @@ void btc_blockstatus(BLOCKS *blocks)
return; return;
if (strcmp(blockhash, hash) != 0) { if (strcmp(blockhash, hash) != 0) {
snprintf(height_str, sizeof(height_str), "%d", blocks->height); LOGERR("%s() flagging block %d as %s pool=%s btc=%s",
LOGERR("%s() flagging block %d(%s) as %s pool=%s btc=%s", __func__, blocks->height,
__func__,
blocks->height, height_str,
blocks_confirmed(BLOCKS_ORPHAN_STR), blocks_confirmed(BLOCKS_ORPHAN_STR),
hash, blockhash); hash, blockhash);
ok = blocks_add(NULL, height_str, ok = blocks_add(NULL, blocks->height,
blocks->blockhash, blocks->blockhash,
BLOCKS_ORPHAN_STR, EMPTY, BLOCKS_ORPHAN_STR, EMPTY,
EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
@ -371,14 +368,12 @@ void btc_blockstatus(BLOCKS *blocks)
confirms = btc_confirms(hash); confirms = btc_confirms(hash);
if (confirms >= BLOCKS_42_VALUE) { if (confirms >= BLOCKS_42_VALUE) {
snprintf(height_str, sizeof(height_str), "%d", blocks->height); LOGERR("%s() flagging block %d as %s confirms=%d(%d)",
LOGERR("%s() flagging block %d(%s) as %s confirms=%d(%d)", __func__, blocks->height,
__func__,
blocks->height, height_str,
blocks_confirmed(BLOCKS_42_STR), blocks_confirmed(BLOCKS_42_STR),
confirms, BLOCKS_42_VALUE); confirms, BLOCKS_42_VALUE);
ok = blocks_add(NULL, height_str, ok = blocks_add(NULL, blocks->height,
blocks->blockhash, blocks->blockhash,
BLOCKS_42_STR, EMPTY, BLOCKS_42_STR, EMPTY,
EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,

45
src/ckdb_cmd.c

@ -1387,8 +1387,8 @@ redo:
return buf; return buf;
} }
static char *cmd_blockstatus(__maybe_unused PGconn *conn, char *cmd, char *id, static char *cmd_blockstatus(PGconn *conn, char *cmd, char *id, tv_t *now,
tv_t *now, char *by, char *code, char *inet, char *by, char *code, char *inet,
__maybe_unused tv_t *cd, K_TREE *trf_root) __maybe_unused tv_t *cd, K_TREE *trf_root)
{ {
K_ITEM *i_height, *i_blockhash, *i_action, *i_info; K_ITEM *i_height, *i_blockhash, *i_action, *i_info;
@ -1437,7 +1437,7 @@ static char *cmd_blockstatus(__maybe_unused PGconn *conn, char *cmd, char *id,
switch (blocks->confirmed[0]) { switch (blocks->confirmed[0]) {
case BLOCKS_NEW: case BLOCKS_NEW:
case BLOCKS_CONFIRM: case BLOCKS_CONFIRM:
ok = blocks_add(conn, transfer_data(i_height), ok = blocks_add(conn, height,
blocks->blockhash, blocks->blockhash,
BLOCKS_ORPHAN_STR, info, BLOCKS_ORPHAN_STR, info,
EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
@ -1478,7 +1478,7 @@ static char *cmd_blockstatus(__maybe_unused PGconn *conn, char *cmd, char *id,
case BLOCKS_CONFIRM: case BLOCKS_CONFIRM:
case BLOCKS_ORPHAN: case BLOCKS_ORPHAN:
case BLOCKS_REJECT: case BLOCKS_REJECT:
ok = blocks_add(conn, transfer_data(i_height), ok = blocks_add(conn, height,
blocks->blockhash, blocks->blockhash,
BLOCKS_REJECT_STR, info, BLOCKS_REJECT_STR, info,
EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
@ -1507,7 +1507,7 @@ static char *cmd_blockstatus(__maybe_unused PGconn *conn, char *cmd, char *id,
// Confirm a new block that wasn't confirmed due to some bug // Confirm a new block that wasn't confirmed due to some bug
switch (blocks->confirmed[0]) { switch (blocks->confirmed[0]) {
case BLOCKS_NEW: case BLOCKS_NEW:
ok = blocks_add(conn, transfer_data(i_height), ok = blocks_add(conn, height,
blocks->blockhash, blocks->blockhash,
BLOCKS_CONFIRM_STR, info, BLOCKS_CONFIRM_STR, info,
EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
@ -2644,13 +2644,13 @@ awconf:
} }
// TODO: the confirm update: identify block changes from workinfo height? // TODO: the confirm update: identify block changes from workinfo height?
static char *cmd_blocks_do(PGconn *conn, char *cmd, char *id, char *by, static char *cmd_blocks_do(PGconn *conn, char *cmd, int32_t height, char *id,
char *code, char *inet, tv_t *cd, bool igndup, char *by, char *code, char *inet, tv_t *cd,
K_TREE *trf_root) bool igndup, K_TREE *trf_root)
{ {
char reply[1024] = ""; char reply[1024] = "";
size_t siz = sizeof(reply); size_t siz = sizeof(reply);
K_ITEM *i_height, *i_blockhash, *i_confirmed, *i_workinfoid, *i_username; K_ITEM *i_blockhash, *i_confirmed, *i_workinfoid, *i_username;
K_ITEM *i_workername, *i_clientid, *i_enonce1, *i_nonce2, *i_nonce, *i_reward; K_ITEM *i_workername, *i_clientid, *i_enonce1, *i_nonce2, *i_nonce, *i_reward;
TRANSFER *transfer; TRANSFER *transfer;
char *msg; char *msg;
@ -2658,10 +2658,6 @@ static char *cmd_blocks_do(PGconn *conn, char *cmd, char *id, char *by,
LOGDEBUG("%s(): cmd '%s'", __func__, cmd); LOGDEBUG("%s(): cmd '%s'", __func__, cmd);
i_height = require_name(trf_root, "height", 1, NULL, reply, siz);
if (!i_height)
return strdup(reply);
i_blockhash = require_name(trf_root, "blockhash", 1, NULL, reply, siz); i_blockhash = require_name(trf_root, "blockhash", 1, NULL, reply, siz);
if (!i_blockhash) if (!i_blockhash)
return strdup(reply); return strdup(reply);
@ -2707,7 +2703,7 @@ static char *cmd_blocks_do(PGconn *conn, char *cmd, char *id, char *by,
return strdup(reply); return strdup(reply);
msg = "added"; msg = "added";
ok = blocks_add(conn, transfer_data(i_height), ok = blocks_add(conn, height,
transfer_data(i_blockhash), transfer_data(i_blockhash),
transfer_data(i_confirmed), transfer_data(i_confirmed),
EMPTY, EMPTY,
@ -2724,7 +2720,7 @@ static char *cmd_blocks_do(PGconn *conn, char *cmd, char *id, char *by,
break; break;
case BLOCKS_CONFIRM: case BLOCKS_CONFIRM:
msg = "confirmed"; msg = "confirmed";
ok = blocks_add(conn, transfer_data(i_height), ok = blocks_add(conn, height,
transfer_data(i_blockhash), transfer_data(i_blockhash),
transfer_data(i_confirmed), transfer_data(i_confirmed),
EMPTY, EMPTY,
@ -2757,17 +2753,28 @@ static char *cmd_blocks(PGconn *conn, char *cmd, char *id,
char *code, char *inet, tv_t *cd, char *code, char *inet, tv_t *cd,
K_TREE *trf_root) K_TREE *trf_root)
{ {
char reply[1024] = "";
size_t siz = sizeof(reply);
bool igndup = false; bool igndup = false;
K_ITEM *i_height;
int32_t height;
LOGDEBUG("%s(): cmd '%s'", __func__, cmd);
i_height = require_name(trf_root, "height", 1, NULL, reply, siz);
if (!i_height)
return strdup(reply);
TXT_TO_INT("height", transfer_data(i_height), height);
// confirm_summaries() doesn't call this // confirm_summaries() doesn't call this
if (reloading) { if (reloading) {
if (tv_equal(cd, &(dbstatus.newest_createdate_blocks))) // Since they're blocks, just try them all
if (height <= dbstatus.newest_height_blocks)
igndup = true; igndup = true;
else if (tv_newer(cd, &(dbstatus.newest_createdate_blocks)))
return NULL;
} }
return cmd_blocks_do(conn, cmd, id, by, code, inet, cd, igndup, trf_root); return cmd_blocks_do(conn, cmd, height, id, by, code, inet, cd, igndup, trf_root);
} }
static char *cmd_auth_do(PGconn *conn, char *cmd, char *id, char *by, static char *cmd_auth_do(PGconn *conn, char *cmd, char *id, char *by,

17
src/ckdb_dbio.c

@ -4434,7 +4434,7 @@ unparam:
return ok; return ok;
} }
bool blocks_add(PGconn *conn, char *height, char *blockhash, bool blocks_add(PGconn *conn, int32_t height, char *blockhash,
char *confirmed, char *info, char *workinfoid, char *confirmed, char *info, char *workinfoid,
char *username, char *workername, char *clientid, char *username, char *workername, char *clientid,
char *enonce1, char *nonce2, char *nonce, char *reward, char *enonce1, char *nonce2, char *nonce, char *reward,
@ -4465,7 +4465,7 @@ bool blocks_add(PGconn *conn, char *height, char *blockhash,
DATA_BLOCKS(row, b_item); DATA_BLOCKS(row, b_item);
bzero(row, sizeof(*row)); bzero(row, sizeof(*row));
TXT_TO_INT("height", height, row->height); row->height = height;
STRNCPY(row->blockhash, blockhash); STRNCPY(row->blockhash, blockhash);
dsp_hash(blockhash, hash_dsp, sizeof(hash_dsp)); dsp_hash(blockhash, hash_dsp, sizeof(hash_dsp));
@ -4486,7 +4486,7 @@ bool blocks_add(PGconn *conn, char *height, char *blockhash,
if (!igndup) { if (!igndup) {
tv_to_buf(cd, cd_buf, sizeof(cd_buf)); tv_to_buf(cd, cd_buf, sizeof(cd_buf));
LOGERR("%s(): Duplicate (%s) blocks ignored, Status: " LOGERR("%s(): Duplicate (%s) blocks ignored, Status: "
"%s, Block: %s/...%s/%s", "%s, Block: %"PRId32"/...%s/%s",
__func__, __func__,
blocks_confirmed(oldblocks->confirmed), blocks_confirmed(oldblocks->confirmed),
blocks_confirmed(confirmed), blocks_confirmed(confirmed),
@ -4578,7 +4578,7 @@ bool blocks_add(PGconn *conn, char *height, char *blockhash,
if (!startup_complete) { if (!startup_complete) {
tv_to_buf(cd, cd_buf, sizeof(cd_buf)); tv_to_buf(cd, cd_buf, sizeof(cd_buf));
LOGERR("%s(): Status: %s invalid during startup. " LOGERR("%s(): Status: %s invalid during startup. "
"Ignored: Block: %s/...%s/%s", "Ignored: Block: %"PRId32"/...%s/%s",
__func__, __func__,
blocks_confirmed(confirmed), blocks_confirmed(confirmed),
height, hash_dsp, cd_buf); height, hash_dsp, cd_buf);
@ -4587,7 +4587,7 @@ bool blocks_add(PGconn *conn, char *height, char *blockhash,
case BLOCKS_CONFIRM: case BLOCKS_CONFIRM:
if (!old_b_item) { if (!old_b_item) {
tv_to_buf(cd, cd_buf, sizeof(cd_buf)); tv_to_buf(cd, cd_buf, sizeof(cd_buf));
LOGERR("%s(): Can't %s a non-existent Block: %s/...%s/%s", LOGERR("%s(): Can't %s a non-existent Block: %"PRId32"/...%s/%s",
__func__, blocks_confirmed(confirmed), __func__, blocks_confirmed(confirmed),
height, hash_dsp, cd_buf); height, hash_dsp, cd_buf);
goto flail; goto flail;
@ -4619,7 +4619,7 @@ bool blocks_add(PGconn *conn, char *height, char *blockhash,
if (startup_complete) { if (startup_complete) {
tv_to_buf(cd, cd_buf, sizeof(cd_buf)); tv_to_buf(cd, cd_buf, sizeof(cd_buf));
LOGERR("%s(): New Status: (%s)%s requires Status: %s. " LOGERR("%s(): New Status: (%s)%s requires Status: %s. "
"Ignored: Status: (%s)%s, Block: %s/...%s/%s", "Ignored: Status: (%s)%s, Block: %"PRId32"/...%s/%s",
__func__, __func__,
confirmed, blocks_confirmed(confirmed), confirmed, blocks_confirmed(confirmed),
want, oldblocks->confirmed, want, oldblocks->confirmed,
@ -4870,7 +4870,7 @@ flail:
break; break;
} }
LOGWARNING("%s(): %sStatus: %s, Block: %s/...%s Diff %s%s", LOGWARNING("%s(): %sStatus: %s, Block: %"PRId32"/...%s Diff %s%s",
__func__, blk ? "BLOCK! " : "", __func__, blk ? "BLOCK! " : "",
blocks_confirmed(confirmed), blocks_confirmed(confirmed),
height, hash_dsp, diff, tmp); height, hash_dsp, diff, tmp);
@ -5030,6 +5030,9 @@ bool blocks_fill(PGconn *conn)
if (tv_newer(&(dbstatus.newest_createdate_blocks), &(row->createdate))) if (tv_newer(&(dbstatus.newest_createdate_blocks), &(row->createdate)))
copy_tv(&(dbstatus.newest_createdate_blocks), &(row->createdate)); copy_tv(&(dbstatus.newest_createdate_blocks), &(row->createdate));
if (dbstatus.newest_height_blocks < row->height)
dbstatus.newest_height_blocks = row->height;
if (pool.workinfoid < row->workinfoid) { if (pool.workinfoid < row->workinfoid) {
pool.workinfoid = row->workinfoid; pool.workinfoid = row->workinfoid;
pool.height = row->height; pool.height = row->height;

Loading…
Cancel
Save