Merge pull request #2779 from mempool/mononaut/fix-block-summaries-repo
Fix block summaries repo upsert race condition
This commit is contained in:
		
						commit
						484c503f6d
					
				@ -439,7 +439,7 @@ class WebsocketHandler {
 | 
			
		||||
        };
 | 
			
		||||
      }) : [];
 | 
			
		||||
 | 
			
		||||
      BlocksSummariesRepository.$saveSummary({
 | 
			
		||||
      BlocksSummariesRepository.$saveTemplate({
 | 
			
		||||
        height: block.height,
 | 
			
		||||
        template: {
 | 
			
		||||
          id: block.id,
 | 
			
		||||
 | 
			
		||||
@ -17,19 +17,16 @@ class BlocksSummariesRepository {
 | 
			
		||||
    return undefined;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public async $saveSummary(params: { height: number, mined?: BlockSummary, template?: BlockSummary}) {
 | 
			
		||||
    const blockId = params.mined?.id ?? params.template?.id;
 | 
			
		||||
  public async $saveSummary(params: { height: number, mined?: BlockSummary}) {
 | 
			
		||||
    const blockId = params.mined?.id;
 | 
			
		||||
    try {
 | 
			
		||||
      const [dbSummary]: any[] = await DB.query(`SELECT * FROM blocks_summaries WHERE id = "${blockId}"`);
 | 
			
		||||
      if (dbSummary.length === 0) { // First insertion
 | 
			
		||||
        await DB.query(`INSERT INTO blocks_summaries VALUE (?, ?, ?, ?)`, [
 | 
			
		||||
          params.height, blockId, JSON.stringify(params.mined?.transactions ?? []), JSON.stringify(params.template?.transactions ?? [])
 | 
			
		||||
        ]);
 | 
			
		||||
      } else if (params.mined !== undefined) { // Update mined block summary
 | 
			
		||||
        await DB.query(`UPDATE blocks_summaries SET transactions = ? WHERE id = "${params.mined.id}"`, [JSON.stringify(params.mined.transactions)]);
 | 
			
		||||
      } else if (params.template !== undefined) { // Update template block summary
 | 
			
		||||
        await DB.query(`UPDATE blocks_summaries SET template = ? WHERE id = "${params.template.id}"`, [JSON.stringify(params.template?.transactions)]);
 | 
			
		||||
      }
 | 
			
		||||
      const transactions = JSON.stringify(params.mined?.transactions || []);
 | 
			
		||||
      await DB.query(`
 | 
			
		||||
        INSERT INTO blocks_summaries (height, id, transactions, template)
 | 
			
		||||
        VALUE (?, ?, ?, ?)
 | 
			
		||||
        ON DUPLICATE KEY UPDATE
 | 
			
		||||
          transactions = ?
 | 
			
		||||
      `, [params.height, blockId, transactions, '[]', transactions]);
 | 
			
		||||
    } catch (e: any) {
 | 
			
		||||
      if (e.errno === 1062) { // ER_DUP_ENTRY - This scenario is possible upon node backend restart
 | 
			
		||||
        logger.debug(`Cannot save block summary for ${blockId} because it has already been indexed, ignoring`);
 | 
			
		||||
@ -40,6 +37,26 @@ class BlocksSummariesRepository {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public async $saveTemplate(params: { height: number, template: BlockSummary}) {
 | 
			
		||||
    const blockId = params.template?.id;
 | 
			
		||||
    try {
 | 
			
		||||
      const transactions = JSON.stringify(params.template?.transactions || []);
 | 
			
		||||
      await DB.query(`
 | 
			
		||||
        INSERT INTO blocks_summaries (height, id, transactions, template)
 | 
			
		||||
        VALUE (?, ?, ?, ?)
 | 
			
		||||
        ON DUPLICATE KEY UPDATE
 | 
			
		||||
          template = ?
 | 
			
		||||
      `, [params.height, blockId, '[]', transactions, transactions]);
 | 
			
		||||
    } catch (e: any) {
 | 
			
		||||
      if (e.errno === 1062) { // ER_DUP_ENTRY - This scenario is possible upon node backend restart
 | 
			
		||||
        logger.debug(`Cannot save block template for ${blockId} because it has already been indexed, ignoring`);
 | 
			
		||||
      } else {
 | 
			
		||||
        logger.debug(`Cannot save block template for ${blockId}. Reason: ${e instanceof Error ? e.message : e}`);
 | 
			
		||||
        throw e;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public async $getIndexedSummariesId(): Promise<string[]> {
 | 
			
		||||
    try {
 | 
			
		||||
      const [rows]: any[] = await DB.query(`SELECT id from blocks_summaries`);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user