mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-07-20 04:51:05 +00:00
core: rework synchronous group forwarding in receive loop into asynchronous delivery tasks (#6178)
This commit is contained in:
@@ -139,6 +139,7 @@ import Simplex.Chat.Store.SQLite.Migrations.M20250721_indexes
|
||||
import Simplex.Chat.Store.SQLite.Migrations.M20250729_member_contact_requests
|
||||
import Simplex.Chat.Store.SQLite.Migrations.M20250801_via_group_link_uri
|
||||
import Simplex.Chat.Store.SQLite.Migrations.M20250802_chat_peer_type
|
||||
import Simplex.Chat.Store.SQLite.Migrations.M20250813_delivery_tasks
|
||||
import Simplex.Messaging.Agent.Store.Shared (Migration (..))
|
||||
|
||||
schemaMigrations :: [(String, Query, Maybe Query)]
|
||||
@@ -277,7 +278,8 @@ schemaMigrations =
|
||||
("20250721_indexes", m20250721_indexes, Just down_m20250721_indexes),
|
||||
("20250729_member_contact_requests", m20250729_member_contact_requests, Just down_m20250729_member_contact_requests),
|
||||
("20250801_via_group_link_uri", m20250801_via_group_link_uri, Just down_m20250801_via_group_link_uri),
|
||||
("20250802_chat_peer_type", m20250802_chat_peer_type, Just down_m20250802_chat_peer_type)
|
||||
("20250802_chat_peer_type", m20250802_chat_peer_type, Just down_m20250802_chat_peer_type),
|
||||
("20250813_delivery_tasks", m20250813_delivery_tasks, Just down_m20250813_delivery_tasks)
|
||||
]
|
||||
|
||||
-- | The list of migrations in ascending order by date
|
||||
|
||||
@@ -0,0 +1,172 @@
|
||||
{-# LANGUAGE QuasiQuotes #-}
|
||||
|
||||
module Simplex.Chat.Store.SQLite.Migrations.M20250813_delivery_tasks where
|
||||
|
||||
import Database.SQLite.Simple (Query)
|
||||
import Database.SQLite.Simple.QQ (sql)
|
||||
|
||||
-- TODO [channels fwd] add later in new migration for MemberProfileUpdate delivery jobs:
|
||||
-- TODO - ALTER TABLE group_members ADD COLUMN last_profile_delivery_ts TEXT;
|
||||
-- TODO - ALTER TABLE group_members ADD COLUMN join_ts TEXT;
|
||||
|
||||
-- How columns correspond to types:
|
||||
|
||||
-- both tables:
|
||||
-- - <group_id, worker_scope> <-> DeliveryWorkerKey = (GroupId, DeliveryWorkerScope),
|
||||
-- - job_scope_spec_tag <-> Maybe DeliveryJobSpecTag (for DJSGroup job scope),
|
||||
-- - job_scope_include_pending <-> Maybe Bool (for DJDeliveryJob job spec),
|
||||
-- - job_scope_support_gm_id <-> Maybe GroupMemberId (for DJSMemberSupport job scope),
|
||||
-- - failed <-> Bool (for internal worker use, to mark failed work items).
|
||||
|
||||
-- delivery_tasks table:
|
||||
-- - sender_group_member_id <-> GroupMemberId (sender of the original message that created task),
|
||||
-- - message_id <-> MessageId (reference to the original message that created task),
|
||||
-- - message_from_channel <-> Maybe MessageFromChannel (for MessageDeliveryTask),
|
||||
-- - task_status <-> DeliveryTaskStatus,
|
||||
-- - task_err_reason <-> Maybe Text (set when task status is DTSError, not encoded in status to allow filtering by DTSError in queries).
|
||||
|
||||
-- delivery_jobs table:
|
||||
-- - single_sender_group_member_id <-> Maybe GroupMemberId (set when all messages in job's delivery body are from the same sender),
|
||||
-- - body <-> ByteString (JSON encoded batch of messages or single message packed with forwarding metadata (XGrpMsgForward)),
|
||||
-- - cursor_group_member_id <-> Maybe GroupMemberId (for tracking progress of job processing buckets of recipient members),
|
||||
-- - job_status <-> DeliveryJobStatus,
|
||||
-- - job_err_reason <-> Maybe Text (set when job status is DJSError, not encoded in status to allow filtering by DJSError in queries).
|
||||
--
|
||||
-- Pair of columns <group_id, worker_scope> defines the scope of work for a worker.
|
||||
--
|
||||
-- Both tasks and jobs are defined by the same range of worker scopes, with a delivery task worker
|
||||
-- converting tasks into jobs for a delivery job worker of the same scope.
|
||||
-- Each group can have up to 1 task worker and 1 job worker for each worker scope.
|
||||
-- See DeliveryWorkerScope.
|
||||
--
|
||||
-- Columns job_scope_spec_tag, job_scope_include_pending, job_scope_support_gm_id narrow down delivery scope for a job.
|
||||
-- See DeliveryJobScope.
|
||||
--
|
||||
-- In some cases multiple tasks of the same job scope may be converted into a single job.
|
||||
-- For example, messages referenced in DJDeliveryJob tasks of the same scope/spec can be batched for a single delivery.
|
||||
-- Some tasks, for example of DJRelayRemoved specialization, are converted one-to-one into jobs.
|
||||
--
|
||||
-- Delivery scopes can be expanded to create more specialized jobs.
|
||||
-- For example DWSMemberProfileUpdate workers are planned to deliver senders' profiles to
|
||||
-- all members satisfying criteria: sender last_profile_delivery_ts < recipient join_ts.
|
||||
-- Tasks for these jobs are planned to be created based on sender and group state, rather than per message,
|
||||
-- so member profile updates will be delivered separately from message deliveries.
|
||||
-- See rfc doc for more details.
|
||||
m20250813_delivery_tasks :: Query
|
||||
m20250813_delivery_tasks =
|
||||
[sql|
|
||||
CREATE TABLE delivery_tasks (
|
||||
delivery_task_id INTEGER PRIMARY KEY,
|
||||
group_id INTEGER NOT NULL REFERENCES groups ON DELETE CASCADE,
|
||||
worker_scope TEXT NOT NULL,
|
||||
job_scope_spec_tag TEXT,
|
||||
job_scope_include_pending INTEGER,
|
||||
job_scope_support_gm_id INTEGER REFERENCES group_members(group_member_id) ON DELETE CASCADE,
|
||||
sender_group_member_id INTEGER NOT NULL REFERENCES group_members(group_member_id) ON DELETE CASCADE,
|
||||
message_id INTEGER REFERENCES messages ON DELETE CASCADE,
|
||||
message_from_channel INTEGER NOT NULL DEFAULT 0,
|
||||
task_status TEXT NOT NULL,
|
||||
task_err_reason TEXT,
|
||||
failed INTEGER DEFAULT 0,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
CREATE INDEX idx_delivery_tasks_group_id ON delivery_tasks(group_id);
|
||||
CREATE INDEX idx_delivery_tasks_job_scope_support_gm_id ON delivery_tasks(job_scope_support_gm_id);
|
||||
CREATE INDEX idx_delivery_tasks_sender_group_member_id ON delivery_tasks(sender_group_member_id);
|
||||
CREATE INDEX idx_delivery_tasks_message_id ON delivery_tasks(message_id);
|
||||
|
||||
CREATE INDEX idx_delivery_tasks_next ON delivery_tasks(
|
||||
group_id,
|
||||
worker_scope,
|
||||
failed,
|
||||
task_status
|
||||
);
|
||||
CREATE INDEX idx_delivery_tasks_next_for_job_scope ON delivery_tasks(
|
||||
group_id,
|
||||
worker_scope,
|
||||
job_scope_spec_tag,
|
||||
job_scope_include_pending,
|
||||
job_scope_support_gm_id,
|
||||
failed,
|
||||
task_status
|
||||
);
|
||||
CREATE INDEX idx_delivery_tasks_next_for_job_scope_sender ON delivery_tasks(
|
||||
group_id,
|
||||
worker_scope,
|
||||
job_scope_spec_tag,
|
||||
job_scope_include_pending,
|
||||
job_scope_support_gm_id,
|
||||
sender_group_member_id,
|
||||
failed,
|
||||
task_status
|
||||
);
|
||||
CREATE INDEX idx_delivery_tasks_created_at ON delivery_tasks(created_at);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE delivery_jobs (
|
||||
delivery_job_id INTEGER PRIMARY KEY,
|
||||
group_id INTEGER NOT NULL REFERENCES groups ON DELETE CASCADE,
|
||||
worker_scope TEXT NOT NULL,
|
||||
job_scope_spec_tag TEXT,
|
||||
job_scope_include_pending INTEGER,
|
||||
job_scope_support_gm_id INTEGER REFERENCES group_members(group_member_id) ON DELETE CASCADE,
|
||||
single_sender_group_member_id INTEGER REFERENCES group_members(group_member_id) ON DELETE CASCADE,
|
||||
body BLOB,
|
||||
cursor_group_member_id INTEGER,
|
||||
job_status TEXT NOT NULL,
|
||||
job_err_reason TEXT,
|
||||
failed INTEGER DEFAULT 0,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
CREATE INDEX idx_delivery_jobs_group_id ON delivery_jobs(group_id);
|
||||
CREATE INDEX idx_delivery_jobs_job_scope_support_gm_id ON delivery_jobs(job_scope_support_gm_id);
|
||||
CREATE INDEX idx_delivery_jobs_single_sender_group_member_id ON delivery_jobs(single_sender_group_member_id);
|
||||
|
||||
CREATE INDEX idx_delivery_jobs_next ON delivery_jobs(
|
||||
group_id,
|
||||
worker_scope,
|
||||
failed,
|
||||
job_status
|
||||
);
|
||||
CREATE INDEX idx_delivery_jobs_created_at ON delivery_jobs(created_at);
|
||||
|
||||
|
||||
|
||||
ALTER TABLE messages ADD COLUMN broker_ts TEXT;
|
||||
|]
|
||||
|
||||
down_m20250813_delivery_tasks :: Query
|
||||
down_m20250813_delivery_tasks =
|
||||
[sql|
|
||||
ALTER TABLE messages DROP COLUMN broker_ts;
|
||||
|
||||
|
||||
|
||||
DROP INDEX idx_delivery_jobs_group_id;
|
||||
DROP INDEX idx_delivery_jobs_job_scope_support_gm_id;
|
||||
DROP INDEX idx_delivery_jobs_single_sender_group_member_id;
|
||||
|
||||
DROP INDEX idx_delivery_jobs_next;
|
||||
DROP INDEX idx_delivery_jobs_created_at;
|
||||
|
||||
DROP TABLE delivery_jobs;
|
||||
|
||||
|
||||
|
||||
DROP INDEX idx_delivery_tasks_group_id;
|
||||
DROP INDEX idx_delivery_tasks_job_scope_support_gm_id;
|
||||
DROP INDEX idx_delivery_tasks_sender_group_member_id;
|
||||
DROP INDEX idx_delivery_tasks_message_id;
|
||||
|
||||
DROP INDEX idx_delivery_tasks_next;
|
||||
DROP INDEX idx_delivery_tasks_next_for_job_scope;
|
||||
DROP INDEX idx_delivery_tasks_next_for_job_scope_sender;
|
||||
DROP INDEX idx_delivery_tasks_created_at;
|
||||
|
||||
DROP TABLE delivery_tasks;
|
||||
|]
|
||||
@@ -95,6 +95,22 @@ SEARCH gp USING INTEGER PRIMARY KEY (rowid=?)
|
||||
SEARCH mu USING INDEX idx_group_members_contact_id (contact_id=?)
|
||||
SEARCH pu USING INTEGER PRIMARY KEY (rowid=?)
|
||||
|
||||
Query:
|
||||
SELECT delivery_task_id
|
||||
FROM delivery_tasks
|
||||
WHERE group_id = ?
|
||||
AND worker_scope = ?
|
||||
AND job_scope_spec_tag IS NOT DISTINCT FROM ?
|
||||
AND job_scope_include_pending IS NOT DISTINCT FROM ?
|
||||
AND job_scope_support_gm_id IS NOT DISTINCT FROM ?
|
||||
AND sender_group_member_id = ?
|
||||
AND failed = 0
|
||||
AND task_status = ?
|
||||
ORDER BY delivery_task_id ASC
|
||||
|
||||
Plan:
|
||||
SEARCH delivery_tasks USING COVERING INDEX idx_delivery_tasks_next_for_job_scope_sender (group_id=? AND worker_scope=? AND job_scope_spec_tag=? AND job_scope_include_pending=? AND job_scope_support_gm_id=? AND sender_group_member_id=? AND failed=? AND task_status=?)
|
||||
|
||||
Query:
|
||||
UPDATE contact_profiles
|
||||
SET user_id = ?, updated_at = ?
|
||||
@@ -417,6 +433,17 @@ Plan:
|
||||
SEARCH cr USING INDEX idx_contact_requests_xcontact_id (user_id=? AND xcontact_id=?)
|
||||
SEARCH p USING INTEGER PRIMARY KEY (rowid=?)
|
||||
|
||||
Query:
|
||||
SELECT
|
||||
delivery_job_id,
|
||||
worker_scope, job_scope_spec_tag, job_scope_include_pending, job_scope_support_gm_id,
|
||||
single_sender_group_member_id, body, cursor_group_member_id
|
||||
FROM delivery_jobs
|
||||
WHERE delivery_job_id = ?
|
||||
|
||||
Plan:
|
||||
SEARCH delivery_jobs USING INTEGER PRIMARY KEY (rowid=?)
|
||||
|
||||
Query:
|
||||
SELECT COUNT(1)
|
||||
FROM (
|
||||
@@ -648,6 +675,28 @@ Plan:
|
||||
SEARCH m USING INTEGER PRIMARY KEY (rowid=?)
|
||||
SEARCH ct USING INTEGER PRIMARY KEY (rowid=?)
|
||||
|
||||
Query:
|
||||
SELECT delivery_job_id
|
||||
FROM delivery_jobs
|
||||
WHERE group_id = ? AND worker_scope = ?
|
||||
AND failed = 0 AND job_status = ?
|
||||
ORDER BY delivery_job_id ASC
|
||||
LIMIT 1
|
||||
|
||||
Plan:
|
||||
SEARCH delivery_jobs USING COVERING INDEX idx_delivery_jobs_next (group_id=? AND worker_scope=? AND failed=? AND job_status=?)
|
||||
|
||||
Query:
|
||||
SELECT delivery_task_id
|
||||
FROM delivery_tasks
|
||||
WHERE group_id = ? AND worker_scope = ?
|
||||
AND failed = 0 AND task_status = ?
|
||||
ORDER BY delivery_task_id ASC
|
||||
LIMIT 1
|
||||
|
||||
Plan:
|
||||
SEARCH delivery_tasks USING COVERING INDEX idx_delivery_tasks_next (group_id=? AND worker_scope=? AND failed=? AND task_status=?)
|
||||
|
||||
Query:
|
||||
SELECT gp.display_name, gp.full_name, gp.short_descr, gp.description, gp.image, gp.preferences, gp.member_admission
|
||||
FROM group_profiles gp
|
||||
@@ -822,8 +871,9 @@ Plan:
|
||||
|
||||
Query:
|
||||
INSERT INTO messages
|
||||
(msg_sent, chat_msg_event, msg_body, created_at, updated_at, connection_id, group_id, shared_msg_id, author_group_member_id, forwarded_by_group_member_id)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?)
|
||||
(msg_sent, chat_msg_event, msg_body, broker_ts, created_at, updated_at, connection_id, group_id,
|
||||
shared_msg_id, author_group_member_id, forwarded_by_group_member_id)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?)
|
||||
|
||||
Plan:
|
||||
|
||||
@@ -1502,7 +1552,8 @@ Query:
|
||||
UPDATE group_members
|
||||
SET support_chat_items_unread = 0,
|
||||
support_chat_items_member_attention = 0,
|
||||
support_chat_items_mentions = 0
|
||||
support_chat_items_mentions = 0,
|
||||
updated_at = ?
|
||||
WHERE group_member_id = ?
|
||||
|
||||
Plan:
|
||||
@@ -2996,6 +3047,23 @@ CORRELATED SCALAR SUBQUERY 1
|
||||
SEARCH ci USING COVERING INDEX idx_chat_items_notes_created_at (user_id=? AND note_folder_id=?)
|
||||
USE TEMP B-TREE FOR ORDER BY
|
||||
|
||||
Query:
|
||||
SELECT
|
||||
t.delivery_task_id,
|
||||
t.worker_scope, t.job_scope_spec_tag, t.job_scope_include_pending, t.job_scope_support_gm_id,
|
||||
m.group_member_id, m.member_id, p.display_name, msg.broker_ts, msg.msg_body, t.message_from_channel
|
||||
FROM delivery_tasks t
|
||||
JOIN messages msg ON msg.message_id = t.message_id
|
||||
JOIN group_members m ON m.group_member_id = t.sender_group_member_id
|
||||
JOIN contact_profiles p ON p.contact_profile_id = COALESCE(m.member_profile_id, m.contact_profile_id)
|
||||
WHERE t.delivery_task_id = ?
|
||||
|
||||
Plan:
|
||||
SEARCH t USING INTEGER PRIMARY KEY (rowid=?)
|
||||
SEARCH msg USING INTEGER PRIMARY KEY (rowid=?)
|
||||
SEARCH m USING INTEGER PRIMARY KEY (rowid=?)
|
||||
SEARCH p USING INTEGER PRIMARY KEY (rowid=?)
|
||||
|
||||
Query:
|
||||
SELECT COUNT(1)
|
||||
FROM chat_items
|
||||
@@ -3990,6 +4058,22 @@ SEARCH group_members USING COVERING INDEX idx_group_members_member_profile_id (m
|
||||
SEARCH group_members USING COVERING INDEX idx_group_members_contact_profile_id (contact_profile_id=?)
|
||||
SEARCH contacts USING COVERING INDEX idx_contacts_contact_profile_id (contact_profile_id=?)
|
||||
|
||||
Query:
|
||||
DELETE FROM delivery_jobs
|
||||
WHERE created_at <= ?
|
||||
AND (job_status IN (?,?) OR failed = 1)
|
||||
|
||||
Plan:
|
||||
SEARCH delivery_jobs USING INDEX idx_delivery_jobs_created_at (created_at<?)
|
||||
|
||||
Query:
|
||||
DELETE FROM delivery_tasks
|
||||
WHERE created_at <= ?
|
||||
AND (task_status IN (?,?) OR failed = 1)
|
||||
|
||||
Plan:
|
||||
SEARCH delivery_tasks USING INDEX idx_delivery_tasks_created_at (created_at<?)
|
||||
|
||||
Query:
|
||||
DELETE FROM display_names
|
||||
WHERE
|
||||
@@ -4241,6 +4325,25 @@ Query:
|
||||
Plan:
|
||||
SEARCH contact_requests USING COVERING INDEX idx_contact_requests_contact_profile_id (contact_profile_id=?)
|
||||
|
||||
Query:
|
||||
INSERT INTO delivery_jobs (
|
||||
group_id,
|
||||
worker_scope, job_scope_spec_tag, job_scope_include_pending, job_scope_support_gm_id,
|
||||
single_sender_group_member_id, body, job_status, created_at, updated_at
|
||||
) VALUES (?,?,?,?,?,?,?,?,?,?)
|
||||
|
||||
Plan:
|
||||
|
||||
Query:
|
||||
INSERT INTO delivery_tasks (
|
||||
group_id,
|
||||
worker_scope, job_scope_spec_tag, job_scope_include_pending, job_scope_support_gm_id,
|
||||
sender_group_member_id, message_id, message_from_channel, task_status,
|
||||
created_at, updated_at
|
||||
) VALUES (?,?,?,?,?,?,?,?,?,?,?)
|
||||
|
||||
Plan:
|
||||
|
||||
Query:
|
||||
INSERT INTO files
|
||||
( user_id, note_folder_id,
|
||||
@@ -4287,6 +4390,22 @@ Query:
|
||||
Plan:
|
||||
SEARCH group_members USING INDEX sqlite_autoindex_group_members_1 (group_id=?)
|
||||
|
||||
Query:
|
||||
SELECT DISTINCT group_id, worker_scope
|
||||
FROM delivery_jobs
|
||||
WHERE failed = 0 AND job_status = ?
|
||||
|
||||
Plan:
|
||||
SCAN delivery_jobs USING COVERING INDEX idx_delivery_jobs_next
|
||||
|
||||
Query:
|
||||
SELECT DISTINCT group_id, worker_scope
|
||||
FROM delivery_tasks
|
||||
WHERE failed = 0 AND task_status = ?
|
||||
|
||||
Plan:
|
||||
SCAN delivery_tasks USING COVERING INDEX idx_delivery_tasks_next
|
||||
|
||||
Query:
|
||||
SELECT chat_item_id, timed_ttl
|
||||
FROM chat_items
|
||||
@@ -4764,6 +4883,7 @@ Plan:
|
||||
SEARCH messages USING INTEGER PRIMARY KEY (rowid=?)
|
||||
LIST SUBQUERY 1
|
||||
SEARCH chat_item_messages USING COVERING INDEX sqlite_autoindex_chat_item_messages_2 (chat_item_id=?)
|
||||
SEARCH delivery_tasks USING COVERING INDEX idx_delivery_tasks_message_id (message_id=?)
|
||||
SEARCH msg_deliveries USING COVERING INDEX idx_msg_deliveries_message_id (message_id=?)
|
||||
SEARCH chat_item_moderations USING COVERING INDEX idx_chat_item_moderations_created_by_msg_id (created_by_msg_id=?)
|
||||
SEARCH chat_item_reactions USING COVERING INDEX idx_chat_item_reactions_created_by_msg_id (created_by_msg_id=?)
|
||||
@@ -5534,6 +5654,14 @@ SEARCH group_members USING COVERING INDEX idx_group_members_contact_id (contact_
|
||||
SEARCH group_members USING COVERING INDEX idx_group_members_invited_by (invited_by=?)
|
||||
SEARCH users USING COVERING INDEX sqlite_autoindex_users_1 (contact_id=?)
|
||||
|
||||
Query: DELETE FROM delivery_jobs WHERE group_id = ?
|
||||
Plan:
|
||||
SEARCH delivery_jobs USING COVERING INDEX idx_delivery_jobs_group_id (group_id=?)
|
||||
|
||||
Query: DELETE FROM delivery_tasks WHERE group_id = ?
|
||||
Plan:
|
||||
SEARCH delivery_tasks USING COVERING INDEX idx_delivery_tasks_group_id (group_id=?)
|
||||
|
||||
Query: DELETE FROM display_names WHERE user_id = ? AND local_display_name = ?
|
||||
Plan:
|
||||
SEARCH display_names USING PRIMARY KEY (user_id=? AND local_display_name=?)
|
||||
@@ -5554,6 +5682,10 @@ SEARCH files USING COVERING INDEX idx_files_redirect_file_id (redirect_file_id=?
|
||||
Query: DELETE FROM group_members WHERE user_id = ? AND group_id = ?
|
||||
Plan:
|
||||
SEARCH group_members USING COVERING INDEX idx_group_members_group_id (user_id=? AND group_id=?)
|
||||
SEARCH delivery_jobs USING COVERING INDEX idx_delivery_jobs_single_sender_group_member_id (single_sender_group_member_id=?)
|
||||
SEARCH delivery_jobs USING COVERING INDEX idx_delivery_jobs_job_scope_support_gm_id (job_scope_support_gm_id=?)
|
||||
SEARCH delivery_tasks USING COVERING INDEX idx_delivery_tasks_sender_group_member_id (sender_group_member_id=?)
|
||||
SEARCH delivery_tasks USING COVERING INDEX idx_delivery_tasks_job_scope_support_gm_id (job_scope_support_gm_id=?)
|
||||
SEARCH received_probes USING COVERING INDEX idx_received_probes_group_member_id (group_member_id=?)
|
||||
SEARCH sent_probe_hashes USING COVERING INDEX idx_sent_probe_hashes_group_member_id (group_member_id=?)
|
||||
SEARCH sent_probes USING COVERING INDEX idx_sent_probes_group_member_id (group_member_id=?)
|
||||
@@ -5579,6 +5711,10 @@ SEARCH contacts USING COVERING INDEX idx_contacts_contact_group_member_id (conta
|
||||
Query: DELETE FROM group_members WHERE user_id = ? AND group_member_id = ?
|
||||
Plan:
|
||||
SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?)
|
||||
SEARCH delivery_jobs USING COVERING INDEX idx_delivery_jobs_single_sender_group_member_id (single_sender_group_member_id=?)
|
||||
SEARCH delivery_jobs USING COVERING INDEX idx_delivery_jobs_job_scope_support_gm_id (job_scope_support_gm_id=?)
|
||||
SEARCH delivery_tasks USING COVERING INDEX idx_delivery_tasks_sender_group_member_id (sender_group_member_id=?)
|
||||
SEARCH delivery_tasks USING COVERING INDEX idx_delivery_tasks_job_scope_support_gm_id (job_scope_support_gm_id=?)
|
||||
SEARCH received_probes USING COVERING INDEX idx_received_probes_group_member_id (group_member_id=?)
|
||||
SEARCH sent_probe_hashes USING COVERING INDEX idx_sent_probe_hashes_group_member_id (group_member_id=?)
|
||||
SEARCH sent_probes USING COVERING INDEX idx_sent_probes_group_member_id (group_member_id=?)
|
||||
@@ -5604,6 +5740,8 @@ SEARCH contacts USING COVERING INDEX idx_contacts_contact_group_member_id (conta
|
||||
Query: DELETE FROM groups WHERE user_id = ? AND group_id = ?
|
||||
Plan:
|
||||
SEARCH groups USING INTEGER PRIMARY KEY (rowid=?)
|
||||
SEARCH delivery_jobs USING COVERING INDEX idx_delivery_jobs_group_id (group_id=?)
|
||||
SEARCH delivery_tasks USING COVERING INDEX idx_delivery_tasks_group_id (group_id=?)
|
||||
SEARCH chat_item_mentions USING COVERING INDEX idx_chat_item_mentions_group_id (group_id=?)
|
||||
SEARCH chat_tags_chats USING COVERING INDEX idx_chat_tags_chats_chat_tag_id_group_id (group_id=?)
|
||||
SEARCH chat_item_moderations USING COVERING INDEX idx_chat_item_moderations_group_id (group_id=?)
|
||||
@@ -5621,6 +5759,7 @@ SEARCH contacts USING COVERING INDEX idx_contacts_via_group (via_group=?)
|
||||
Query: DELETE FROM messages WHERE connection_id = ?
|
||||
Plan:
|
||||
SEARCH messages USING COVERING INDEX idx_messages_connection_id (connection_id=?)
|
||||
SEARCH delivery_tasks USING COVERING INDEX idx_delivery_tasks_message_id (message_id=?)
|
||||
SEARCH msg_deliveries USING COVERING INDEX idx_msg_deliveries_message_id (message_id=?)
|
||||
SEARCH chat_item_moderations USING COVERING INDEX idx_chat_item_moderations_created_by_msg_id (created_by_msg_id=?)
|
||||
SEARCH chat_item_reactions USING COVERING INDEX idx_chat_item_reactions_created_by_msg_id (created_by_msg_id=?)
|
||||
@@ -5631,6 +5770,7 @@ SEARCH pending_group_messages USING COVERING INDEX idx_pending_group_messages_me
|
||||
Query: DELETE FROM messages WHERE connection_id = ? AND created_at <= ?
|
||||
Plan:
|
||||
SEARCH messages USING INDEX idx_messages_connection_id (connection_id=?)
|
||||
SEARCH delivery_tasks USING COVERING INDEX idx_delivery_tasks_message_id (message_id=?)
|
||||
SEARCH msg_deliveries USING COVERING INDEX idx_msg_deliveries_message_id (message_id=?)
|
||||
SEARCH chat_item_moderations USING COVERING INDEX idx_chat_item_moderations_created_by_msg_id (created_by_msg_id=?)
|
||||
SEARCH chat_item_reactions USING COVERING INDEX idx_chat_item_reactions_created_by_msg_id (created_by_msg_id=?)
|
||||
@@ -5641,6 +5781,7 @@ SEARCH pending_group_messages USING COVERING INDEX idx_pending_group_messages_me
|
||||
Query: DELETE FROM messages WHERE created_at <= ?
|
||||
Plan:
|
||||
SEARCH messages USING COVERING INDEX idx_messages_created_at (created_at<?)
|
||||
SEARCH delivery_tasks USING COVERING INDEX idx_delivery_tasks_message_id (message_id=?)
|
||||
SEARCH msg_deliveries USING COVERING INDEX idx_msg_deliveries_message_id (message_id=?)
|
||||
SEARCH chat_item_moderations USING COVERING INDEX idx_chat_item_moderations_created_by_msg_id (created_by_msg_id=?)
|
||||
SEARCH chat_item_reactions USING COVERING INDEX idx_chat_item_reactions_created_by_msg_id (created_by_msg_id=?)
|
||||
@@ -5651,6 +5792,7 @@ SEARCH pending_group_messages USING COVERING INDEX idx_pending_group_messages_me
|
||||
Query: DELETE FROM messages WHERE group_id = ?
|
||||
Plan:
|
||||
SEARCH messages USING COVERING INDEX idx_messages_group_id (group_id=?)
|
||||
SEARCH delivery_tasks USING COVERING INDEX idx_delivery_tasks_message_id (message_id=?)
|
||||
SEARCH msg_deliveries USING COVERING INDEX idx_msg_deliveries_message_id (message_id=?)
|
||||
SEARCH chat_item_moderations USING COVERING INDEX idx_chat_item_moderations_created_by_msg_id (created_by_msg_id=?)
|
||||
SEARCH chat_item_reactions USING COVERING INDEX idx_chat_item_reactions_created_by_msg_id (created_by_msg_id=?)
|
||||
@@ -6234,6 +6376,14 @@ Query: UPDATE contacts SET xcontact_id = ? WHERE contact_id = ?
|
||||
Plan:
|
||||
SEARCH contacts USING INTEGER PRIMARY KEY (rowid=?)
|
||||
|
||||
Query: UPDATE delivery_jobs SET job_status = ?, job_err_reason = ?, updated_at = ? WHERE delivery_job_id = ?
|
||||
Plan:
|
||||
SEARCH delivery_jobs USING INTEGER PRIMARY KEY (rowid=?)
|
||||
|
||||
Query: UPDATE delivery_tasks SET task_status = ?, task_err_reason = ?, updated_at = ? WHERE delivery_task_id = ?
|
||||
Plan:
|
||||
SEARCH delivery_tasks USING INTEGER PRIMARY KEY (rowid=?)
|
||||
|
||||
Query: UPDATE files SET agent_snd_file_deleted = 1, updated_at = ? WHERE user_id = ? AND file_id = ?
|
||||
Plan:
|
||||
SEARCH files USING INTEGER PRIMARY KEY (rowid=?)
|
||||
|
||||
@@ -395,7 +395,8 @@ CREATE TABLE messages(
|
||||
shared_msg_id BLOB,
|
||||
shared_msg_id_user INTEGER,
|
||||
author_group_member_id INTEGER REFERENCES group_members ON DELETE SET NULL,
|
||||
forwarded_by_group_member_id INTEGER REFERENCES group_members ON DELETE SET NULL
|
||||
forwarded_by_group_member_id INTEGER REFERENCES group_members ON DELETE SET NULL,
|
||||
broker_ts TEXT
|
||||
);
|
||||
CREATE TABLE pending_group_messages(
|
||||
pending_group_message_id INTEGER PRIMARY KEY,
|
||||
@@ -691,6 +692,38 @@ CREATE TABLE chat_item_mentions(
|
||||
chat_item_id INTEGER NOT NULL REFERENCES chat_items ON DELETE CASCADE,
|
||||
display_name TEXT NOT NULL
|
||||
);
|
||||
CREATE TABLE delivery_tasks(
|
||||
delivery_task_id INTEGER PRIMARY KEY,
|
||||
group_id INTEGER NOT NULL REFERENCES groups ON DELETE CASCADE,
|
||||
worker_scope TEXT NOT NULL,
|
||||
job_scope_spec_tag TEXT,
|
||||
job_scope_include_pending INTEGER,
|
||||
job_scope_support_gm_id INTEGER REFERENCES group_members(group_member_id) ON DELETE CASCADE,
|
||||
sender_group_member_id INTEGER NOT NULL REFERENCES group_members(group_member_id) ON DELETE CASCADE,
|
||||
message_id INTEGER REFERENCES messages ON DELETE CASCADE,
|
||||
message_from_channel INTEGER NOT NULL DEFAULT 0,
|
||||
task_status TEXT NOT NULL,
|
||||
task_err_reason TEXT,
|
||||
failed INTEGER DEFAULT 0,
|
||||
created_at TEXT NOT NULL DEFAULT(datetime('now')),
|
||||
updated_at TEXT NOT NULL DEFAULT(datetime('now'))
|
||||
);
|
||||
CREATE TABLE delivery_jobs(
|
||||
delivery_job_id INTEGER PRIMARY KEY,
|
||||
group_id INTEGER NOT NULL REFERENCES groups ON DELETE CASCADE,
|
||||
worker_scope TEXT NOT NULL,
|
||||
job_scope_spec_tag TEXT,
|
||||
job_scope_include_pending INTEGER,
|
||||
job_scope_support_gm_id INTEGER REFERENCES group_members(group_member_id) ON DELETE CASCADE,
|
||||
single_sender_group_member_id INTEGER REFERENCES group_members(group_member_id) ON DELETE CASCADE,
|
||||
body BLOB,
|
||||
cursor_group_member_id INTEGER,
|
||||
job_status TEXT NOT NULL,
|
||||
job_err_reason TEXT,
|
||||
failed INTEGER DEFAULT 0,
|
||||
created_at TEXT NOT NULL DEFAULT(datetime('now')),
|
||||
updated_at TEXT NOT NULL DEFAULT(datetime('now'))
|
||||
);
|
||||
CREATE INDEX contact_profiles_index ON contact_profiles(
|
||||
display_name,
|
||||
full_name
|
||||
@@ -1103,3 +1136,51 @@ CREATE INDEX idx_contacts_grp_direct_inv_from_group_member_id ON contacts(
|
||||
CREATE INDEX idx_contacts_grp_direct_inv_from_member_conn_id ON contacts(
|
||||
grp_direct_inv_from_member_conn_id
|
||||
);
|
||||
CREATE INDEX idx_delivery_tasks_group_id ON delivery_tasks(group_id);
|
||||
CREATE INDEX idx_delivery_tasks_job_scope_support_gm_id ON delivery_tasks(
|
||||
job_scope_support_gm_id
|
||||
);
|
||||
CREATE INDEX idx_delivery_tasks_sender_group_member_id ON delivery_tasks(
|
||||
sender_group_member_id
|
||||
);
|
||||
CREATE INDEX idx_delivery_tasks_message_id ON delivery_tasks(message_id);
|
||||
CREATE INDEX idx_delivery_tasks_next ON delivery_tasks(
|
||||
group_id,
|
||||
worker_scope,
|
||||
failed,
|
||||
task_status
|
||||
);
|
||||
CREATE INDEX idx_delivery_tasks_next_for_job_scope ON delivery_tasks(
|
||||
group_id,
|
||||
worker_scope,
|
||||
job_scope_spec_tag,
|
||||
job_scope_include_pending,
|
||||
job_scope_support_gm_id,
|
||||
failed,
|
||||
task_status
|
||||
);
|
||||
CREATE INDEX idx_delivery_tasks_next_for_job_scope_sender ON delivery_tasks(
|
||||
group_id,
|
||||
worker_scope,
|
||||
job_scope_spec_tag,
|
||||
job_scope_include_pending,
|
||||
job_scope_support_gm_id,
|
||||
sender_group_member_id,
|
||||
failed,
|
||||
task_status
|
||||
);
|
||||
CREATE INDEX idx_delivery_tasks_created_at ON delivery_tasks(created_at);
|
||||
CREATE INDEX idx_delivery_jobs_group_id ON delivery_jobs(group_id);
|
||||
CREATE INDEX idx_delivery_jobs_job_scope_support_gm_id ON delivery_jobs(
|
||||
job_scope_support_gm_id
|
||||
);
|
||||
CREATE INDEX idx_delivery_jobs_single_sender_group_member_id ON delivery_jobs(
|
||||
single_sender_group_member_id
|
||||
);
|
||||
CREATE INDEX idx_delivery_jobs_next ON delivery_jobs(
|
||||
group_id,
|
||||
worker_scope,
|
||||
failed,
|
||||
job_status
|
||||
);
|
||||
CREATE INDEX idx_delivery_jobs_created_at ON delivery_jobs(created_at);
|
||||
|
||||
Reference in New Issue
Block a user