Wait for external assets file writers to complete

This commit is contained in:
nymkappa 2022-04-22 04:03:08 -04:00
parent e8d6872620
commit 0565471ecf
No known key found for this signature in database
GPG key ID: E155910B16E8BD04
5 changed files with 63 additions and 51 deletions

View file

@ -77,7 +77,7 @@ export class Common {
}; };
} }
static sleep(ms: number): Promise<void> { static sleep$(ms: number): Promise<void> {
return new Promise((resolve) => { return new Promise((resolve) => {
setTimeout(() => { setTimeout(() => {
resolve(); resolve();

View file

@ -1,8 +1,7 @@
import config from '../config'; import config from '../config';
import DB from '../database'; import DB from '../database';
import logger from '../logger'; import logger from '../logger';
import { Common } from './common';
const sleep = (ms: number) => new Promise(res => setTimeout(res, ms));
class DatabaseMigration { class DatabaseMigration {
private static currentVersion = 17; private static currentVersion = 17;
@ -25,7 +24,7 @@ class DatabaseMigration {
await this.$createMigrationStateTable(); await this.$createMigrationStateTable();
} catch (e) { } catch (e) {
logger.err('MIGRATIONS: Unable to create `state` table, aborting in 10 seconds. ' + e); logger.err('MIGRATIONS: Unable to create `state` table, aborting in 10 seconds. ' + e);
await sleep(10000); await Common.sleep$(10000);
process.exit(-1); process.exit(-1);
} }
logger.debug('MIGRATIONS: `state` table initialized.'); logger.debug('MIGRATIONS: `state` table initialized.');
@ -36,7 +35,7 @@ class DatabaseMigration {
databaseSchemaVersion = await this.$getSchemaVersionFromDatabase(); databaseSchemaVersion = await this.$getSchemaVersionFromDatabase();
} catch (e) { } catch (e) {
logger.err('MIGRATIONS: Unable to get current database migration version, aborting in 10 seconds. ' + e); logger.err('MIGRATIONS: Unable to get current database migration version, aborting in 10 seconds. ' + e);
await sleep(10000); await Common.sleep$(10000);
process.exit(-1); process.exit(-1);
} }
@ -52,7 +51,7 @@ class DatabaseMigration {
await this.$createMissingTablesAndIndexes(databaseSchemaVersion); await this.$createMissingTablesAndIndexes(databaseSchemaVersion);
} catch (e) { } catch (e) {
logger.err('MIGRATIONS: Unable to create required tables, aborting in 10 seconds. ' + e); logger.err('MIGRATIONS: Unable to create required tables, aborting in 10 seconds. ' + e);
await sleep(10000); await Common.sleep$(10000);
process.exit(-1); process.exit(-1);
} }

View file

@ -1,5 +1,4 @@
import * as fs from 'fs'; import * as fs from 'fs';
import config from '../../config';
import logger from '../../logger'; import logger from '../../logger';
class Icons { class Icons {

View file

@ -85,16 +85,16 @@ class Server {
this.setUpWebsocketHandling(); this.setUpWebsocketHandling();
await syncAssets.syncAssets(); await syncAssets.syncAssets$();
diskCache.loadMempoolCache(); diskCache.loadMempoolCache();
if (config.DATABASE.ENABLED) { if (config.DATABASE.ENABLED) {
await DB.checkDbConnection(); await DB.checkDbConnection();
try { try {
if (process.env.npm_config_reindex != undefined) { // Re-index requests if (process.env.npm_config_reindex !== undefined) { // Re-index requests
const tables = process.env.npm_config_reindex.split(','); const tables = process.env.npm_config_reindex.split(',');
logger.warn(`Indexed data for "${process.env.npm_config_reindex}" tables will be erased in 5 seconds (using '--reindex')`); logger.warn(`Indexed data for "${process.env.npm_config_reindex}" tables will be erased in 5 seconds (using '--reindex')`);
await Common.sleep(5000); await Common.sleep$(5000);
await databaseMigration.$truncateIndexedData(tables); await databaseMigration.$truncateIndexedData(tables);
} }
await databaseMigration.$initializeOrMigrateDatabase(); await databaseMigration.$initializeOrMigrateDatabase();

View file

@ -9,18 +9,23 @@ const PATH = './';
class SyncAssets { class SyncAssets {
constructor() { } constructor() { }
public async syncAssets() { public async syncAssets$() {
for (const url of config.MEMPOOL.EXTERNAL_ASSETS) { for (const url of config.MEMPOOL.EXTERNAL_ASSETS) {
await this.downloadFile(url); try {
await this.downloadFile$(url);
} catch (e) {
throw new Error(`Failed to download external asset. ` + (e instanceof Error ? e.message : e));
}
} }
} }
private async downloadFile(url: string) { private async downloadFile$(url: string) {
return new Promise((resolve, reject) => {
const fileName = url.split('/').slice(-1)[0]; const fileName = url.split('/').slice(-1)[0];
try { try {
if (config.SOCKS5PROXY.ENABLED) { if (config.SOCKS5PROXY.ENABLED) {
let socksOptions: any = { const socksOptions: any = {
agentOptions: { agentOptions: {
keepAlive: true, keepAlive: true,
}, },
@ -36,28 +41,37 @@ class SyncAssets {
const agent = new SocksProxyAgent(socksOptions); const agent = new SocksProxyAgent(socksOptions);
logger.info(`Downloading external asset ${fileName} over the Tor network...`); logger.info(`Downloading external asset ${fileName} over the Tor network...`);
await axios.get(url, { return axios.get(url, {
httpAgent: agent, httpAgent: agent,
httpsAgent: agent, httpsAgent: agent,
responseType: 'stream', responseType: 'stream',
timeout: 30000 timeout: 30000
}).then(function (response) { }).then(function (response) {
response.data.pipe(fs.createWriteStream(PATH + fileName)); const writer = fs.createWriteStream(PATH + fileName);
writer.on('finish', () => {
logger.info(`External asset ${fileName} saved to ${PATH + fileName}`); logger.info(`External asset ${fileName} saved to ${PATH + fileName}`);
resolve(0);
});
response.data.pipe(writer);
}); });
} else { } else {
logger.info(`Downloading external asset ${fileName} over clearnet...`); logger.info(`Downloading external asset ${fileName} over clearnet...`);
await axios.get(url, { return axios.get(url, {
responseType: 'stream', responseType: 'stream',
timeout: 30000 timeout: 30000
}).then(function (response) { }).then(function (response) {
response.data.pipe(fs.createWriteStream(PATH + fileName)); const writer = fs.createWriteStream(PATH + fileName);
writer.on('finish', () => {
logger.info(`External asset ${fileName} saved to ${PATH + fileName}`); logger.info(`External asset ${fileName} saved to ${PATH + fileName}`);
resolve(0);
});
response.data.pipe(writer);
}); });
} }
} catch (e: any) { } catch (e: any) {
throw new Error(`Failed to download external asset. ` + e); reject(e);
} }
});
} }
} }