mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-08-07 21:52:36 -04:00
Option to suppress resource exceeded alerting (#6173)
The expected use case is to suppress MAU limiting on small instances
This commit is contained in:
parent
92e88a71d3
commit
2794b79052
8 changed files with 160 additions and 46 deletions
|
@ -20,6 +20,7 @@ from twisted.internet import defer
|
|||
|
||||
from synapse.api.constants import (
|
||||
EventTypes,
|
||||
LimitBlockingTypes,
|
||||
ServerNoticeLimitReached,
|
||||
ServerNoticeMsgType,
|
||||
)
|
||||
|
@ -70,7 +71,7 @@ class ResourceLimitsServerNotices(object):
|
|||
return
|
||||
|
||||
if not self._server_notices_manager.is_enabled():
|
||||
# Don't try and send server notices unles they've been enabled
|
||||
# Don't try and send server notices unless they've been enabled
|
||||
return
|
||||
|
||||
timestamp = yield self._store.user_last_seen_monthly_active(user_id)
|
||||
|
@ -79,8 +80,6 @@ class ResourceLimitsServerNotices(object):
|
|||
# In practice, not sure we can ever get here
|
||||
return
|
||||
|
||||
# Determine current state of room
|
||||
|
||||
room_id = yield self._server_notices_manager.get_notice_room_for_user(user_id)
|
||||
|
||||
if not room_id:
|
||||
|
@ -88,50 +87,85 @@ class ResourceLimitsServerNotices(object):
|
|||
return
|
||||
|
||||
yield self._check_and_set_tags(user_id, room_id)
|
||||
|
||||
# Determine current state of room
|
||||
currently_blocked, ref_events = yield self._is_room_currently_blocked(room_id)
|
||||
|
||||
limit_msg = None
|
||||
limit_type = None
|
||||
try:
|
||||
# Normally should always pass in user_id if you have it, but in
|
||||
# this case are checking what would happen to other users if they
|
||||
# were to arrive.
|
||||
try:
|
||||
yield self._auth.check_auth_blocking()
|
||||
is_auth_blocking = False
|
||||
except ResourceLimitError as e:
|
||||
is_auth_blocking = True
|
||||
event_content = e.msg
|
||||
event_limit_type = e.limit_type
|
||||
# Normally should always pass in user_id to check_auth_blocking
|
||||
# if you have it, but in this case are checking what would happen
|
||||
# to other users if they were to arrive.
|
||||
yield self._auth.check_auth_blocking()
|
||||
except ResourceLimitError as e:
|
||||
limit_msg = e.msg
|
||||
limit_type = e.limit_type
|
||||
|
||||
if currently_blocked and not is_auth_blocking:
|
||||
try:
|
||||
if (
|
||||
limit_type == LimitBlockingTypes.MONTHLY_ACTIVE_USER
|
||||
and not self._config.mau_limit_alerting
|
||||
):
|
||||
# We have hit the MAU limit, but MAU alerting is disabled:
|
||||
# reset room if necessary and return
|
||||
if currently_blocked:
|
||||
self._remove_limit_block_notification(user_id, ref_events)
|
||||
return
|
||||
|
||||
if currently_blocked and not limit_msg:
|
||||
# Room is notifying of a block, when it ought not to be.
|
||||
# Remove block notification
|
||||
content = {"pinned": ref_events}
|
||||
yield self._server_notices_manager.send_notice(
|
||||
user_id, content, EventTypes.Pinned, ""
|
||||
)
|
||||
|
||||
elif not currently_blocked and is_auth_blocking:
|
||||
yield self._remove_limit_block_notification(user_id, ref_events)
|
||||
elif not currently_blocked and limit_msg:
|
||||
# Room is not notifying of a block, when it ought to be.
|
||||
# Add block notification
|
||||
content = {
|
||||
"body": event_content,
|
||||
"msgtype": ServerNoticeMsgType,
|
||||
"server_notice_type": ServerNoticeLimitReached,
|
||||
"admin_contact": self._config.admin_contact,
|
||||
"limit_type": event_limit_type,
|
||||
}
|
||||
event = yield self._server_notices_manager.send_notice(
|
||||
user_id, content, EventTypes.Message
|
||||
yield self._apply_limit_block_notification(
|
||||
user_id, limit_msg, limit_type
|
||||
)
|
||||
|
||||
content = {"pinned": [event.event_id]}
|
||||
yield self._server_notices_manager.send_notice(
|
||||
user_id, content, EventTypes.Pinned, ""
|
||||
)
|
||||
|
||||
except SynapseError as e:
|
||||
logger.error("Error sending resource limits server notice: %s", e)
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def _remove_limit_block_notification(self, user_id, ref_events):
|
||||
"""Utility method to remove limit block notifications from the server
|
||||
notices room.
|
||||
|
||||
Args:
|
||||
user_id (str): user to notify
|
||||
ref_events (list[str]): The event_ids of pinned events that are unrelated to
|
||||
limit blocking and need to be preserved.
|
||||
"""
|
||||
content = {"pinned": ref_events}
|
||||
yield self._server_notices_manager.send_notice(
|
||||
user_id, content, EventTypes.Pinned, ""
|
||||
)
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def _apply_limit_block_notification(self, user_id, event_body, event_limit_type):
|
||||
"""Utility method to apply limit block notifications in the server
|
||||
notices room.
|
||||
|
||||
Args:
|
||||
user_id (str): user to notify
|
||||
event_body(str): The human readable text that describes the block.
|
||||
event_limit_type(str): Specifies the type of block e.g. monthly active user
|
||||
limit has been exceeded.
|
||||
"""
|
||||
content = {
|
||||
"body": event_body,
|
||||
"msgtype": ServerNoticeMsgType,
|
||||
"server_notice_type": ServerNoticeLimitReached,
|
||||
"admin_contact": self._config.admin_contact,
|
||||
"limit_type": event_limit_type,
|
||||
}
|
||||
event = yield self._server_notices_manager.send_notice(
|
||||
user_id, content, EventTypes.Message
|
||||
)
|
||||
|
||||
content = {"pinned": [event.event_id]}
|
||||
yield self._server_notices_manager.send_notice(
|
||||
user_id, content, EventTypes.Pinned, ""
|
||||
)
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def _check_and_set_tags(self, user_id, room_id):
|
||||
"""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue