Merge pull request #1569 from mempool/nymkappa/bugfix/bisq-dump-loading
Read bisq dump blocks line by line and parse manually
This commit is contained in:
		
						commit
						14e23831eb
					
				| @ -157,8 +157,7 @@ class Bisq { | |||||||
| 
 | 
 | ||||||
|   private async loadBisqDumpFile(): Promise<void> { |   private async loadBisqDumpFile(): Promise<void> { | ||||||
|     try { |     try { | ||||||
|       const data = await this.loadData(); |       await this.loadData(); | ||||||
|       await this.loadBisqBlocksDump(data); |  | ||||||
|       this.buildIndex(); |       this.buildIndex(); | ||||||
|       this.calculateStats(); |       this.calculateStats(); | ||||||
|     } catch (e) { |     } catch (e) { | ||||||
| @ -241,36 +240,61 @@ class Bisq { | |||||||
|     }; |     }; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   private async loadBisqBlocksDump(cacheData: string): Promise<void> { |   private async loadData(): Promise<any> { | ||||||
|     const start = new Date().getTime(); |     if (!fs.existsSync(Bisq.BLOCKS_JSON_FILE_PATH)) { | ||||||
|     if (cacheData && cacheData.length !== 0) { |       throw new Error(Bisq.BLOCKS_JSON_FILE_PATH + ` doesn't exist`); | ||||||
|       logger.debug('Processing Bisq data dump...'); |  | ||||||
|       const data: BisqBlocks = await this.jsonParsePool.exec(cacheData); |  | ||||||
|       if (data.blocks && data.blocks.length !== this.allBlocks.length) { |  | ||||||
|         this.allBlocks = data.blocks; |  | ||||||
|         this.allBlocks.reverse(); |  | ||||||
|         this.blocks = this.allBlocks.filter((block) => block.txs.length > 0); |  | ||||||
|         this.latestBlockHeight = data.chainHeight; |  | ||||||
|         const time = new Date().getTime() - start; |  | ||||||
|         logger.debug('Bisq dump processed in ' + time + ' ms (worker thread)'); |  | ||||||
|       } else { |  | ||||||
|         throw new Error(`Bisq dump didn't contain any blocks`); |  | ||||||
|       } |  | ||||||
|     } |     } | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   private loadData(): Promise<string> { |     const readline = require('readline'); | ||||||
|     return new Promise((resolve, reject) => { |     const events = require('events'); | ||||||
|       if (!fs.existsSync(Bisq.BLOCKS_JSON_FILE_PATH)) { | 
 | ||||||
|         return reject(Bisq.BLOCKS_JSON_FILE_PATH + ` doesn't exist`); |     const rl = readline.createInterface({ | ||||||
|       } |       input: fs.createReadStream(Bisq.BLOCKS_JSON_FILE_PATH), | ||||||
|       fs.readFile(Bisq.BLOCKS_JSON_FILE_PATH, 'utf8', (err, data) => { |       crlfDelay: Infinity | ||||||
|         if (err) { |  | ||||||
|           reject(err); |  | ||||||
|         } |  | ||||||
|         resolve(data); |  | ||||||
|       }); |  | ||||||
|     }); |     }); | ||||||
|  | 
 | ||||||
|  |     let blockBuffer = ''; | ||||||
|  |     let readingBlock = false; | ||||||
|  |     let lineCount = 1; | ||||||
|  |     const start = new Date().getTime(); | ||||||
|  | 
 | ||||||
|  |     logger.debug('Processing Bisq data dump...'); | ||||||
|  | 
 | ||||||
|  |     rl.on('line', (line) => { | ||||||
|  |       if (lineCount === 2) { | ||||||
|  |         line = line.replace('  "chainHeight": ', ''); | ||||||
|  |         this.latestBlockHeight = parseInt(line, 10); | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       if (line === '    {') { | ||||||
|  |         readingBlock = true; | ||||||
|  |       } else if (line === '    },') { | ||||||
|  |         blockBuffer += '}'; | ||||||
|  |         try { | ||||||
|  |           const block: BisqBlock =  JSON.parse(blockBuffer); | ||||||
|  |           this.allBlocks.push(block); | ||||||
|  |           readingBlock = false; | ||||||
|  |           blockBuffer = ''; | ||||||
|  |         } catch (e) { | ||||||
|  |           logger.debug(blockBuffer); | ||||||
|  |           throw Error(`Unable to parse Bisq data dump at line ${lineCount}` + (e instanceof Error ? e.message : e)); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       if (readingBlock === true) { | ||||||
|  |         blockBuffer += line; | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       ++lineCount; | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     await events.once(rl, 'close'); | ||||||
|  | 
 | ||||||
|  |     this.allBlocks.reverse(); | ||||||
|  |     this.blocks = this.allBlocks.filter((block) => block.txs.length > 0); | ||||||
|  | 
 | ||||||
|  |     const time = new Date().getTime() - start; | ||||||
|  |     logger.debug('Bisq dump processed in ' + time + ' ms'); | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user