Add indexer task to backfill audit fee/weight stats
This commit is contained in:
parent
3013386ca5
commit
5b62966863
@ -457,6 +457,41 @@ class Blocks {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [INDEXING] Index expected fees & weight for all audited blocks
|
||||||
|
*/
|
||||||
|
public async $generateAuditStats(): Promise<void> {
|
||||||
|
const blockIds = await BlocksAuditsRepository.$getBlocksWithoutSummaries();
|
||||||
|
if (!blockIds?.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let timer = Date.now();
|
||||||
|
let indexedThisRun = 0;
|
||||||
|
let indexedTotal = 0;
|
||||||
|
logger.debug(`Indexing ${blockIds.length} block audit details`);
|
||||||
|
for (const hash of blockIds) {
|
||||||
|
const summary = await BlocksSummariesRepository.$getTemplate(hash);
|
||||||
|
let totalFees = 0;
|
||||||
|
let totalWeight = 0;
|
||||||
|
for (const tx of summary?.transactions || []) {
|
||||||
|
totalFees += tx.fee;
|
||||||
|
totalWeight += (tx.vsize * 4);
|
||||||
|
}
|
||||||
|
await BlocksAuditsRepository.$setSummary(hash, totalFees, totalWeight);
|
||||||
|
|
||||||
|
indexedThisRun++;
|
||||||
|
indexedTotal++;
|
||||||
|
const elapsedSeconds = (Date.now() - timer) / 1000;
|
||||||
|
if (elapsedSeconds > 5) {
|
||||||
|
const blockPerSeconds = indexedThisRun / elapsedSeconds;
|
||||||
|
logger.debug(`Indexed ${indexedTotal} / ${blockIds.length} block audit details (${blockPerSeconds.toFixed(1)}/s)`);
|
||||||
|
timer = Date.now();
|
||||||
|
indexedThisRun = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logger.debug(`Indexing block audit details completed`);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [INDEXING] Index all blocks metadata for the mining dashboard
|
* [INDEXING] Index all blocks metadata for the mining dashboard
|
||||||
*/
|
*/
|
||||||
|
@ -134,6 +134,7 @@ class Indexer {
|
|||||||
await mining.$generatePoolHashrateHistory();
|
await mining.$generatePoolHashrateHistory();
|
||||||
await blocks.$generateBlocksSummariesDatabase();
|
await blocks.$generateBlocksSummariesDatabase();
|
||||||
await blocks.$generateCPFPDatabase();
|
await blocks.$generateCPFPDatabase();
|
||||||
|
await blocks.$generateAuditStats();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.indexerRunning = false;
|
this.indexerRunning = false;
|
||||||
logger.err(`Indexer failed, trying again in 10 seconds. Reason: ` + (e instanceof Error ? e.message : e));
|
logger.err(`Indexer failed, trying again in 10 seconds. Reason: ` + (e instanceof Error ? e.message : e));
|
||||||
|
@ -18,6 +18,19 @@ class BlocksAuditRepositories {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async $setSummary(hash: string, expectedFees: number, expectedWeight: number) {
|
||||||
|
try {
|
||||||
|
await DB.query(`
|
||||||
|
UPDATE blocks_audits SET
|
||||||
|
expected_fees = ?,
|
||||||
|
expected_weight = ?
|
||||||
|
WHERE hash = ?
|
||||||
|
`, [expectedFees, expectedWeight, hash]);
|
||||||
|
} catch (e: any) {
|
||||||
|
logger.err(`Cannot update block audit in db. Reason: ` + (e instanceof Error ? e.message : e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async $getBlocksHealthHistory(div: number, interval: string | null): Promise<any> {
|
public async $getBlocksHealthHistory(div: number, interval: string | null): Promise<any> {
|
||||||
try {
|
try {
|
||||||
let query = `SELECT UNIX_TIMESTAMP(time) as time, height, match_rate FROM blocks_audits`;
|
let query = `SELECT UNIX_TIMESTAMP(time) as time, height, match_rate FROM blocks_audits`;
|
||||||
@ -113,6 +126,32 @@ class BlocksAuditRepositories {
|
|||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async $getBlocksWithoutSummaries(): Promise<string[]> {
|
||||||
|
try {
|
||||||
|
const [fromRows]: any[] = await DB.query(`
|
||||||
|
SELECT height
|
||||||
|
FROM blocks_audits
|
||||||
|
WHERE expected_fees IS NULL
|
||||||
|
ORDER BY height DESC
|
||||||
|
LIMIT 1
|
||||||
|
`);
|
||||||
|
if (!fromRows?.length) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
const fromHeight = fromRows[0].height;
|
||||||
|
const [idRows]: any[] = await DB.query(`
|
||||||
|
SELECT hash
|
||||||
|
FROM blocks_audits
|
||||||
|
WHERE height <= ?
|
||||||
|
ORDER BY height DESC
|
||||||
|
`, [fromHeight]);
|
||||||
|
return idRows.map(row => row.hash);
|
||||||
|
} catch (e: any) {
|
||||||
|
logger.err(`Cannot fetch block audit from db. Reason: ` + (e instanceof Error ? e.message : e));
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default new BlocksAuditRepositories();
|
export default new BlocksAuditRepositories();
|
||||||
|
@ -50,6 +50,21 @@ class BlocksSummariesRepository {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async $getTemplate(id: string): Promise<BlockSummary | undefined> {
|
||||||
|
try {
|
||||||
|
const [templates]: any[] = await DB.query(`SELECT * from blocks_templates WHERE id = ?`, [id]);
|
||||||
|
if (templates.length > 0) {
|
||||||
|
return {
|
||||||
|
id: templates[0].id,
|
||||||
|
transactions: JSON.parse(templates[0].template),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
logger.err(`Cannot get block template for block id ${id}. Reason: ` + (e instanceof Error ? e.message : e));
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
public async $getIndexedSummariesId(): Promise<string[]> {
|
public async $getIndexedSummariesId(): Promise<string[]> {
|
||||||
try {
|
try {
|
||||||
const [rows]: any[] = await DB.query(`SELECT id from blocks_summaries`);
|
const [rows]: any[] = await DB.query(`SELECT id from blocks_summaries`);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user