aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Boris Muratov <[email protected]>2021-03-01 19:46:08 +0200
committerGravatar Boris Muratov <[email protected]>2021-03-01 19:46:08 +0200
commit2293b9dc78d21a80043a9e9d24b9442caf7579df (patch)
treec53901d51d14a657b3a203ecf2332d792a4cf8c9
parentSync alert won't trigger with fake redis (diff)
Change to handle specifically redis errors
The idea to ignore alerts on fake redis didn't solve the problem completely, because sometimes you'll just develop with a real redis. It also didn't solve the ping we would get on first start up. After looking into it there seems like there's no actual reason to alert on key errors, as they should only happen if the cache gets wiped for some reason, which shouldn't happen, but in which case we have bigger issues. Alerts are therefore limited to connection errors raised by redis. This additionally handles only redis errors when writing to it as well. If any other error is raised it is ok for the function to stop at that point, as all variables have already been set. The only thing which doesn't get executed is the confirmation message and logging, the lack of which is an exception message in itself.
-rw-r--r--bot/exts/moderation/defcon.py26
1 files changed, 15 insertions, 11 deletions
diff --git a/bot/exts/moderation/defcon.py b/bot/exts/moderation/defcon.py
index aa6dc0790..3d3f0e81e 100644
--- a/bot/exts/moderation/defcon.py
+++ b/bot/exts/moderation/defcon.py
@@ -2,11 +2,11 @@ import asyncio
import logging
import traceback
from collections import namedtuple
-from contextlib import suppress
from datetime import datetime
from enum import Enum
from typing import Optional, Union
+from aioredis import RedisError
from async_rediscache import RedisCache
from dateutil.relativedelta import relativedelta
from discord import Colour, Embed, Member, User
@@ -14,7 +14,7 @@ from discord.ext import tasks
from discord.ext.commands import Cog, Context, group, has_any_role
from bot.bot import Bot
-from bot.constants import Channels, Colours, Emojis, Event, Icons, MODERATION_ROLES, Redis, Roles
+from bot.constants import Channels, Colours, Emojis, Event, Icons, MODERATION_ROLES, Roles
from bot.converters import DurationDelta, Expiry
from bot.exts.moderation.modlog import ModLog
from bot.utils.messages import format_user
@@ -87,13 +87,12 @@ class Defcon(Cog):
settings = await self.defcon_settings.to_dict()
self.threshold = parse_duration_string(settings["threshold"]) if settings["threshold"] else None
self.expiry = datetime.fromisoformat(settings["expiry"]) if settings["expiry"] else None
- except Exception:
+ except RedisError:
log.exception("Unable to get DEFCON settings!")
- if not Redis.use_fakeredis:
- await self.channel.send(
- f"<@&{Roles.moderators}> <@&{Roles.devops}> **WARNING**: Unable to get DEFCON settings!"
- f"\n\n```{traceback.format_exc()}```"
- )
+ await self.channel.send(
+ f"<@&{Roles.moderators}> <@&{Roles.devops}> **WARNING**: Unable to get DEFCON settings!"
+ f"\n\n```{traceback.format_exc()}```"
+ )
else:
if self.expiry:
@@ -210,14 +209,19 @@ class Defcon(Cog):
if self.expiry is not None:
self.scheduler.schedule_at(expiry, 0, self._remove_threshold())
- with suppress(Exception):
+ self._update_notifier()
+
+ # Make sure to handle the critical part of the update before writing to Redis.
+ error = ""
+ try:
await self.defcon_settings.update(
{
'threshold': Defcon._stringify_relativedelta(self.threshold) if self.threshold else "",
'expiry': expiry.isoformat() if expiry else 0
}
)
- self._update_notifier()
+ except RedisError:
+ error = ", but failed to write to cache"
action = Action.DURATION_UPDATE
@@ -234,7 +238,7 @@ class Defcon(Cog):
channel_message = "removed"
await self.channel.send(
- f"{action.value.emoji} DEFCON threshold {channel_message}."
+ f"{action.value.emoji} DEFCON threshold {channel_message}{error}."
)
await self._send_defcon_log(action, author)
self._update_channel_topic()