diff --git a/lib/app.js b/lib/app.js index 88789f51..08d552df 100644 --- a/lib/app.js +++ b/lib/app.js @@ -25,26 +25,30 @@ logger.info('Version: %s', version) function run () { const store = defaultStore() return asyncLocalStorage.run(store, () => { - let count = 0 - let handler + return new Promise((resolve, reject) => { + let count = 0 + let handler - const errorHandler = err => { - count += 1 - logger.error(err) - logger.error('[%d] Retrying in 10s...', count) - } + const errorHandler = err => { + count += 1 + logger.error(err) + logger.error('[%d] Retrying in 10s...', count) + } - const runner = () => - settingsLoader.loadLatest() - .then(settings => { - clearInterval(handler) - return loadSanctions(settings) - .then(() => startServer(settings)) - }) - .catch(errorHandler) + const runner = () => { + settingsLoader.loadLatest() + .then(settings => { + clearInterval(handler) + return loadSanctions(settings) + .then(() => startServer(settings)) + .then(resolve) + }) + .catch(errorHandler) + } - handler = setInterval(runner, 10000) - return runner() + runner() + handler = setInterval(runner, 10000) + }) }) } diff --git a/lib/db.js b/lib/db.js index 4a66e566..6dc9778a 100644 --- a/lib/db.js +++ b/lib/db.js @@ -7,6 +7,8 @@ const logger = require('./logger') const eventBus = require('./event-bus') const { asyncLocalStorage, defaultStore } = require('./async-storage') +const DATABASE_NOT_REACHABLE = 'Database not reachable.' + const stripDefaultDbFuncs = dbCtx => { return { ctx: dbCtx.ctx, @@ -78,12 +80,12 @@ const pgp = Pgp({ obj.$task = (opts, cb) => typeof opts === 'function' ? _task(obj, {}, opts) : _task(obj, opts, cb) }, error: (err, e) => { - if (e.cn) logger.error('Database not reachable.') - if (e.query) { + if (e.cn) logger.error(DATABASE_NOT_REACHABLE) + else if (e.query) { logger.error(e.query) e.params && logger.error(e.params) } - logger.error(err) + else logger.error(err) } }) @@ -93,6 +95,10 @@ eventBus.subscribe('log', args => { if (process.env.SKIP_SERVER_LOGS) return const { level, message, meta } = args + + // prevent loop if database is not reachable + if (message === DATABASE_NOT_REACHABLE) return + const msgToSave = message || _.get('message', meta) const sql = `insert into server_logs @@ -103,6 +109,7 @@ eventBus.subscribe('log', args => { asyncLocalStorage.run(store, () => { db.one(sql, [uuid.v4(), '', msgToSave, level, meta]) .then(_.mapKeys(_.camelCase)) + .catch(_.noop) }) })