From 5f1f06fecf978b3d05e7da10fb0023e1ba9443ad Mon Sep 17 00:00:00 2001 From: softsimon Date: Wed, 27 Jan 2021 01:49:11 +0700 Subject: [PATCH] Don't save disk cache on exit. Handle corrupted mempool disk cache. fixes #304 --- backend/src/api/disk-cache.ts | 74 ++++++++++------------------------- 1 file changed, 20 insertions(+), 54 deletions(-) diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index 201391d84..4400cc79a 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -1,6 +1,5 @@ import * as fs from 'fs'; const fsPromises = fs.promises; -import * as process from 'process'; import * as cluster from 'cluster'; import memPool from './mempool'; import blocks from './blocks'; @@ -10,19 +9,7 @@ class DiskCache { private static FILE_NAME = './cache.json'; private static FILE_NAMES = './cache{number}.json'; private static CHUNK_SIZE = 10000; - constructor() { - if (!cluster.isMaster) { - return; - } - process.on('SIGINT', () => { - this.saveCacheToDiskSync(); - process.exit(2); - }); - process.on('SIGTERM', () => { - this.saveCacheToDiskSync(); - process.exit(2); - }); - } + constructor() { } async $saveCacheToDisk(): Promise { if (!cluster.isMaster) { @@ -51,52 +38,31 @@ class DiskCache { } } - saveCacheToDiskSync(): void { - try { - logger.debug('Writing mempool and blocks data to disk cache...'); - const mempoolChunk_1 = Object.fromEntries(Object.entries(memPool.getMempool()).slice(0, DiskCache.CHUNK_SIZE)); - fs.writeFileSync(DiskCache.FILE_NAME, JSON.stringify({ - blocks: blocks.getBlocks(), - mempool: mempoolChunk_1 - }), {flag: 'w'}); - for (let i = 1; i < 10; i++) { - const mempoolChunk = Object.fromEntries( - Object.entries(memPool.getMempool()).slice( - DiskCache.CHUNK_SIZE * i, i === 9 ? undefined : DiskCache.CHUNK_SIZE * i + DiskCache.CHUNK_SIZE - ) - ); - fs.writeFileSync(DiskCache.FILE_NAMES.replace('{number}', i.toString()), JSON.stringify({ - mempool: mempoolChunk - }), {flag: 'w'}); - } - - logger.debug('Mempool and blocks data saved to disk cache'); - } catch (e) { - logger.warn('Error writing to cache file: ' + e.message || e); - } - } - loadMempoolCache() { if (!fs.existsSync(DiskCache.FILE_NAME)) { return; } - let data: any = {}; - const cacheData = fs.readFileSync(DiskCache.FILE_NAME, 'utf8'); - if (cacheData) { - logger.info('Restoring mempool and blocks data from disk cache'); - data = JSON.parse(cacheData); - } - - for (let i = 1; i < 10; i++) { - const fileName = DiskCache.FILE_NAMES.replace('{number}', i.toString()); - if (fs.existsSync(fileName)) { - const cacheData2 = JSON.parse(fs.readFileSync(fileName, 'utf8')); - Object.assign(data.mempool, cacheData2.mempool); + try { + let data: any = {}; + const cacheData = fs.readFileSync(DiskCache.FILE_NAME, 'utf8'); + if (cacheData) { + logger.info('Restoring mempool and blocks data from disk cache'); + data = JSON.parse(cacheData); } - } - memPool.setMempool(data.mempool); - blocks.setBlocks(data.blocks); + for (let i = 1; i < 10; i++) { + const fileName = DiskCache.FILE_NAMES.replace('{number}', i.toString()); + if (fs.existsSync(fileName)) { + const cacheData2 = JSON.parse(fs.readFileSync(fileName, 'utf8')); + Object.assign(data.mempool, cacheData2.mempool); + } + } + + memPool.setMempool(data.mempool); + blocks.setBlocks(data.blocks); + } catch (e) { + logger.warn('Failed to parse mempoool and blocks cache. Skipping...'); + } } }