fix: prevent loop in case of logs with db down

This commit is contained in:
Rafael Taranto 2024-08-07 21:03:50 +01:00
parent dda217a29e
commit b9b532a633
2 changed files with 31 additions and 20 deletions

View file

@ -25,26 +25,30 @@ logger.info('Version: %s', version)
function run () { function run () {
const store = defaultStore() const store = defaultStore()
return asyncLocalStorage.run(store, () => { return asyncLocalStorage.run(store, () => {
let count = 0 return new Promise((resolve, reject) => {
let handler let count = 0
let handler
const errorHandler = err => { const errorHandler = err => {
count += 1 count += 1
logger.error(err) logger.error(err)
logger.error('[%d] Retrying in 10s...', count) logger.error('[%d] Retrying in 10s...', count)
} }
const runner = () => const runner = () => {
settingsLoader.loadLatest() settingsLoader.loadLatest()
.then(settings => { .then(settings => {
clearInterval(handler) clearInterval(handler)
return loadSanctions(settings) return loadSanctions(settings)
.then(() => startServer(settings)) .then(() => startServer(settings))
}) .then(resolve)
.catch(errorHandler) })
.catch(errorHandler)
}
handler = setInterval(runner, 10000) runner()
return runner() handler = setInterval(runner, 10000)
})
}) })
} }

View file

@ -7,6 +7,8 @@ const logger = require('./logger')
const eventBus = require('./event-bus') const eventBus = require('./event-bus')
const { asyncLocalStorage, defaultStore } = require('./async-storage') const { asyncLocalStorage, defaultStore } = require('./async-storage')
const DATABASE_NOT_REACHABLE = 'Database not reachable.'
const stripDefaultDbFuncs = dbCtx => { const stripDefaultDbFuncs = dbCtx => {
return { return {
ctx: dbCtx.ctx, ctx: dbCtx.ctx,
@ -78,12 +80,12 @@ const pgp = Pgp({
obj.$task = (opts, cb) => typeof opts === 'function' ? _task(obj, {}, opts) : _task(obj, opts, cb) obj.$task = (opts, cb) => typeof opts === 'function' ? _task(obj, {}, opts) : _task(obj, opts, cb)
}, },
error: (err, e) => { error: (err, e) => {
if (e.cn) logger.error('Database not reachable.') if (e.cn) logger.error(DATABASE_NOT_REACHABLE)
if (e.query) { else if (e.query) {
logger.error(e.query) logger.error(e.query)
e.params && logger.error(e.params) 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 if (process.env.SKIP_SERVER_LOGS) return
const { level, message, meta } = args 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 msgToSave = message || _.get('message', meta)
const sql = `insert into server_logs const sql = `insert into server_logs
@ -103,6 +109,7 @@ eventBus.subscribe('log', args => {
asyncLocalStorage.run(store, () => { asyncLocalStorage.run(store, () => {
db.one(sql, [uuid.v4(), '', msgToSave, level, meta]) db.one(sql, [uuid.v4(), '', msgToSave, level, meta])
.then(_.mapKeys(_.camelCase)) .then(_.mapKeys(_.camelCase))
.catch(_.noop)
}) })
}) })