Skip to content

Commit

Permalink
refactor(debug): add missing blocks diagnostic + consolidate stats qu…
Browse files Browse the repository at this point in the history
…eries PE-4149

Missing stable blocks is worth reporting as an error since it indicates
a bug in the block import process. Consolidating the chain stats queries
into a single statement guarantees consistant counts across the
different tables comparisons.
  • Loading branch information
djwhitt committed Jul 27, 2023
1 parent 77c9869 commit 1cce224
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 83 deletions.
15 changes: 0 additions & 15 deletions src/database/sql/core/fast-stats.sql

This file was deleted.

35 changes: 0 additions & 35 deletions src/database/sql/core/slow-stats.sql

This file was deleted.

60 changes: 60 additions & 0 deletions src/database/sql/core/stats.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
-- selectChainStats
WITH wallet_stats AS (
SELECT
COUNT(*) AS wallets_count
FROM wallets
),
tag_name_stats AS (
SELECT
COUNT(*) AS tag_names_count
FROM tag_names
),
tag_value_stats AS (
SELECT
COUNT(*) AS tag_values_count
FROM tag_values
),
stable_block_stats AS (
SELECT
COUNT(*) AS stable_blocks_count,
IFNULL(SUM(tx_count), 0) AS stable_block_txs_count,
MIN(height) AS stable_blocks_min_height,
MAX(height) AS stable_blocks_max_height
FROM stable_blocks
),
new_block_stats AS (
SELECT
COUNT(*) AS new_blocks_count,
MIN(height) AS new_blocks_min_height,
MAX(height) AS new_blocks_max_height
FROM new_blocks
),
stable_transaction_stats AS (
SELECT
COUNT(*) AS stable_txs_count,
MIN(height) AS stable_txs_min_height,
MAX(height) AS stable_txs_max_height
FROM stable_transactions
),
new_transaction_stats AS (
SELECT
COUNT(*) AS new_txs_count,
MIN(height) AS new_txs_min_height,
MAX(height) AS new_txs_max_height
FROM new_transactions
),
missing_transactions_stats AS (
SELECT
COUNT(*) AS missing_txs_count
FROM missing_transactions
)
SELECT *
FROM
wallet_stats,
tag_name_stats,
tag_value_stats,
stable_block_stats,
new_block_stats,
stable_transaction_stats,
new_transaction_stats,
missing_transactions_stats
73 changes: 40 additions & 33 deletions src/database/standalone-sqlite.ts
Original file line number Diff line number Diff line change
Expand Up @@ -904,32 +904,41 @@ export class StandaloneSqliteDatabaseWorker {
}

getDebugInfo() {
const minStableHeight =
this.stmts.core.selectMinStableHeight.get().min_height;
const maxStableHeight =
this.stmts.core.selectMaxStableHeight.get().max_height;
const stableTxsCount =
this.stmts.core.selectStableTransactionsCount.get().count;
const stableBlocksCount =
this.stmts.core.selectStableBlockCount.get().count;
const stableBlockTxsCount =
this.stmts.core.selectStableBlockTransactionCount.get().count;
const missingStableBlockCount =
maxStableHeight - (minStableHeight - 1) - stableBlocksCount;
const missingStableTxCount = stableBlockTxsCount - stableTxsCount;

const chainStats = this.stmts.core.selectChainStats.get();
const bundleStats = this.stmts.bundles.selectBundleStats.get();
const dataItemStats = this.stmts.bundles.selectDataItemStats.get();

const now = currentUnixTimestamp();

const warnings: string[] = [];
const errors: string[] = [];

const now = currentUnixTimestamp();
let missingStableBlockCount = 0;
if (chainStats.stable_blocks_max_height != undefined) {
missingStableBlockCount =
(chainStats.stable_blocks_max_height ?? 0) -
(chainStats.stable_blocks_min_height
? chainStats.stable_blocks_min_height - 1
: 0) -
chainStats.stable_blocks_count;
}

if (missingStableBlockCount > 0) {
const error = `
Stable block count (${chainStats.stable_blocks_count}) does not match
stable block height range (${chainStats.stable_blocks_min_height} to
${chainStats.stable_blocks_max_height}).
`.replace(/\s+/g, ' ');
errors.push(error);
}

const missingStableTxCount =
chainStats.stable_block_txs_count - chainStats.stable_txs_count;

if (stableTxsCount !== stableBlockTxsCount) {
if (missingStableTxCount > 0) {
const error = `
Stable transaction count (${stableTxsCount}) does not match
stable block transaction count (${stableBlockTxsCount})
Stable transaction count (${chainStats.stable_txs_count}) does not match
stable block transaction count (${chainStats.stable_block_txs_count}).
`
.replace(/\s+/g, ' ')
.trim();
Expand All @@ -947,30 +956,28 @@ export class StandaloneSqliteDatabaseWorker {

return {
counts: {
wallets: this.stmts.core.selectWalletsCount.get().count,
tagNames: this.stmts.core.selectTagNamesCount.get().count,
tagValues: this.stmts.core.selectTagValuesCount.get().count,
stableTxs: stableTxsCount,
stableBlocks: stableBlocksCount,
// TODO fix nulls
stableBlockTxs:
this.stmts.core.selectStableBlockTransactionCount.get().count,
wallets: chainStats.wallets_count,
tagNames: chainStats.tag_names_count,
tagValues: chainStats.tag_values_count,
stableTxs: chainStats.stable_txs_count,
stableBlocks: chainStats.stable_blocks_count,
stableBlockTxs: chainStats.stable_block_txs_count,
missingStableBlocks: missingStableBlockCount,
missingStableTxs: missingStableTxCount,
missingTxs: this.stmts.core.selectMissingTransactionsCount.get().count,
newBlocks: this.stmts.core.selectNewBlocksCount.get().count,
newTxs: this.stmts.core.selectNewTransactionsCount.get().count,
missingTxs: chainStats.missing_txs_count,
newBlocks: chainStats.new_blocks_count,
newTxs: chainStats.new_txs_count,
bundleCount: bundleStats.count,
bundleDataItems: bundleStats.data_item_count,
matcheDataItems: bundleStats.matched_data_item_count,
dataItems: dataItemStats.data_item_count,
nestedDataItems: dataItemStats.nested_data_item_count,
},
heights: {
minStable: minStableHeight ?? -1,
maxStable: maxStableHeight ?? -1,
minNew: this.stmts.core.selectMinNewHeight.get().min_height,
maxNew: this.stmts.core.selectMaxNewHeight.get().max_height,
minStable: chainStats.stable_blocks_min_height ?? -1,
maxStable: chainStats.stable_blocks_max_height ?? -1,
minNew: chainStats.new_blocks_min_height ?? -1,
maxNew: chainStats.new_blocks_max_height ?? -1,
},
timestamps: {
now: currentUnixTimestamp(),
Expand Down

0 comments on commit 1cce224

Please sign in to comment.