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));
LOGWARNING("%s(): %s newest DB poolstats (ignored)", __func__, 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));
reason = "workmarkers";

5
src/ckdb.h

@ -55,7 +55,7 @@
#define DB_VLOCK "1"
#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_HERE __FILE__, __func__, __LINE__
@ -138,6 +138,7 @@ typedef struct loadstatus {
tv_t newest_createdate_workinfo;
tv_t newest_createdate_poolstats;
tv_t newest_createdate_blocks;
int32_t newest_height_blocks;
} LOADSTATUS;
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 shareinv, int64_t elapsed,
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 *username, char *workername, char *clientid,
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)
{
char hash[TXT_BIG+1];
char height_str[32];
char *blockhash;
int32_t confirms;
size_t len;
@ -348,14 +347,12 @@ void btc_blockstatus(BLOCKS *blocks)
return;
if (strcmp(blockhash, hash) != 0) {
snprintf(height_str, sizeof(height_str), "%d", blocks->height);
LOGERR("%s() flagging block %d(%s) as %s pool=%s btc=%s",
__func__,
blocks->height, height_str,
LOGERR("%s() flagging block %d as %s pool=%s btc=%s",
__func__, blocks->height,
blocks_confirmed(BLOCKS_ORPHAN_STR),
hash, blockhash);
ok = blocks_add(NULL, height_str,
ok = blocks_add(NULL, blocks->height,
blocks->blockhash,
BLOCKS_ORPHAN_STR, EMPTY,
EMPTY, EMPTY, EMPTY, EMPTY,
@ -371,14 +368,12 @@ void btc_blockstatus(BLOCKS *blocks)
confirms = btc_confirms(hash);
if (confirms >= BLOCKS_42_VALUE) {
snprintf(height_str, sizeof(height_str), "%d", blocks->height);
LOGERR("%s() flagging block %d(%s) as %s confirms=%d(%d)",
__func__,
blocks->height, height_str,
LOGERR("%s() flagging block %d as %s confirms=%d(%d)",
__func__, blocks->height,
blocks_confirmed(BLOCKS_42_STR),
confirms, BLOCKS_42_VALUE);
ok = blocks_add(NULL, height_str,
ok = blocks_add(NULL, blocks->height,
blocks->blockhash,
BLOCKS_42_STR, EMPTY,
EMPTY, EMPTY, EMPTY, EMPTY,

45
src/ckdb_cmd.c

@ -1387,8 +1387,8 @@ redo:
return buf;
}
static char *cmd_blockstatus(__maybe_unused PGconn *conn, char *cmd, char *id,
tv_t *now, char *by, char *code, char *inet,
static char *cmd_blockstatus(PGconn *conn, char *cmd, char *id, tv_t *now,
char *by, char *code, char *inet,
__maybe_unused tv_t *cd, K_TREE *trf_root)
{
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]) {
case BLOCKS_NEW:
case BLOCKS_CONFIRM:
ok = blocks_add(conn, transfer_data(i_height),
ok = blocks_add(conn, height,
blocks->blockhash,
BLOCKS_ORPHAN_STR, info,
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_ORPHAN:
case BLOCKS_REJECT:
ok = blocks_add(conn, transfer_data(i_height),
ok = blocks_add(conn, height,
blocks->blockhash,
BLOCKS_REJECT_STR, info,
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
switch (blocks->confirmed[0]) {
case BLOCKS_NEW:
ok = blocks_add(conn, transfer_data(i_height),
ok = blocks_add(conn, height,
blocks->blockhash,
BLOCKS_CONFIRM_STR, info,
EMPTY, EMPTY, EMPTY, EMPTY,
@ -2644,13 +2644,13 @@ awconf:
}
// TODO: the confirm update: identify block changes from workinfo height?
static char *cmd_blocks_do(PGconn *conn, char *cmd, char *id, char *by,
char *code, char *inet, tv_t *cd, bool igndup,
K_TREE *trf_root)
static char *cmd_blocks_do(PGconn *conn, char *cmd, int32_t height, char *id,
char *by, char *code, char *inet, tv_t *cd,
bool igndup, K_TREE *trf_root)
{
char reply[1024] = "";
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;
TRANSFER *transfer;
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);
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);
if (!i_blockhash)
return strdup(reply);
@ -2707,7 +2703,7 @@ static char *cmd_blocks_do(PGconn *conn, char *cmd, char *id, char *by,
return strdup(reply);
msg = "added";
ok = blocks_add(conn, transfer_data(i_height),
ok = blocks_add(conn, height,
transfer_data(i_blockhash),
transfer_data(i_confirmed),
EMPTY,
@ -2724,7 +2720,7 @@ static char *cmd_blocks_do(PGconn *conn, char *cmd, char *id, char *by,
break;
case BLOCKS_CONFIRM:
msg = "confirmed";
ok = blocks_add(conn, transfer_data(i_height),
ok = blocks_add(conn, height,
transfer_data(i_blockhash),
transfer_data(i_confirmed),
EMPTY,
@ -2757,17 +2753,28 @@ static char *cmd_blocks(PGconn *conn, char *cmd, char *id,
char *code, char *inet, tv_t *cd,
K_TREE *trf_root)
{
char reply[1024] = "";
size_t siz = sizeof(reply);
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
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;
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,

17
src/ckdb_dbio.c

@ -4434,7 +4434,7 @@ unparam:
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 *username, char *workername, char *clientid,
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);
bzero(row, sizeof(*row));
TXT_TO_INT("height", height, row->height);
row->height = height;
STRNCPY(row->blockhash, blockhash);
dsp_hash(blockhash, hash_dsp, sizeof(hash_dsp));
@ -4486,7 +4486,7 @@ bool blocks_add(PGconn *conn, char *height, char *blockhash,
if (!igndup) {
tv_to_buf(cd, cd_buf, sizeof(cd_buf));
LOGERR("%s(): Duplicate (%s) blocks ignored, Status: "
"%s, Block: %s/...%s/%s",
"%s, Block: %"PRId32"/...%s/%s",
__func__,
blocks_confirmed(oldblocks->confirmed),
blocks_confirmed(confirmed),
@ -4578,7 +4578,7 @@ bool blocks_add(PGconn *conn, char *height, char *blockhash,
if (!startup_complete) {
tv_to_buf(cd, cd_buf, sizeof(cd_buf));
LOGERR("%s(): Status: %s invalid during startup. "
"Ignored: Block: %s/...%s/%s",
"Ignored: Block: %"PRId32"/...%s/%s",
__func__,
blocks_confirmed(confirmed),
height, hash_dsp, cd_buf);
@ -4587,7 +4587,7 @@ bool blocks_add(PGconn *conn, char *height, char *blockhash,
case BLOCKS_CONFIRM:
if (!old_b_item) {
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),
height, hash_dsp, cd_buf);
goto flail;
@ -4619,7 +4619,7 @@ bool blocks_add(PGconn *conn, char *height, char *blockhash,
if (startup_complete) {
tv_to_buf(cd, cd_buf, sizeof(cd_buf));
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__,
confirmed, blocks_confirmed(confirmed),
want, oldblocks->confirmed,
@ -4870,7 +4870,7 @@ flail:
break;
}
LOGWARNING("%s(): %sStatus: %s, Block: %s/...%s Diff %s%s",
LOGWARNING("%s(): %sStatus: %s, Block: %"PRId32"/...%s Diff %s%s",
__func__, blk ? "BLOCK! " : "",
blocks_confirmed(confirmed),
height, hash_dsp, diff, tmp);
@ -5030,6 +5030,9 @@ bool blocks_fill(PGconn *conn)
if (tv_newer(&(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) {
pool.workinfoid = row->workinfoid;
pool.height = row->height;

Loading…
Cancel
Save