Browse Source

db_sync: add missing ERROR/WARN logs to all error branches

- db_record_insert: error logs for si_prep failures (SELECT, INSERT, cascade SELECT/UPDATE)
- si_parse_record: WARN logs for truncated header, data/sig overrun
- db_chain_hash_at: ERROR logs for missing row, corrupted blob
- db_prev_chain_hash: ERROR log for si_prep failure
- db_cascade_from: ERROR logs for si_prep failures
topo_upd
Evgeny 2 months ago
parent
commit
3890d2038d
  1. 29
      src/db_sync.c

29
src/db_sync.c

@ -259,9 +259,9 @@ static int db_chain_hash_at(struct DB_SYNC_INSTANCE* si, uint32_t pos, uint8_t o
return -1; return -1;
} }
sqlite3_bind_int64(stmt, 1, (sqlite3_int64)pos); sqlite3_bind_int64(stmt, 1, (sqlite3_int64)pos);
if (sqlite3_step(stmt) != SQLITE_ROW) { sqlite3_finalize(stmt); return -1; } if (sqlite3_step(stmt) != SQLITE_ROW) { DEBUG_ERROR(DEBUG_CATEGORY_DB_SYNC, "chain_hash_at no row pos=%u tbl=%s", pos, SI_TBL(si)); sqlite3_finalize(stmt); return -1; }
const void* b = sqlite3_column_blob(stmt, 0); const void* b = sqlite3_column_blob(stmt, 0);
if (!b || sqlite3_column_bytes(stmt, 0) < 32) { sqlite3_finalize(stmt); return -1; } if (!b || sqlite3_column_bytes(stmt, 0) < 32) { DEBUG_ERROR(DEBUG_CATEGORY_DB_SYNC, "chain_hash_at blob too small pos=%u tbl=%s", pos, SI_TBL(si)); sqlite3_finalize(stmt); return -1; }
memcpy(out, b, 32); memcpy(out, b, 32);
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
return 0; return 0;
@ -288,8 +288,9 @@ static int db_prev_chain_hash(struct DB_SYNC_INSTANCE* si, uint64_t ts, const ui
"SELECT chain_hash FROM \"%s\"" "SELECT chain_hash FROM \"%s\""
" WHERE timestamp<?1 OR (timestamp=?1 AND author_signature<?2)" " WHERE timestamp<?1 OR (timestamp=?1 AND author_signature<?2)"
" ORDER BY timestamp DESC, author_signature DESC" " ORDER BY timestamp DESC, author_signature DESC"
" LIMIT 1") != SQLITE_OK) " LIMIT 1") != SQLITE_OK) {
return -1; DEBUG_ERROR(DEBUG_CATEGORY_DB_SYNC, "db_prev_chain_hash prep: %s", sqlite3_errmsg(SI_DB(si)));
return -1; }
sqlite3_bind_int64(stmt, 1, (sqlite3_int64)ts); sqlite3_bind_int64(stmt, 1, (sqlite3_int64)ts);
sqlite3_bind_blob(stmt, 2, author_sig, DB_SIG_SIZE, SQLITE_STATIC); sqlite3_bind_blob(stmt, 2, author_sig, DB_SIG_SIZE, SQLITE_STATIC);
if (sqlite3_step(stmt) == SQLITE_ROW) { if (sqlite3_step(stmt) == SQLITE_ROW) {
@ -332,13 +333,13 @@ static void db_cascade_from(struct DB_SYNC_INSTANCE* si, uint32_t from_pos)
"SELECT id,timestamp,node_id,author_signature FROM \"%s\"" "SELECT id,timestamp,node_id,author_signature FROM \"%s\""
" ORDER BY timestamp, author_signature" " ORDER BY timestamp, author_signature"
" LIMIT -1 OFFSET ?") != SQLITE_OK) " LIMIT -1 OFFSET ?") != SQLITE_OK)
{ sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); return; } { DEBUG_ERROR(DEBUG_CATEGORY_DB_SYNC, "db_cascade_from SELECT prep: %s", sqlite3_errmsg(db)); sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); return; }
sqlite3_bind_int64(sel, 1, (sqlite3_int64)from_pos); sqlite3_bind_int64(sel, 1, (sqlite3_int64)from_pos);
if (si_prep(si, &upd, if (si_prep(si, &upd,
"UPDATE \"%s\" SET chain_hash=?" "UPDATE \"%s\" SET chain_hash=?"
" WHERE timestamp=? AND author_signature=?") != SQLITE_OK) " WHERE timestamp=? AND author_signature=?") != SQLITE_OK)
{ sqlite3_finalize(sel); sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); return; } { DEBUG_ERROR(DEBUG_CATEGORY_DB_SYNC, "db_cascade_from UPDATE prep: %s", sqlite3_errmsg(db)); sqlite3_finalize(sel); sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); return; }
uint8_t ch[32]; uint8_t ch[32];
while (sqlite3_step(sel) == SQLITE_ROW) { while (sqlite3_step(sel) == SQLITE_ROW) {
@ -435,7 +436,7 @@ static int db_record_insert(struct DB_SYNC_INSTANCE* si,
// Check if record already exists by (timestamp, author_signature) // Check if record already exists by (timestamp, author_signature)
if (si_prep(si, &stmt, "SELECT 1 FROM \"%s\" WHERE timestamp=? AND author_signature=?") != SQLITE_OK) if (si_prep(si, &stmt, "SELECT 1 FROM \"%s\" WHERE timestamp=? AND author_signature=?") != SQLITE_OK)
{ sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); return -1; } { DEBUG_ERROR(DEBUG_CATEGORY_DB_SYNC, "db_record_insert SELECT prep: %s", sqlite3_errmsg(db)); sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); return -1; }
sqlite3_bind_int64(stmt, 1, (sqlite3_int64)ts); sqlite3_bind_int64(stmt, 1, (sqlite3_int64)ts);
sqlite3_bind_blob(stmt, 2, author_sig, DB_SIG_SIZE, SQLITE_STATIC); sqlite3_bind_blob(stmt, 2, author_sig, DB_SIG_SIZE, SQLITE_STATIC);
int exists = (sqlite3_step(stmt) == SQLITE_ROW); int exists = (sqlite3_step(stmt) == SQLITE_ROW);
@ -454,7 +455,7 @@ static int db_record_insert(struct DB_SYNC_INSTANCE* si,
" (timestamp,node_id,id,chain_hash,flags,data," " (timestamp,node_id,id,chain_hash,flags,data,"
" author_signature,delivered_peers,delivery_chain)" " author_signature,delivered_peers,delivery_chain)"
" VALUES (?,?,?,?,0,?,?,0,'')") != SQLITE_OK) " VALUES (?,?,?,?,0,?,?,0,'')") != SQLITE_OK)
{ sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); return -1; } { DEBUG_ERROR(DEBUG_CATEGORY_DB_SYNC, "db_record_insert INSERT prep: %s", sqlite3_errmsg(db)); sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); return -1; }
sqlite3_bind_int64(stmt, 1, (sqlite3_int64)ts); sqlite3_bind_int64(stmt, 1, (sqlite3_int64)ts);
sqlite3_bind_int64(stmt, 2, (sqlite3_int64)author_node_id); sqlite3_bind_int64(stmt, 2, (sqlite3_int64)author_node_id);
sqlite3_bind_int64(stmt, 3, (sqlite3_int64)id); sqlite3_bind_int64(stmt, 3, (sqlite3_int64)id);
@ -474,7 +475,7 @@ static int db_record_insert(struct DB_SYNC_INSTANCE* si,
" WHERE timestamp>?1" " WHERE timestamp>?1"
" OR (timestamp=?1 AND author_signature>?2)" " OR (timestamp=?1 AND author_signature>?2)"
" ORDER BY timestamp, author_signature") != SQLITE_OK) " ORDER BY timestamp, author_signature") != SQLITE_OK)
{ sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); return -1; } { DEBUG_ERROR(DEBUG_CATEGORY_DB_SYNC, "db_record_insert cascade SELECT prep: %s", sqlite3_errmsg(db)); sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); return -1; }
sqlite3_bind_int64(sel, 1, (sqlite3_int64)ts); sqlite3_bind_int64(sel, 1, (sqlite3_int64)ts);
sqlite3_bind_blob(sel, 2, author_sig, DB_SIG_SIZE, SQLITE_STATIC); sqlite3_bind_blob(sel, 2, author_sig, DB_SIG_SIZE, SQLITE_STATIC);
@ -482,7 +483,7 @@ static int db_record_insert(struct DB_SYNC_INSTANCE* si,
if (si_prep(si, &upd, if (si_prep(si, &upd,
"UPDATE \"%s\" SET chain_hash=?" "UPDATE \"%s\" SET chain_hash=?"
" WHERE timestamp=? AND author_signature=?") != SQLITE_OK) " WHERE timestamp=? AND author_signature=?") != SQLITE_OK)
{ sqlite3_finalize(sel); sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); return -1; } { DEBUG_ERROR(DEBUG_CATEGORY_DB_SYNC, "db_record_insert cascade UPDATE prep: %s", sqlite3_errmsg(db)); sqlite3_finalize(sel); sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); return -1; }
uint8_t rch[32]; memcpy(rch, ch, 32); uint8_t rch[32]; memcpy(rch, ch, 32);
while (sqlite3_step(sel) == SQLITE_ROW) { while (sqlite3_step(sel) == SQLITE_ROW) {
@ -890,20 +891,20 @@ static int si_parse_record(const uint8_t** pp, const uint8_t* end,
uint32_t* rdlen, const uint8_t** rdata, uint32_t* rdlen, const uint8_t** rdata,
const uint8_t** rsig, int* rsiglen) const uint8_t** rsig, int* rsiglen)
{ {
if (*pp + 28 > end) return -1; // 8+8+8+4 = 28 if (*pp + 28 > end) { DEBUG_WARN(DEBUG_CATEGORY_DB_SYNC, "si_parse_record: truncated header, need 28 have %td", end - *pp); return -1; }
*rid = *(uint64_t*)*pp; *pp += 8; *rid = *(uint64_t*)*pp; *pp += 8;
*rts = *(uint64_t*)*pp; *pp += 8; *rts = *(uint64_t*)*pp; *pp += 8;
*rauthor = *(uint64_t*)*pp; *pp += 8; *rauthor = *(uint64_t*)*pp; *pp += 8;
*rdlen = *(uint32_t*)*pp; *pp += 4; *rdlen = *(uint32_t*)*pp; *pp += 4;
if (*pp + *rdlen > end) return -1; if (*pp + *rdlen > end) { DEBUG_WARN(DEBUG_CATEGORY_DB_SYNC, "si_parse_record: data overrun dlen=%u have=%td", *rdlen, end - *pp); return -1; }
*rdata = (*rdlen > 0) ? *pp : NULL; *rdata = (*rdlen > 0) ? *pp : NULL;
*pp += *rdlen; *pp += *rdlen;
if (*pp + 1 > end) return -1; if (*pp + 1 > end) { DEBUG_WARN(DEBUG_CATEGORY_DB_SYNC, "si_parse_record: sig_len overrun"); return -1; }
*rsiglen = (int)(*(*pp)++); *rsiglen = (int)(*(*pp)++);
if (*rsiglen > 0) { if (*rsiglen > 0) {
if (*pp + *rsiglen > end) return -1; if (*pp + *rsiglen > end) { DEBUG_WARN(DEBUG_CATEGORY_DB_SYNC, "si_parse_record: sig data overrun slen=%d have=%td", *rsiglen, end - *pp); return -1; }
*rsig = *pp; *rsig = *pp;
*pp += *rsiglen; *pp += *rsiglen;
} else { } else {

Loading…
Cancel
Save