Introduce matrix room purging
This commit is contained in:
parent
8c0bb34169
commit
6f5689778d
1 changed files with 26 additions and 4 deletions
|
@ -111,6 +111,13 @@ purgeUpToEvent token roomId upToTime (eventName, eventTime) =
|
||||||
(decode . encodeUtf8 . rspBody $ resp)
|
(decode . encodeUtf8 . rspBody $ resp)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
purgeRoom :: Text -> Text -> IO ()
|
||||||
|
purgeRoom token roomID = handleResponse =<< (simpleHTTP . giveToken token) (postRequestWithBody url contentType body)
|
||||||
|
where
|
||||||
|
body = [i|{"room_id":"${roomID}"}|]
|
||||||
|
url = [i|#{apiUrl}/purge_room|]
|
||||||
|
handleResponse = either (\e -> sayErr [i|Could not purge room #{roomID}. Error #{e}|]) (const pass)
|
||||||
|
|
||||||
processRoom :: Text -> PSQL.Connection -> UTCTime -> Text -> IO ()
|
processRoom :: Text -> PSQL.Connection -> UTCTime -> Text -> IO ()
|
||||||
processRoom token conn upToTime roomId = do
|
processRoom token conn upToTime roomId = do
|
||||||
whenJustM (queryLastKeptEvent conn roomId) (purgeUpToEvent token roomId upToTime)
|
whenJustM (queryLastKeptEvent conn roomId) (purgeUpToEvent token roomId upToTime)
|
||||||
|
@ -119,17 +126,32 @@ processRoom token conn upToTime roomId = do
|
||||||
cat filename |> psql "matrix-synapse"
|
cat filename |> psql "matrix-synapse"
|
||||||
rm filename
|
rm filename
|
||||||
|
|
||||||
|
locallyUnjoinedRoomsQuery = "SELECT r.room_id FROM rooms AS r LEFT JOIN (SELECT room_id FROM local_current_membership WHERE membership = 'join' GROUP BY room_id) AS l ON l.room_id = r.room_id WHERE l.room_id IS NULL"
|
||||||
|
largeRoomsQuery = "SELECT q.room_id FROM (select count(*) as numberofusers, room_id FROM current_state_events WHERE type ='m.room.member' AND membership = 'join' GROUP BY room_id) AS q LEFT JOIN room_aliases a ON q.room_id=a.room_id WHERE q.numberofusers > ? ORDER BY numberofusers desc"
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
_ <- missingExecutables
|
_ <- missingExecutables
|
||||||
hSetBuffering stdout LineBuffering
|
hSetBuffering stdout LineBuffering
|
||||||
|
|
||||||
upToTime <- addUTCTime ((-1) * realToFrac daysOld * nominalDay) <$> getCurrentTime
|
upToTime <- addUTCTime ((-1) * realToFrac daysOld * nominalDay) <$> getCurrentTime
|
||||||
|
let upToTimeStamp = floor . (* 1000) . utcTimeToPOSIXSeconds $ upToTime
|
||||||
|
|
||||||
conn <- connectPostgreSQL "dbname='matrix-synapse'"
|
conn <- connectPostgreSQL "dbname='matrix-synapse'"
|
||||||
token <- getToken conn
|
token <- getToken conn
|
||||||
let upToTimeStamp = floor . (* 1000) . utcTimeToPOSIXSeconds $ upToTime
|
|
||||||
queryString = "SELECT q.room_id FROM (select count(*) as numberofusers, room_id FROM current_state_events WHERE type ='m.room.member' GROUP BY room_id) AS q LEFT JOIN room_aliases a ON q.room_id=a.room_id WHERE q.numberofusers > ? ORDER BY numberofusers desc"
|
-- Get rooms without locally member and purge them
|
||||||
roomIds <- fromOnly @Text <<$>> query conn queryString (Only minUsersToPurgeRoom)
|
say "Purging obsolete rooms ..."
|
||||||
mapM_ (processRoom token conn upToTime) roomIds
|
obsoleteRoomIds <- fromOnly @Text <<$>> query conn locallyUnjoinedRoomsQuery ()
|
||||||
|
mapM_ (purgeRoom token) obsoleteRoomIds
|
||||||
|
|
||||||
|
-- Get large rooms and then
|
||||||
|
-- 1. only keep max(last 30 days, 500 events) of history
|
||||||
|
-- 2. compress state events
|
||||||
|
say "Compressing large rooms ..."
|
||||||
|
largeRoomIds <- fromOnly @Text <<$>> query conn largeRoomsQuery (Only minUsersToPurgeRoom)
|
||||||
|
mapM_ (processRoom token conn upToTime) largeRoomIds
|
||||||
|
|
||||||
say "Pruning remote media ..."
|
say "Pruning remote media ..."
|
||||||
_ <- simpleHTTP . giveToken token . postRequest $ [i|#{apiUrl}/purge_media_cache/?before_ts=#{upToTimeStamp}|]
|
_ <- simpleHTTP . giveToken token . postRequest $ [i|#{apiUrl}/purge_media_cache/?before_ts=#{upToTimeStamp}|]
|
||||||
say "Finished"
|
say "Finished"
|
||||||
|
|
Loading…
Reference in a new issue