Fix silently unhandled database exceptions
This commit is contained in:
		
							parent
							
								
									cbe1ec4e72
								
							
						
					
					
						commit
						1ae34e069c
					
				@ -761,8 +761,13 @@ class Blocks {
 | 
			
		||||
        this.updateTimerProgress(timer, `saved ${this.currentBlockHeight} to database`);
 | 
			
		||||
 | 
			
		||||
        if (!fastForwarded) {
 | 
			
		||||
          const lastestPriceId = await PricesRepository.$getLatestPriceId();
 | 
			
		||||
          this.updateTimerProgress(timer, `got latest price id ${this.currentBlockHeight}`);
 | 
			
		||||
          let lastestPriceId;
 | 
			
		||||
          try {
 | 
			
		||||
            lastestPriceId = await PricesRepository.$getLatestPriceId();
 | 
			
		||||
            this.updateTimerProgress(timer, `got latest price id ${this.currentBlockHeight}`);
 | 
			
		||||
          } catch (e) {
 | 
			
		||||
            logger.debug('failed to fetch latest price id from db: ' + (e instanceof Error ? e.message : e));
 | 
			
		||||
          }
 | 
			
		||||
          if (priceUpdater.historyInserted === true && lastestPriceId !== null) {
 | 
			
		||||
            await blocksRepository.$saveBlockPrices([{
 | 
			
		||||
              height: blockExtended.height,
 | 
			
		||||
 | 
			
		||||
@ -55,14 +55,20 @@ import { execSync } from 'child_process';
 | 
			
		||||
        }).then(result => {
 | 
			
		||||
          resolve(result);
 | 
			
		||||
        }).catch(error => {
 | 
			
		||||
          logger.debug(`database query "${query.slice(0, 100)}" failed!`);
 | 
			
		||||
          reject(error);
 | 
			
		||||
        }).finally(() => {
 | 
			
		||||
          clearTimeout(timer);
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
    } else {
 | 
			
		||||
      const pool = await this.getPool();
 | 
			
		||||
      return pool.query(query, params);
 | 
			
		||||
      try {
 | 
			
		||||
        const pool = await this.getPool();
 | 
			
		||||
        return pool.query(query, params);
 | 
			
		||||
      } catch (e) {
 | 
			
		||||
        logger.debug(`database query "${query.slice(0, 100)}" failed!`);
 | 
			
		||||
        throw e;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -92,9 +92,15 @@ class Server {
 | 
			
		||||
    logger.notice(`Starting Mempool Server${worker ? ' (worker)' : ''}... (${backendInfo.getShortCommitHash()})`);
 | 
			
		||||
 | 
			
		||||
    // Register cleanup listeners for exit events
 | 
			
		||||
    ['exit', 'SIGHUP', 'SIGINT', 'SIGTERM', 'SIGUSR1', 'SIGUSR2', 'uncaughtException', 'unhandledRejection'].forEach(event => {
 | 
			
		||||
    ['exit', 'SIGHUP', 'SIGINT', 'SIGTERM', 'SIGUSR1', 'SIGUSR2'].forEach(event => {
 | 
			
		||||
      process.on(event, () => { this.onExit(event); });
 | 
			
		||||
    });
 | 
			
		||||
    process.on('uncaughtException', (error) => {
 | 
			
		||||
      this.onUnhandledException('uncaughtException', error);
 | 
			
		||||
    });
 | 
			
		||||
    process.on('unhandledRejection', (reason, promise) => {
 | 
			
		||||
      this.onUnhandledException('unhandledRejection', reason);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    if (config.MEMPOOL.BACKEND === 'esplora') {
 | 
			
		||||
      bitcoinApi.startHealthChecks();
 | 
			
		||||
@ -314,14 +320,18 @@ class Server {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onExit(exitEvent): void {
 | 
			
		||||
  onExit(exitEvent, code = 0): void {
 | 
			
		||||
    logger.debug(`onExit for signal: ${exitEvent}`);
 | 
			
		||||
    if (config.DATABASE.ENABLED) {
 | 
			
		||||
      DB.releasePidLock();
 | 
			
		||||
    }
 | 
			
		||||
    process.exit(0);
 | 
			
		||||
    process.exit(code);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onUnhandledException(type, error): void {
 | 
			
		||||
    console.error(`${type}:`, error);
 | 
			
		||||
    this.onExit(type, 1);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
((): Server => new Server())();
 | 
			
		||||
 | 
			
		||||
@ -76,7 +76,12 @@ class Indexer {
 | 
			
		||||
 | 
			
		||||
    if (task === 'blocksPrices' && !this.tasksRunning.includes(task) && !['testnet', 'signet'].includes(config.MEMPOOL.NETWORK)) {
 | 
			
		||||
      this.tasksRunning.push(task);
 | 
			
		||||
      const lastestPriceId = await PricesRepository.$getLatestPriceId();
 | 
			
		||||
      let lastestPriceId;
 | 
			
		||||
      try {
 | 
			
		||||
        lastestPriceId = await PricesRepository.$getLatestPriceId();
 | 
			
		||||
      } catch (e) {
 | 
			
		||||
        logger.debug('failed to fetch latest price id from db: ' + (e instanceof Error ? e.message : e));
 | 
			
		||||
      }
 | 
			
		||||
      if (priceUpdater.historyInserted === false || lastestPriceId === null) {
 | 
			
		||||
        logger.debug(`Blocks prices indexer is waiting for the price updater to complete`, logger.tags.mining);
 | 
			
		||||
        setTimeout(() => {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user