diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 483fd3f3e..de461e095 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -20,6 +20,7 @@ class Blocks { private previousDifficultyRetarget = 0; private newBlockCallbacks: ((block: BlockExtended, txIds: string[], transactions: TransactionExtended[]) => void)[] = []; private blockIndexingStarted = false; + public blockIndexingCompleted = false; constructor() { } @@ -240,6 +241,8 @@ class Blocks { logger.err('An error occured in $generateBlockDatabase(). Skipping block indexing. ' + e); console.log(e); } + + this.blockIndexingCompleted = true; } public async $updateBlocks() { diff --git a/backend/src/api/mining.ts b/backend/src/api/mining.ts index 2411420cb..1d5142080 100644 --- a/backend/src/api/mining.ts +++ b/backend/src/api/mining.ts @@ -4,6 +4,7 @@ import PoolsRepository from '../repositories/PoolsRepository'; import HashratesRepository from '../repositories/HashratesRepository'; import bitcoinClient from './bitcoin/bitcoin-client'; import logger from '../logger'; +import blocks from './blocks'; class Mining { hashrateIndexingStarted = false; @@ -111,7 +112,7 @@ class Mining { return; } - if (this.hashrateIndexingStarted) { + if (!blocks.blockIndexingCompleted || this.hashrateIndexingStarted) { return; } this.hashrateIndexingStarted = true; @@ -128,6 +129,8 @@ class Mining { let indexedThisRun = 0; let totalIndexed = 0; + const hashrates: any[] = []; + while (toTimestamp > genesisTimestamp) { const fromTimestamp = toTimestamp - 86400; if (indexedTimestamp.includes(fromTimestamp)) { @@ -137,9 +140,7 @@ class Mining { } const blockStats: any = await BlocksRepository.$blockCountBetweenTimestamp( - null, fromTimestamp, toTimestamp - ); - + null, fromTimestamp, toTimestamp); if (blockStats.blockCount === 0) { // We are done indexing, no blocks left break; } @@ -158,23 +159,28 @@ class Mining { indexedThisRun = 0; } - await HashratesRepository.$saveDailyStat({ + hashrates.push({ hashrateTimestamp: fromTimestamp, avgHashrate: lastBlockHashrate, poolId: null, }); + if (hashrates.length > 100) { + await HashratesRepository.$saveHashrates(hashrates); + hashrates.length = 0; + } + toTimestamp -= 86400; ++indexedThisRun; ++totalIndexed; } + await HashratesRepository.$saveHashrates(hashrates); await HashratesRepository.$setLatestRunTimestamp(); this.hashrateIndexingStarted = false; logger.info(`Hashrates indexing completed`); } - } export default new Mining(); diff --git a/backend/src/index.ts b/backend/src/index.ts index 64ec25382..d051766fa 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -164,12 +164,12 @@ class Server { } } - async runIndexingWhenReady() { + runIndexingWhenReady() { if (!Common.indexingEnabled() || mempool.hasPriority()) { return; } - await blocks.$generateBlockDatabase(); - await mining.$generateNetworkHashrateHistory(); + blocks.$generateBlockDatabase(); + mining.$generateNetworkHashrateHistory(); } setUpWebsocketHandling() { diff --git a/backend/src/repositories/HashratesRepository.ts b/backend/src/repositories/HashratesRepository.ts index 2a898e5bd..0e8f1477e 100644 --- a/backend/src/repositories/HashratesRepository.ts +++ b/backend/src/repositories/HashratesRepository.ts @@ -6,21 +6,19 @@ class HashratesRepository { /** * Save indexed block data in the database */ - public async $saveDailyStat(dailyStat: any) { + public async $saveHashrates(hashrates: any) { + let query = `INSERT INTO + hashrates(hashrate_timestamp, avg_hashrate, pool_id) VALUES`; + + for (const hashrate of hashrates) { + query += ` (FROM_UNIXTIME(${hashrate.hashrateTimestamp}), ${hashrate.avgHashrate}, ${hashrate.poolId}),`; + } + query = query.slice(0, -1); + const connection = await DB.pool.getConnection(); - try { - const query = `INSERT INTO - hashrates(hashrate_timestamp, avg_hashrate, pool_id) - VALUE (FROM_UNIXTIME(?), ?, ?)`; - - const params: any[] = [ - dailyStat.hashrateTimestamp, dailyStat.avgHashrate, - dailyStat.poolId - ]; - // logger.debug(query); - await connection.query(query, params); + await connection.query(query); } catch (e: any) { logger.err('$saveHashrateInDatabase() error' + (e instanceof Error ? e.message : e)); }