Merge pull request #1311 from useautumn/charlie/infra-fixes

chore: no flakely errors on redis
This commit is contained in:
Charlie Lamb
2026-04-22 10:41:51 +01:00
committed by GitHub
2 changed files with 24 additions and 3 deletions

View File

@@ -14,6 +14,12 @@ const markDefaultRedisAvailability = (targetRedis: Redis, available: boolean) =>
available ? markRedisCommandSuccess() : markRedisCommandFailure();
};
const isRedisAvailabilityError = (targetRedis: Redis, error: unknown) => {
if (targetRedis.status !== "ready") return true;
const message = error instanceof Error ? error.message : String(error);
return /ECONN|ETIMEDOUT|timeout|closed|writeable|max retries/i.test(message);
};
const warnRedisUnavailable = ({
source,
error,
@@ -68,7 +74,8 @@ export const tryRedisNx = async <TUnavailable, TSuccess, TExists>({
if (result === "OK") return await onSuccess();
return await onKeyAlreadyExists();
} catch (error) {
markDefaultRedisAvailability(targetRedis, false);
if (isRedisAvailabilityError(targetRedis, error))
markDefaultRedisAvailability(targetRedis, false);
warnRedisUnavailable({ source: "tryRedisNx:error", error });
return await onRedisUnavailable();
}
@@ -103,7 +110,8 @@ export const tryRedisWrite = async <T>(
? true
: T | null;
} catch (error) {
markDefaultRedisAvailability(targetRedis, false);
if (isRedisAvailabilityError(targetRedis, error))
markDefaultRedisAvailability(targetRedis, false);
warnRedisUnavailable({ source: "tryRedisWrite:error", error });
return null as T extends void ? true : T | null;
}
@@ -134,7 +142,8 @@ export const tryRedisRead = async <T>(
markDefaultRedisAvailability(targetRedis, true);
return result;
} catch (error) {
markDefaultRedisAvailability(targetRedis, false);
if (isRedisAvailabilityError(targetRedis, error))
markDefaultRedisAvailability(targetRedis, false);
warnRedisUnavailable({ source: "tryRedisRead:error", error });
return null;
}

View File

@@ -139,4 +139,16 @@ describe("cache utils", () => {
expect(getRedisAvailability().state).toBe("healthy");
});
test("Redis command errors do not mark Redis unavailable", async () => {
markRedisCommandSuccess();
markRedisCommandSuccess();
expect(getRedisAvailability().state).toBe("healthy");
await tryRedisWrite(async () => {
throw new Error("ERR user_script:2: unexpected symbol near '#'");
});
expect(getRedisAvailability().state).toBe("healthy");
});
});