Merge pull request #12664 from Budibase/fix/budi-7857-redis-issue

Support Redis reconnection after connection interruption
This commit is contained in:
Michael Drury 2023-12-29 17:16:50 +00:00 committed by GitHub
commit 2e0a50990a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 15 deletions

View File

@ -47,7 +47,7 @@ export function createQueue<T>(
cleanupInterval = timers.set(cleanup, CLEANUP_PERIOD_MS) cleanupInterval = timers.set(cleanup, CLEANUP_PERIOD_MS)
// fire off an initial cleanup // fire off an initial cleanup
cleanup().catch(err => { cleanup().catch(err => {
console.error(`Unable to cleanup automation queue initially - ${err}`) console.error(`Unable to cleanup ${jobQueue} initially - ${err}`)
}) })
} }
return queue return queue

View File

@ -18,6 +18,7 @@ import {
SelectableDatabase, SelectableDatabase,
getRedisConnectionDetails, getRedisConnectionDetails,
} from "./utils" } from "./utils"
import { logAlert } from "../logging"
import * as timers from "../timers" import * as timers from "../timers"
const RETRY_PERIOD_MS = 2000 const RETRY_PERIOD_MS = 2000
@ -39,21 +40,16 @@ function pickClient(selectDb: number): any {
return CLIENTS[selectDb] return CLIENTS[selectDb]
} }
function connectionError( function connectionError(timeout: NodeJS.Timeout, err: Error | string) {
selectDb: number,
timeout: NodeJS.Timeout,
err: Error | string
) {
// manually shut down, ignore errors // manually shut down, ignore errors
if (CLOSED) { if (CLOSED) {
return return
} }
pickClient(selectDb).disconnect()
CLOSED = true CLOSED = true
// always clear this on error // always clear this on error
clearTimeout(timeout) clearTimeout(timeout)
CONNECTED = false CONNECTED = false
console.error("Redis connection failed - " + err) logAlert("Redis connection failed", err)
setTimeout(() => { setTimeout(() => {
init() init()
}, RETRY_PERIOD_MS) }, RETRY_PERIOD_MS)
@ -79,11 +75,7 @@ function init(selectDb = DEFAULT_SELECT_DB) {
// start the timer - only allowed 5 seconds to connect // start the timer - only allowed 5 seconds to connect
timeout = setTimeout(() => { timeout = setTimeout(() => {
if (!CONNECTED) { if (!CONNECTED) {
connectionError( connectionError(timeout, "Did not successfully connect in timeout")
selectDb,
timeout,
"Did not successfully connect in timeout"
)
} }
}, STARTUP_TIMEOUT_MS) }, STARTUP_TIMEOUT_MS)
@ -106,12 +98,13 @@ function init(selectDb = DEFAULT_SELECT_DB) {
// allow the process to exit // allow the process to exit
return return
} }
connectionError(selectDb, timeout, err) connectionError(timeout, err)
}) })
client.on("error", (err: Error) => { client.on("error", (err: Error) => {
connectionError(selectDb, timeout, err) connectionError(timeout, err)
}) })
client.on("connect", () => { client.on("connect", () => {
console.log(`Connected to Redis DB: ${selectDb}`)
clearTimeout(timeout) clearTimeout(timeout)
CONNECTED = true CONNECTED = true
}) })