Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Merge pull request #5 from matrix-org/babolivier/get-retention-worker
Browse files Browse the repository at this point in the history
Fix room retention policy management in worker mode
  • Loading branch information
michaelkaye authored Sep 25, 2019
2 parents 07eb311 + f3dfbc8 commit efaf803
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 55 deletions.
1 change: 1 addition & 0 deletions changelog.d/5.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix room retention policy management in worker mode.
118 changes: 63 additions & 55 deletions synapse/storage/room.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,69 @@ def get_ratelimit_for_user(self, user_id):
else:
defer.returnValue(None)

@cachedInlineCallbacks()
def get_retention_policy_for_room(self, room_id):
"""Get the retention policy for a given room.
If no retention policy has been found for this room, returns a policy defined
by the configured default policy (which has None as both the 'min_lifetime' and
the 'max_lifetime' if no default policy has been defined in the server's
configuration).
Args:
room_id (str): The ID of the room to get the retention policy of.
Returns:
dict[int, int]: "min_lifetime" and "max_lifetime" for this room.
"""
# If the room retention feature is disabled, return a policy with no minimum nor
# maximum, in order not to filter out events we should filter out when sending to
# the client.
if not self.config.retention_enabled:
defer.returnValue({
"min_lifetime": None,
"max_lifetime": None,
})

def get_retention_policy_for_room_txn(txn):
txn.execute(
"""
SELECT min_lifetime, max_lifetime FROM room_retention
INNER JOIN current_state_events USING (event_id, room_id)
WHERE room_id = ?;
""",
(room_id,)
)

return self.cursor_to_dict(txn)

ret = yield self.runInteraction(
"get_retention_policy_for_room",
get_retention_policy_for_room_txn,
)

# If we don't know this room ID, ret will be None, in this case return the default
# policy.
if not ret:
defer.returnValue({
"min_lifetime": self.config.retention_default_min_lifetime,
"max_lifetime": self.config.retention_default_max_lifetime,
})

row = ret[0]

# If one of the room's policy's attributes isn't defined, use the matching
# attribute from the default policy.
# The default values will be None if no default policy has been defined, or if one
# of the attributes is missing from the default policy.
if row["min_lifetime"] is None:
row["min_lifetime"] = self.config.retention_default_min_lifetime

if row["max_lifetime"] is None:
row["max_lifetime"] = self.config.retention_default_max_lifetime

defer.returnValue(row)


class RoomStore(RoomWorkerStore, SearchStore):
def __init__(self, db_conn, hs):
Expand Down Expand Up @@ -835,58 +898,3 @@ def get_rooms_for_retention_period_in_range_txn(txn):
)

defer.returnValue(rooms)

@cachedInlineCallbacks()
def get_retention_policy_for_room(self, room_id):
"""Get the retention policy for a given room.
If no retention policy has been found for this room, returns a policy defined
by the configured default policy (which has None as both the 'min_lifetime' and
the 'max_lifetime' if no default policy has been defined in the server's
configuration).
Args:
room_id (str): The ID of the room to get the retention policy of.
Returns:
dict[int, int]: "min_lifetime" and "max_lifetime" for this room.
"""

def get_retention_policy_for_room_txn(txn):
txn.execute(
"""
SELECT min_lifetime, max_lifetime FROM room_retention
INNER JOIN current_state_events USING (event_id, room_id)
WHERE room_id = ?;
""",
(room_id,)
)

return self.cursor_to_dict(txn)

ret = yield self.runInteraction(
"get_retention_policy_for_room",
get_retention_policy_for_room_txn,
)

# If we don't know this room ID, ret will be None, in this case return the default
# policy.
if not ret:
defer.returnValue({
"min_lifetime": self.config.retention_default_min_lifetime,
"max_lifetime": self.config.retention_default_max_lifetime,
})

row = ret[0]

# If one of the room's policy's attributes isn't defined, use the matching
# attribute from the default policy.
# The default values will be None if no default policy has been defined, or if one
# of the attributes is missing from the default policy.
if row["min_lifetime"] is None:
row["min_lifetime"] = self.config.retention_default_min_lifetime

if row["max_lifetime"] is None:
row["max_lifetime"] = self.config.retention_default_max_lifetime

defer.returnValue(row)

0 comments on commit efaf803

Please sign in to comment.