From 7e2b30945009e0cbe02a6b11a585595d3e4858b0 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Thu, 20 Jul 2023 16:15:33 +0400 Subject: [PATCH] migration to delete expired messages (#801 is suspected to have caused temporary traffic increase due to flood of non expired messages) (#806) --- simplexmq.cabal | 1 + src/Simplex/Messaging/Agent/Store/SQLite.hs | 10 +--------- .../Agent/Store/SQLite/Migrations.hs | 4 +++- .../M20230720_delete_expired_messages.hs | 20 +++++++++++++++++++ .../Store/SQLite/Migrations/agent_schema.sql | 4 ++++ tests/XFTPAgent.hs | 1 - 6 files changed, 29 insertions(+), 11 deletions(-) create mode 100644 src/Simplex/Messaging/Agent/Store/SQLite/Migrations/M20230720_delete_expired_messages.hs diff --git a/simplexmq.cabal b/simplexmq.cabal index e61491639..237e66e89 100644 --- a/simplexmq.cabal +++ b/simplexmq.cabal @@ -85,6 +85,7 @@ library Simplex.Messaging.Agent.Store.SQLite.Migrations.M20230531_switch_status Simplex.Messaging.Agent.Store.SQLite.Migrations.M20230615_ratchet_sync Simplex.Messaging.Agent.Store.SQLite.Migrations.M20230701_delivery_receipts + Simplex.Messaging.Agent.Store.SQLite.Migrations.M20230720_delete_expired_messages Simplex.Messaging.Agent.TAsyncs Simplex.Messaging.Agent.TRcvQueues Simplex.Messaging.Client diff --git a/src/Simplex/Messaging/Agent/Store/SQLite.hs b/src/Simplex/Messaging/Agent/Store/SQLite.hs index 0d9e4df9f..87c342836 100644 --- a/src/Simplex/Messaging/Agent/Store/SQLite.hs +++ b/src/Simplex/Messaging/Agent/Store/SQLite.hs @@ -1058,15 +1058,7 @@ deleteSndMsgsExpired db ttl = do cutoffTs <- addUTCTime (- ttl) <$> getCurrentTime DB.execute db - [sql| - DELETE FROM messages - WHERE internal_id IN ( - SELECT s.internal_id - FROM snd_messages s - JOIN messages m USING (internal_id) - WHERE m.internal_ts < ? - ) - |] + "DELETE FROM messages WHERE internal_snd_id IS NOT NULL AND internal_ts < ?" (Only cutoffTs) createRatchetX3dhKeys :: DB.Connection -> ConnId -> C.PrivateKeyX448 -> C.PrivateKeyX448 -> IO () diff --git a/src/Simplex/Messaging/Agent/Store/SQLite/Migrations.hs b/src/Simplex/Messaging/Agent/Store/SQLite/Migrations.hs index 810bebd3c..704a645ee 100644 --- a/src/Simplex/Messaging/Agent/Store/SQLite/Migrations.hs +++ b/src/Simplex/Messaging/Agent/Store/SQLite/Migrations.hs @@ -64,6 +64,7 @@ import Simplex.Messaging.Agent.Store.SQLite.Migrations.M20230516_encrypted_rcv_m import Simplex.Messaging.Agent.Store.SQLite.Migrations.M20230531_switch_status import Simplex.Messaging.Agent.Store.SQLite.Migrations.M20230615_ratchet_sync import Simplex.Messaging.Agent.Store.SQLite.Migrations.M20230701_delivery_receipts +import Simplex.Messaging.Agent.Store.SQLite.Migrations.M20230720_delete_expired_messages import Simplex.Messaging.Encoding.String import Simplex.Messaging.Parsers (dropPrefix, sumTypeJSON) import Simplex.Messaging.Transport.Client (TransportHost) @@ -93,7 +94,8 @@ schemaMigrations = ("m20230516_encrypted_rcv_message_hashes", m20230516_encrypted_rcv_message_hashes, Just down_m20230516_encrypted_rcv_message_hashes), ("m20230531_switch_status", m20230531_switch_status, Just down_m20230531_switch_status), ("m20230615_ratchet_sync", m20230615_ratchet_sync, Just down_m20230615_ratchet_sync), - ("m20230701_delivery_receipts", m20230701_delivery_receipts, Just down_m20230701_delivery_receipts) + ("m20230701_delivery_receipts", m20230701_delivery_receipts, Just down_m20230701_delivery_receipts), + ("m20230720_delete_expired_messages", m20230720_delete_expired_messages, Just down_m20230720_delete_expired_messages) ] -- | The list of migrations in ascending order by date diff --git a/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/M20230720_delete_expired_messages.hs b/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/M20230720_delete_expired_messages.hs new file mode 100644 index 000000000..3cfdb688d --- /dev/null +++ b/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/M20230720_delete_expired_messages.hs @@ -0,0 +1,20 @@ +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.Messaging.Agent.Store.SQLite.Migrations.M20230720_delete_expired_messages where + +import Database.SQLite.Simple (Query) +import Database.SQLite.Simple.QQ (sql) + +m20230720_delete_expired_messages :: Query +m20230720_delete_expired_messages = + [sql| +CREATE INDEX idx_messages_internal_snd_id_ts ON messages(internal_snd_id, internal_ts); + +DELETE FROM messages WHERE internal_snd_id IS NOT NULL AND internal_ts < datetime('now', '-3 days'); +|] + +down_m20230720_delete_expired_messages :: Query +down_m20230720_delete_expired_messages = + [sql| +DROP INDEX idx_messages_internal_snd_id_ts; +|] diff --git a/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/agent_schema.sql b/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/agent_schema.sql index 10e3148b0..898be9721 100644 --- a/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/agent_schema.sql +++ b/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/agent_schema.sql @@ -467,3 +467,7 @@ CREATE INDEX idx_snd_messages_rcpt_internal_id ON snd_messages( conn_id, rcpt_internal_id ); +CREATE INDEX idx_messages_internal_snd_id_ts ON messages( + internal_snd_id, + internal_ts +); diff --git a/tests/XFTPAgent.hs b/tests/XFTPAgent.hs index b2b97e3cb..53a0184f3 100644 --- a/tests/XFTPAgent.hs +++ b/tests/XFTPAgent.hs @@ -16,7 +16,6 @@ import Data.Int (Int64) import Data.List (find, isSuffixOf) import Data.Maybe (fromJust) import SMPAgentClient (agentCfg, initAgentServers, testDB) -import SMPClient (xit'') import Simplex.FileTransfer.Description import Simplex.FileTransfer.Protocol (FileParty (..), XFTPErrorType (AUTH)) import Simplex.FileTransfer.Server.Env (XFTPServerConfig (..))