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