From 366b58ead59c12a12f404eda0a540e446f24eaf2 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Thu, 28 Mar 2024 19:52:06 +0400 Subject: [PATCH] core: don't save async commands records for ack (#3904) --- simplex-chat.cabal | 1 + src/Simplex/Chat.hs | 94 ++++++++----------- src/Simplex/Chat/Messages.hs | 5 +- .../M20240313_drop_agent_ack_cmd_id.hs | 22 +++++ src/Simplex/Chat/Migrations/chat_schema.sql | 5 - src/Simplex/Chat/Store/Messages.hs | 21 +---- src/Simplex/Chat/Store/Migrations.hs | 4 +- src/Simplex/Chat/Types.hs | 2 +- tests/SchemaDump.hs | 4 +- 9 files changed, 76 insertions(+), 82 deletions(-) create mode 100644 src/Simplex/Chat/Migrations/M20240313_drop_agent_ack_cmd_id.hs diff --git a/simplex-chat.cabal b/simplex-chat.cabal index 0fea7c79cf..15eb8add7d 100644 --- a/simplex-chat.cabal +++ b/simplex-chat.cabal @@ -138,6 +138,7 @@ library Simplex.Chat.Migrations.M20240222_app_settings Simplex.Chat.Migrations.M20240226_users_restrict Simplex.Chat.Migrations.M20240228_pq + Simplex.Chat.Migrations.M20240313_drop_agent_ack_cmd_id Simplex.Chat.Mobile Simplex.Chat.Mobile.File Simplex.Chat.Mobile.Shared diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs index 569a6fe392..2a85fb8670 100644 --- a/src/Simplex/Chat.hs +++ b/src/Simplex/Chat.hs @@ -3181,6 +3181,7 @@ cleanupManager = do forM_ us $ cleanupUser interval stepDelay forM_ us' $ cleanupUser interval stepDelay cleanupMessages `catchChatError` (toView . CRChatError Nothing) + -- TODO possibly, also cleanup async commands cleanupProbes `catchChatError` (toView . CRChatError Nothing) liftIO $ threadDelay' $ diffToMicroseconds interval where @@ -3589,15 +3590,13 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = -- TODO only acknowledge without saving message? -- probably this branch is never executed, so there should be no reason -- to save message if contact hasn't been created yet - chat item isn't created anyway - withAckMessage agentConnId conn meta False $ \cmdId -> do - (_conn', _) <- saveDirectRcvMSG conn meta cmdId msgBody - pure False + withAckMessage' agentConnId meta $ + void $ saveDirectRcvMSG conn meta msgBody SENT msgId -> sentMsgDeliveryEvent conn msgId OK -> -- [async agent commands] continuation on receiving OK - withCompletedCommand conn agentMsg $ \CommandData {cmdFunction, cmdId} -> - when (cmdFunction == CFAckMessage) $ ackMsgDeliveryEvent conn cmdId + when (corrId /= "") $ withCompletedCommand conn agentMsg $ \_cmdData -> pure () MERR _ err -> do toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity) incAuthErrCounter connEntity conn err @@ -3622,11 +3621,11 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = sendXGrpMemInv hostConnId (Just directConnReq) xGrpMemIntroCont CRContactUri _ -> throwChatError $ CECommandError "unexpected ConnectionRequestUri type" MSG msgMeta _msgFlags msgBody -> - withAckMessage agentConnId conn msgMeta True $ \cmdId -> do + withAckMessage agentConnId msgMeta True $ do let MsgMeta {pqEncryption} = msgMeta (ct', conn') <- updateContactPQRcv user ct conn pqEncryption checkIntegrityCreateItem (CDDirectRcv ct') msgMeta `catchChatError` \_ -> pure () - (conn'', msg@RcvMessage {chatMsgEvent = ACME _ event}) <- saveDirectRcvMSG conn' msgMeta cmdId msgBody + (conn'', msg@RcvMessage {chatMsgEvent = ACME _ event}) <- saveDirectRcvMSG conn' msgMeta msgBody let ct'' = ct' {activeConn = Just conn''} :: Contact assertDirectAllowed user MDRcv ct'' $ toCMEventTag event updateChatLock "direct message" event @@ -3656,7 +3655,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = let Contact {chatSettings = ChatSettings {sendRcpts}} = ct'' pure $ fromMaybe (sendRcptsContacts user) sendRcpts && hasDeliveryReceipt (toCMEventTag event) RCVD msgMeta msgRcpt -> - withAckMessage' agentConnId conn msgMeta $ + withAckMessage' agentConnId msgMeta $ directMsgReceived ct conn msgMeta msgRcpt CONF confId pqSupport _ connInfo -> do conn' <- processCONFpqSupport conn pqSupport @@ -3764,8 +3763,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = createInternalChatItem user (CDDirectRcv ct') (CIRcvConnEvent $ RCERatchetSync rss) Nothing OK -> -- [async agent commands] continuation on receiving OK - withCompletedCommand conn agentMsg $ \CommandData {cmdFunction, cmdId} -> - when (cmdFunction == CFAckMessage) $ ackMsgDeliveryEvent conn cmdId + when (corrId /= "") $ withCompletedCommand conn agentMsg $ \_cmdData -> pure () MERR msgId err -> do updateDirectItemStatus ct conn msgId $ agentErrToItemStatus err toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity) @@ -4031,11 +4029,11 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = void $ sendDirectMemberMessage imConn (XGrpMemCon memberId) groupId _ -> messageWarning "sendXGrpMemCon: member category GCPreMember or GCPostMember is expected" MSG msgMeta _msgFlags msgBody -> do - withAckMessage agentConnId conn msgMeta True $ \cmdId -> do + withAckMessage agentConnId msgMeta True $ do checkIntegrityCreateItem (CDGroupRcv gInfo m) msgMeta `catchChatError` \_ -> pure () forM_ aChatMsgs $ \case Right (ACMsg _ chatMsg) -> - processEvent cmdId chatMsg `catchChatError` \e -> toView $ CRChatError (Just user) e + processEvent chatMsg `catchChatError` \e -> toView $ CRChatError (Just user) e Left e -> toView $ CRChatError (Just user) (ChatError . CEException $ "error parsing chat message: " <> e) checkSendRcpt $ rights aChatMsgs -- currently only a single message is forwarded @@ -4046,9 +4044,9 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = where aChatMsgs = parseChatMessages msgBody brokerTs = metaBrokerTs msgMeta - processEvent :: MsgEncodingI e => CommandId -> ChatMessage e -> m () - processEvent cmdId chatMsg = do - (m', conn', msg@RcvMessage {chatMsgEvent = ACME _ event}) <- saveGroupRcvMsg user groupId m conn msgMeta cmdId msgBody chatMsg + processEvent :: MsgEncodingI e => ChatMessage e -> m () + processEvent chatMsg = do + (m', conn', msg@RcvMessage {chatMsgEvent = ACME _ event}) <- saveGroupRcvMsg user groupId m conn msgMeta msgBody chatMsg updateChatLock "groupMessage" event case event of XMsgNew mc -> memberCanSend m' $ newGroupContentMessage gInfo m' mc msg brokerTs False @@ -4108,7 +4106,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = unless (null ms) . void $ sendGroupMessage' user gInfo ms msg RCVD msgMeta msgRcpt -> - withAckMessage' agentConnId conn msgMeta $ + withAckMessage' agentConnId msgMeta $ groupMsgReceived gInfo m conn msgMeta msgRcpt SENT msgId -> do sentMsgDeliveryEvent conn msgId @@ -4148,8 +4146,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = createInternalChatItem user (CDGroupRcv gInfo m') (CIRcvConnEvent $ RCERatchetSync rss) Nothing OK -> -- [async agent commands] continuation on receiving OK - withCompletedCommand conn agentMsg $ \CommandData {cmdFunction, cmdId} -> - when (cmdFunction == CFAckMessage) $ ackMsgDeliveryEvent conn cmdId + when (corrId /= "") $ withCompletedCommand conn agentMsg $ \_cmdData -> pure () MERR msgId err -> do withStore' $ \db -> updateGroupItemErrorStatus db msgId (groupMemberId' m) $ agentErrToItemStatus err -- group errors are silenced to reduce load on UI event log @@ -4231,10 +4228,10 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = lookupChatItemByFileId db vr user fileId toView $ CRSndFileRcvCancelled user ci ft _ -> throwChatError $ CEFileSend fileId err - MSG meta _ _ -> withAckMessage' agentConnId conn meta $ pure () + MSG meta _ _ -> withAckMessage' agentConnId meta $ pure () OK -> -- [async agent commands] continuation on receiving OK - withCompletedCommand conn agentMsg $ \_cmdData -> pure () + when (corrId /= "") $ withCompletedCommand conn agentMsg $ \_cmdData -> pure () ERR err -> do toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity) when (corrId /= "") $ withCompletedCommand conn agentMsg $ \_cmdData -> pure () @@ -4280,7 +4277,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = parseFileChunk msgBody >>= receiveFileChunk ft (Just conn) meta OK -> -- [async agent commands] continuation on receiving OK - withCompletedCommand conn agentMsg $ \_cmdData -> pure () + when (corrId /= "") $ withCompletedCommand conn agentMsg $ \_cmdData -> pure () MERR _ err -> do toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity) incAuthErrCounter connEntity conn err @@ -4307,7 +4304,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = RcvChunkOk -> if B.length chunk /= fromInteger chunkSize then badRcvFileChunk ft "incorrect chunk size" - else ack $ appendFileChunk ft chunkNo chunk False + else withAckMessage' agentConnId meta $ appendFileChunk ft chunkNo chunk False RcvChunkFinal -> if B.length chunk > fromInteger chunkSize then badRcvFileChunk ft "incorrect chunk size" @@ -4321,12 +4318,8 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = getChatItemByFileId db vr user fileId toView $ CRRcvFileComplete user ci forM_ conn_ $ \conn -> deleteAgentConnectionAsync user (aConnId conn) - RcvChunkDuplicate -> ack $ pure () + RcvChunkDuplicate -> withAckMessage' agentConnId meta $ pure () RcvChunkError -> badRcvFileChunk ft $ "incorrect chunk number " <> show chunkNo - where - ack a = case conn_ of - Just conn -> withAckMessage' agentConnId conn meta a - Nothing -> a processUserContactRequest :: ACommand 'Agent e -> ConnectionEntity -> Connection -> UserContact -> m () processUserContactRequest agentMsg connEntity conn UserContact {userContactLinkId} = case agentMsg of @@ -4397,6 +4390,8 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = where s = " " <> name <> "=" <> B.unpack (strEncode $ toCMEventTag event) + -- TODO v5.7 / v6.0 - together with deprecating old group protocol establishing direct connections? + -- we could save command records only for agent APIs we process continuations for (INV) withCompletedCommand :: forall e. AEntityI e => Connection -> ACommand 'Agent e -> (CommandData -> m ()) -> m () withCompletedCommand Connection {connId} agentMsg action = do let agentMsgTag = APCT (sAEntity @e) $ aCommandTag agentMsg @@ -4414,36 +4409,27 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = withStore' $ \db -> updateCommandStatus db user cmdId CSError throwChatError . CEAgentCommandError $ msg - createAckCmd :: Connection -> m CommandId - createAckCmd Connection {connId} = do - withStore' $ \db -> createCommand db user (Just connId) CFAckMessage + withAckMessage' :: ConnId -> MsgMeta -> m () -> m () + withAckMessage' cId msgMeta action = do + withAckMessage cId msgMeta False $ action $> False - withAckMessage' :: ConnId -> Connection -> MsgMeta -> m () -> m () - withAckMessage' cId conn msgMeta action = do - withAckMessage cId conn msgMeta False $ \_cmdId -> action $> False - - withAckMessage :: ConnId -> Connection -> MsgMeta -> Bool -> (CommandId -> m Bool) -> m () - withAckMessage cId conn msgMeta showCritical action = do - cmdId <- createAckCmd conn `catchChatError` \e -> throwError $ ChatErrorAgent (CRITICAL True $ show e) Nothing - -- [async agent commands] command should be asynchronous, continuation is ackMsgDeliveryEvent + withAckMessage :: ConnId -> MsgMeta -> Bool -> m Bool -> m () + withAckMessage cId msgMeta showCritical action = + -- [async agent commands] command should be asynchronous -- TODO catching error and sending ACK after an error, particularly if it is a database error, will result in the message not processed (and no notification to the user). -- Possible solutions are: -- 1) retry processing several times -- 2) stabilize database -- 3) show screen of death to the user asking to restart - tryChatError (action cmdId) >>= \case - Right withRcpt -> ackMsg cId cmdId msgMeta $ if withRcpt then Just "" else Nothing + tryChatError action >>= \case + Right withRcpt -> ackMsg msgMeta $ if withRcpt then Just "" else Nothing -- If showCritical is True, then these errors don't result in ACK and show user visible alert -- This prevents losing the message that failed to be processed. Left (ChatErrorStore SEDBBusyError {message}) | showCritical -> throwError $ ChatErrorAgent (CRITICAL True message) Nothing - Left e -> ackMsg cId cmdId msgMeta Nothing >> throwError e - - ackMsg :: ConnId -> CommandId -> MsgMeta -> Maybe MsgReceiptInfo -> m () - ackMsg cId cmdId MsgMeta {recipient = (msgId, _)} rcpt = withAgent $ \a -> ackMessageAsync a (aCorrId cmdId) cId msgId rcpt - - ackMsgDeliveryEvent :: Connection -> CommandId -> m () - ackMsgDeliveryEvent Connection {connId} ackCmdId = - withStore' $ \db -> updateRcvMsgDeliveryStatus db connId ackCmdId MDSRcvAcknowledged + Left e -> ackMsg msgMeta Nothing >> throwError e + where + ackMsg :: MsgMeta -> Maybe MsgReceiptInfo -> m () + ackMsg MsgMeta {recipient = (msgId, _)} rcpt = withAgent $ \a -> ackMessageAsync a "" cId msgId rcpt sentMsgDeliveryEvent :: Connection -> AgentMsgId -> m () sentMsgDeliveryEvent Connection {connId} msgId = @@ -6350,25 +6336,25 @@ sendPendingGroupMessages user GroupMember {groupMemberId, localDisplayName} conn _ -> pure () -- TODO [batch send] refactor direct message processing same as groups (e.g. checkIntegrity before processing) -saveDirectRcvMSG :: ChatMonad m => Connection -> MsgMeta -> CommandId -> MsgBody -> m (Connection, RcvMessage) -saveDirectRcvMSG conn@Connection {connId} agentMsgMeta agentAckCmdId msgBody = +saveDirectRcvMSG :: ChatMonad m => Connection -> MsgMeta -> MsgBody -> m (Connection, RcvMessage) +saveDirectRcvMSG conn@Connection {connId} agentMsgMeta msgBody = case parseChatMessages msgBody of [Right (ACMsg _ ChatMessage {chatVRange, msgId = sharedMsgId_, chatMsgEvent})] -> do conn' <- updatePeerChatVRange conn chatVRange let agentMsgId = fst $ recipient agentMsgMeta newMsg = NewRcvMessage {chatMsgEvent, msgBody} - rcvMsgDelivery = RcvMsgDelivery {connId, agentMsgId, agentMsgMeta, agentAckCmdId} + rcvMsgDelivery = RcvMsgDelivery {connId, agentMsgId, agentMsgMeta} msg <- withStore $ \db -> createNewMessageAndRcvMsgDelivery db (ConnectionId connId) newMsg sharedMsgId_ rcvMsgDelivery Nothing pure (conn', msg) [Left e] -> error $ "saveDirectRcvMSG: error parsing chat message: " <> e _ -> error "saveDirectRcvMSG: batching not supported" -saveGroupRcvMsg :: (MsgEncodingI e, ChatMonad m) => User -> GroupId -> GroupMember -> Connection -> MsgMeta -> CommandId -> MsgBody -> ChatMessage e -> m (GroupMember, Connection, RcvMessage) -saveGroupRcvMsg user groupId authorMember conn@Connection {connId} agentMsgMeta agentAckCmdId msgBody ChatMessage {chatVRange, msgId = sharedMsgId_, chatMsgEvent} = do +saveGroupRcvMsg :: (MsgEncodingI e, ChatMonad m) => User -> GroupId -> GroupMember -> Connection -> MsgMeta -> MsgBody -> ChatMessage e -> m (GroupMember, Connection, RcvMessage) +saveGroupRcvMsg user groupId authorMember conn@Connection {connId} agentMsgMeta msgBody ChatMessage {chatVRange, msgId = sharedMsgId_, chatMsgEvent} = do (am'@GroupMember {memberId = amMemId, groupMemberId = amGroupMemId}, conn') <- updateMemberChatVRange authorMember conn chatVRange let agentMsgId = fst $ recipient agentMsgMeta newMsg = NewRcvMessage {chatMsgEvent, msgBody} - rcvMsgDelivery = RcvMsgDelivery {connId, agentMsgId, agentMsgMeta, agentAckCmdId} + rcvMsgDelivery = RcvMsgDelivery {connId, agentMsgId, agentMsgMeta} msg <- withStore (\db -> createNewMessageAndRcvMsgDelivery db (GroupId groupId) newMsg sharedMsgId_ rcvMsgDelivery $ Just amGroupMemId) `catchChatError` \e -> case e of diff --git a/src/Simplex/Chat/Messages.hs b/src/Simplex/Chat/Messages.hs index a5e856fdfe..c24de3b2e1 100644 --- a/src/Simplex/Chat/Messages.hs +++ b/src/Simplex/Chat/Messages.hs @@ -871,8 +871,7 @@ data SndMsgDelivery = SndMsgDelivery data RcvMsgDelivery = RcvMsgDelivery { connId :: Int64, agentMsgId :: AgentMsgId, - agentMsgMeta :: MsgMeta, - agentAckCmdId :: CommandId + agentMsgMeta :: MsgMeta } deriving (Show) @@ -899,7 +898,7 @@ msgMetaToJson MsgMeta {integrity, recipient = (rcvId, rcvTs), broker = (serverId data MsgDeliveryStatus (d :: MsgDirection) where MDSRcvAgent :: MsgDeliveryStatus 'MDRcv - MDSRcvAcknowledged :: MsgDeliveryStatus 'MDRcv + MDSRcvAcknowledged :: MsgDeliveryStatus 'MDRcv -- not used MDSSndPending :: MsgDeliveryStatus 'MDSnd MDSSndAgent :: MsgDeliveryStatus 'MDSnd MDSSndSent :: MsgDeliveryStatus 'MDSnd diff --git a/src/Simplex/Chat/Migrations/M20240313_drop_agent_ack_cmd_id.hs b/src/Simplex/Chat/Migrations/M20240313_drop_agent_ack_cmd_id.hs new file mode 100644 index 0000000000..c14f08447e --- /dev/null +++ b/src/Simplex/Chat/Migrations/M20240313_drop_agent_ack_cmd_id.hs @@ -0,0 +1,22 @@ +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.Chat.Migrations.M20240313_drop_agent_ack_cmd_id where + +import Database.SQLite.Simple (Query) +import Database.SQLite.Simple.QQ (sql) + +m20240313_drop_agent_ack_cmd_id :: Query +m20240313_drop_agent_ack_cmd_id = + [sql| +DROP INDEX idx_msg_deliveries_agent_ack_cmd_id; + +ALTER TABLE msg_deliveries DROP COLUMN agent_ack_cmd_id; +|] + +down_m20240313_drop_agent_ack_cmd_id :: Query +down_m20240313_drop_agent_ack_cmd_id = + [sql| +ALTER TABLE msg_deliveries ADD COLUMN agent_ack_cmd_id INTEGER; + +CREATE INDEX idx_msg_deliveries_agent_ack_cmd_id ON msg_deliveries(connection_id, agent_ack_cmd_id); +|] diff --git a/src/Simplex/Chat/Migrations/chat_schema.sql b/src/Simplex/Chat/Migrations/chat_schema.sql index 19c6ba24d0..13e8b8b460 100644 --- a/src/Simplex/Chat/Migrations/chat_schema.sql +++ b/src/Simplex/Chat/Migrations/chat_schema.sql @@ -556,7 +556,6 @@ CREATE TABLE IF NOT EXISTS "msg_deliveries"( chat_ts TEXT NOT NULL DEFAULT(datetime('now')), created_at TEXT CHECK(created_at NOT NULL), updated_at TEXT CHECK(updated_at NOT NULL), - agent_ack_cmd_id INTEGER, -- broker_ts for received, created_at for sent delivery_status TEXT -- MsgDeliveryStatus ); CREATE TABLE note_folders( @@ -826,10 +825,6 @@ CREATE INDEX idx_contact_requests_updated_at ON contact_requests( ); CREATE INDEX idx_connections_updated_at ON connections(user_id, updated_at); CREATE INDEX idx_msg_deliveries_message_id ON "msg_deliveries"(message_id); -CREATE INDEX idx_msg_deliveries_agent_ack_cmd_id ON "msg_deliveries"( - connection_id, - agent_ack_cmd_id -); CREATE INDEX idx_msg_deliveries_agent_msg_id ON "msg_deliveries"( connection_id, agent_msg_id diff --git a/src/Simplex/Chat/Store/Messages.hs b/src/Simplex/Chat/Store/Messages.hs index bf74add6db..cc0199b214 100644 --- a/src/Simplex/Chat/Store/Messages.hs +++ b/src/Simplex/Chat/Store/Messages.hs @@ -25,7 +25,6 @@ module Simplex.Chat.Store.Messages createNewMessageAndRcvMsgDelivery, createNewRcvMessage, updateSndMsgDeliveryStatus, - updateRcvMsgDeliveryStatus, createPendingGroupMessage, getPendingGroupMessages, deletePendingGroupMessage, @@ -211,7 +210,7 @@ createSndMsgDelivery db SndMsgDelivery {connId, agentMsgId} messageId = do insertedRowId db createNewMessageAndRcvMsgDelivery :: forall e. MsgEncodingI e => DB.Connection -> ConnOrGroupId -> NewRcvMessage e -> Maybe SharedMsgId -> RcvMsgDelivery -> Maybe GroupMemberId -> ExceptT StoreError IO RcvMessage -createNewMessageAndRcvMsgDelivery db connOrGroupId newMessage sharedMsgId_ RcvMsgDelivery {connId, agentMsgId, agentMsgMeta, agentAckCmdId} authorGroupMemberId_ = do +createNewMessageAndRcvMsgDelivery db connOrGroupId newMessage sharedMsgId_ RcvMsgDelivery {connId, agentMsgId, agentMsgMeta} authorGroupMemberId_ = do msg@RcvMessage {msgId} <- createNewRcvMessage db connOrGroupId newMessage sharedMsgId_ authorGroupMemberId_ Nothing liftIO $ do currentTs <- getCurrentTime @@ -219,10 +218,10 @@ createNewMessageAndRcvMsgDelivery db connOrGroupId newMessage sharedMsgId_ RcvMs db [sql| INSERT INTO msg_deliveries - (message_id, connection_id, agent_msg_id, agent_msg_meta, agent_ack_cmd_id, chat_ts, created_at, updated_at, delivery_status) - VALUES (?,?,?,?,?,?,?,?,?) + (message_id, connection_id, agent_msg_id, agent_msg_meta, chat_ts, created_at, updated_at, delivery_status) + VALUES (?,?,?,?,?,?,?,?) |] - (msgId, connId, agentMsgId, msgMetaJson agentMsgMeta, agentAckCmdId, snd $ broker agentMsgMeta, currentTs, currentTs, MDSRcvAgent) + (msgId, connId, agentMsgId, msgMetaJson agentMsgMeta, snd $ broker agentMsgMeta, currentTs, currentTs, MDSRcvAgent) pure msg createNewRcvMessage :: forall e. MsgEncodingI e => DB.Connection -> ConnOrGroupId -> NewRcvMessage e -> Maybe SharedMsgId -> Maybe GroupMemberId -> Maybe GroupMemberId -> ExceptT StoreError IO RcvMessage @@ -273,18 +272,6 @@ updateSndMsgDeliveryStatus db connId agentMsgId sndMsgDeliveryStatus = do |] (sndMsgDeliveryStatus, currentTs, connId, agentMsgId) -updateRcvMsgDeliveryStatus :: DB.Connection -> Int64 -> CommandId -> MsgDeliveryStatus 'MDRcv -> IO () -updateRcvMsgDeliveryStatus db connId cmdId rcvMsgDeliveryStatus = do - currentTs <- getCurrentTime - DB.execute - db - [sql| - UPDATE msg_deliveries - SET delivery_status = ?, updated_at = ? - WHERE connection_id = ? AND agent_ack_cmd_id = ? - |] - (rcvMsgDeliveryStatus, currentTs, connId, cmdId) - createPendingGroupMessage :: DB.Connection -> Int64 -> MessageId -> Maybe Int64 -> IO () createPendingGroupMessage db groupMemberId messageId introId_ = do currentTs <- getCurrentTime diff --git a/src/Simplex/Chat/Store/Migrations.hs b/src/Simplex/Chat/Store/Migrations.hs index d8bdbd6fd3..60fae44da8 100644 --- a/src/Simplex/Chat/Store/Migrations.hs +++ b/src/Simplex/Chat/Store/Migrations.hs @@ -102,6 +102,7 @@ import Simplex.Chat.Migrations.M20240214_redirect_file_id import Simplex.Chat.Migrations.M20240222_app_settings import Simplex.Chat.Migrations.M20240226_users_restrict import Simplex.Chat.Migrations.M20240228_pq +import Simplex.Chat.Migrations.M20240313_drop_agent_ack_cmd_id import Simplex.Messaging.Agent.Store.SQLite.Migrations (Migration (..)) schemaMigrations :: [(String, Query, Maybe Query)] @@ -203,7 +204,8 @@ schemaMigrations = ("20240214_redirect_file_id", m20240214_redirect_file_id, Just down_m20240214_redirect_file_id), ("20240222_app_settings", m20240222_app_settings, Just down_m20240222_app_settings), ("20240226_users_restrict", m20240226_users_restrict, Just down_m20240226_users_restrict), - ("20240228_pq", m20240228_pq, Just down_m20240228_pq) + ("20240228_pq", m20240228_pq, Just down_m20240228_pq), + ("20240313_drop_agent_ack_cmd_id", m20240313_drop_agent_ack_cmd_id, Just down_m20240313_drop_agent_ack_cmd_id) ] -- | The list of migrations in ascending order by date diff --git a/src/Simplex/Chat/Types.hs b/src/Simplex/Chat/Types.hs index f16913439d..ab8b66a7d4 100644 --- a/src/Simplex/Chat/Types.hs +++ b/src/Simplex/Chat/Types.hs @@ -1551,7 +1551,7 @@ data CommandFunction | CFJoinConn | CFAllowConn | CFAcceptContact - | CFAckMessage + | CFAckMessage -- not used | CFDeleteConn -- not used deriving (Eq, Show) diff --git a/tests/SchemaDump.hs b/tests/SchemaDump.hs index 77269a9b33..b6bc91e48b 100644 --- a/tests/SchemaDump.hs +++ b/tests/SchemaDump.hs @@ -75,7 +75,9 @@ skipComparisonForDownMigrations = -- on down migration idx_connections_via_contact_uri_hash index moves down to the end of the file "20231019_indexes", -- table and indexes move down to the end of the file - "20231215_recreate_msg_deliveries" + "20231215_recreate_msg_deliveries", + -- on down migration idx_msg_deliveries_agent_ack_cmd_id index moves down to the end of the file + "20240313_drop_agent_ack_cmd_id" ] getSchema :: FilePath -> FilePath -> IO String