From 73d3ec204829dcffba4520293e747bdd5d5a8741 Mon Sep 17 00:00:00 2001
From: Richard Petersen <richard.petersen@open-xchange.com>
Date: Fri, 9 Dec 2022 11:41:11 +0100
Subject: [PATCH] fix: OXUIB-2001 - Service doesn't recover from missing Redis
 service

root cause: When redis was not available, some files could not be saved in the local memory and therefore this error permanently occurs even though the node responded correctly.
solution: Improve robustness when redis is not available
---
 src/cache.js | 15 +++++++++------
 src/redis.js |  6 +++---
 2 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/src/cache.js b/src/cache.js
index 9deb51b..bb56d03 100644
--- a/src/cache.js
+++ b/src/cache.js
@@ -16,7 +16,7 @@ export function set (key, value) {
   if (cache[key] === value) return
   cache[key] = value
   if (redis.isEnabled()) {
-    return redis.client.set(key, value)
+    return redis.client.set(key, value).catch(err => logger.error(err))
   }
 }
 
@@ -35,7 +35,7 @@ export function get (key, fallback) {
 
   const promise = (async () => {
     if (redis.isEnabled()) {
-      let result = await redis.client.get(key)
+      let result = await redis.client.get(key).catch(err => logger.error(err))
       if (result) {
         logger.debug(`[Cache] Resolve from redis: ${key}`)
         result = JSON.parse(result)
@@ -50,7 +50,7 @@ export function get (key, fallback) {
     if (fallbackResult) {
       logger.debug(`[Cache] Found a getter for: ${key}`)
       cache[key] = fallbackResult
-      if (redis.isEnabled()) redis.client.set(key, JSON.stringify(fallbackResult))
+      if (redis.isEnabled()) redis.client.set(key, JSON.stringify(fallbackResult)).catch(err => logger.error(err))
     }
     return fallbackResult
   })()
@@ -79,7 +79,10 @@ export function getFile ({ name, version }, fallback) {
       const [body, meta = '{}'] = await Promise.all([
         redis.client.getBuffer(bodyKey),
         redis.client.get(metaKey)
-      ])
+      ]).catch((err) => {
+        logger.error(`[Cache] could not access redis: ${err}`)
+        return []
+      })
 
       if (body) {
         logger.debug(`[Cache] Resolve file from redis: ${key}`)
@@ -96,8 +99,8 @@ export function getFile ({ name, version }, fallback) {
     if (redis.isEnabled()) {
       logger.debug(`[Cache] Store file in redis: ${key}`)
       const { body, ...rest } = dataFromServer
-      redis.client.set(bodyKey, createWritable(body))
-      redis.client.set(metaKey, JSON.stringify(rest))
+      redis.client.set(bodyKey, createWritable(body)).catch(err => logger.error(`[Cache] could not store ${bodyKey}: ${err}`))
+      redis.client.set(metaKey, JSON.stringify(rest)).catch(err => logger.error(`[Cache] could not store ${metaKey}: ${err}`))
     }
 
     // overwrite cache with synchronous data
diff --git a/src/redis.js b/src/redis.js
index b1c8aee..9286d08 100644
--- a/src/redis.js
+++ b/src/redis.js
@@ -9,8 +9,8 @@ const createClient = (type, options = {}) => {
   if (!isEnabled()) {
     return new Proxy({
       getBuffer () {},
-      get () {},
-      set () {},
+      get () { return Promise.resolve() },
+      set () { return Promise.resolve() },
       del () {},
       flushdb () { return {} },
       status: '',
@@ -47,7 +47,7 @@ export async function isReady () {
   }).catch(() => false)
 }
 
-export const client = createClient('common client')
+export const client = createClient('common client', { maxRetriesPerRequest: 1 })
 export const pubClient = createClient('pub client')
 export const subClient = createClient('sub client', commonQueueOptions)
 
-- 
GitLab