Skip to content

Conversation

@Simon-Laux
Copy link
Contributor

@Simon-Laux Simon-Laux commented Oct 29, 2025

This is the branch for #7367
closes #7367

Currently removed tests

  • test_something.py::test_reaction_to_partially_fetched_msg
  • python/tests/test_1_online.py::test_webxdc_download_on_demand
  • src/calls/calls_tests.py::test_no_partial_calls
  • src/message/message_tests.rs::test_markseen_not_downloaded_msg
  • src/receive_imf/receive_imf_tests.rs::test_download_later
  • src/receive_imf/receive_imf_tests.rs::test_create_group_with_big_msg
  • src/receive_imf/receive_imf_tests.rs::test_prefer_references_to_downloaded_msgs
  • src/receive_imf/receive_imf_tests.rs::test_partial_download_key_contact_lookup
  • src/webxdc/webxdc_tests.rs::test_webxdc_update_for_not_downloaded_instance
  • src/download.rs::test_download_limit
  • src/download.rs::test_partial_receive_imf
  • src/download.rs::test_partial_download_and_ephemeral
  • src/download.rs::test_status_update_expands_to_nothing
  • src/download.rs::test_mdn_expands_to_nothing
  • src/download.rs::test_partial_download_trashed
  • src/reaction.rs::test_partial_download_and_reaction

Progress of the tests

Overview about the recycled(♻️) and dropped(🗑️) tests of the tests that I removed in #7373

All the recycled tests were already recycled/re-made except for some which are still to do:
(none)

Furthermore there need to be new tests to test the downloading/scheduling changes.


TODO Tests

  • sending pre-message, post-message
  • metadata in pre-message
  • process receiving
  • display attachment info in pre-message
  • test scheduler imap fetching
  • test failing download sets state to failed
  • multi device tests
  • deletion tests

postponed to do tests

(none)

discarded/ignored test ideas

maybe we should reconsider / discuss those?

  • test that full message, replacing pre-message does not work if the message encryption state is not the same for both messages (both full- and pre-message)
    • unencrypted pre- and full-message are not sent

@Simon-Laux Simon-Laux changed the title [Branch] Pre-messages / next version of download on demand [Branch] pre-messages / next version of download on demand Oct 29, 2025
@link2xt link2xt force-pushed the pre-messages branch 3 times, most recently from 2f1c383 to 6bcc795 Compare December 11, 2025 12:00
@link2xt link2xt force-pushed the pre-messages branch 6 times, most recently from 8443b17 to 702771f Compare December 11, 2025 21:24
- Remove partial downloads (remove creation of the stub messages) (#7373)
- Remove "Download maximum available until" and remove stock string `DC_STR_DOWNLOAD_AVAILABILITY` (#7369)
- Send pre-message on messages with large attachments (#7410)
- Pre messages can now get read receipts (#7433)

Co-authored-by: Hocuri <hocuri@gmx.de>
@link2xt link2xt changed the title [Branch] pre-messages / next version of download on demand feat: pre-messages / next version of download on demand Dec 14, 2025
Comment on lines +1475 to +1478
"CREATE TABLE download_new (
rfc724_mid TEXT NOT NULL DEFAULT '',
msg_id INTEGER NOT NULL DEFAULT 0
) STRICT;
Copy link
Collaborator

@Hocuri Hocuri Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@link2xt I'm wondering whether we should add UNIQUE(rfc724_mid) or UNIQUE(msg_id)? Or even both? I guess it doesn't really make sense to have the same message in there twice?

Copy link
Collaborator

@iequidoo iequidoo Dec 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need both msg_id and rfc724_mid in this table? rfc724_mid can be obtained from msg_id.
EDIT: Got it, msg_id is 0 when rows are inserted to download in fetch_new_msg_batch(). But UNIQUE(rfc724_mid) may still make sense.

Previously, the uid_next wasn't advanced, which didn't create any
problems, but it also was inefficient, because another loop was done
trying to fetch the message again (and then finally skipping it, because
it's already known).
* - `download_limit` = Messages up to this number of bytes are downloaded automatically.
* For larger messages, only the header is downloaded and a placeholder is shown.
* For messages with large attachments, two messages are sent:
* a Pre-Message containing metadata and a Post-Message containing the attachment.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Full message" was a better term, "post-message" is literally "smth going after the message". And the full message should contain metadata as well, but the documentation doesn't say that


/// Metadata contained in Pre-Message that describes the Post-Message.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PreMsgMetadata {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually this is PreMsgData, it's metadata for the "post-message" (and even not metadata, but a part thereof)

.log_err(ctx)
.ok();

download_msgs(ctx, &mut session)
Copy link
Collaborator

@iequidoo iequidoo Dec 24, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's better to move this right after download_known_post_messages_without_pre_message() so that it goes before scan_folders(). Scanning folders isn't that important, it's even debounced to once per minute.

EDIT: Before, it even preceded the whole fetch_idle().

JOIN msgs m ON d.msg_id = m.id
WHERE m.rfc724_mid IS NOT NULL AND m.rfc724_mid != '';
DROP TABLE download;
ALTER TABLE download_new RENAME TO download;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider renaming to downloads, we usually use plurals for tables

Comment on lines +737 to +738
uids_fetch.push(uid);
uid_message_ids.insert(uid, message_id);
Copy link
Collaborator

@iequidoo iequidoo Dec 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

                    if download_limit.is_none_or(|download_limit| size <= download_limit) {
                        uids_fetch.push(uid);
                        uid_message_ids.insert(uid, message_id);
                    } else {
                        download_later.push(message_id.clone());
                        largest_uid_skipped = Some(uid);
                    }

Maybe do smth like this here? This way pre-messages should still be downloaded immediately and big emails are downloaded later to speed up downloading of pre-messages and other small messages.

I've chacked that JSON-RPC tests work with this suggestion.

@iequidoo

This comment was marked as resolved.

Hocuri and others added 4 commits December 30, 2025 01:27
…essage before

There is a bug in pre-messages:
- A pre-message adds an entry to the `msgs` table with the `rfc724_mid` of the post-message
- If the pre-message and post-message are fetched in separate cycles:
  - `prefetch_should_download()` returns false, because `rfc724_mid_exists()` returns something
  - so, the message is not added to `download_later`, and never automatically downloaded.
…e-messages modify group members

There are no partial messages anymore, so i have no idea what else to check.
@iequidoo
Copy link
Collaborator

Force-pushed the branch to have #7625 as a single commit with the description from the PR. Also fixed test_download_limit_chat_assignment

trans.execute(
"UPDATE imap SET target=? WHERE rfc724_mid=?",
(target, msg.rfc724_mid),
(target, &msg.rfc724_mid),
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This deletes the post-message on IMAP, but the pre-message is never deleted. We need to save rfc724_mid of pre-messages to the db to delete them as well. Maybe add msgs.rfc724_mid_pre column?

It currently fails because pre-messages aren't deleted on IMAP.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Tracking Issue] Pre-Messages

5 participants