diff --git a/.forgejo/workflows/update-flake-hashes.yml b/.forgejo/workflows/update-flake-hashes.yml index 44bf7402b..e572046f1 100644 --- a/.forgejo/workflows/update-flake-hashes.yml +++ b/.forgejo/workflows/update-flake-hashes.yml @@ -1,7 +1,6 @@ name: Update flake hashes on: - workflow_dispatch: pull_request: paths: - "Cargo.lock" diff --git a/changelog.d/2226.bugfix.md b/changelog.d/2226.bugfix.md new file mode 100644 index 000000000..1407c9f3c --- /dev/null +++ b/changelog.d/2226.bugfix.md @@ -0,0 +1 @@ +Sliding sync responses no longer include an empty room account data entry for every room in a list's range. Contributed by @eleboucher. diff --git a/src/api/client/sync/v5.rs b/src/api/client/sync/v5.rs index 2148f3ece..d169509a6 100644 --- a/src/api/client/sync/v5.rs +++ b/src/api/client/sync/v5.rs @@ -855,15 +855,21 @@ where }; if body.extensions.account_data.enabled == Some(true) { - response.extensions.account_data.rooms.insert( - room_id.to_owned(), - services + let room_account_data: Vec<_> = services + .account_data + .changes_since(Some(room_id), sender_user, Some(*roomsince), Some(next_batch)) + .ready_filter_map(|e| extract_variant!(e, AnyRawAccountDataEvent::Room)) + .collect() + .await; + + // An empty entry makes clients treat the room as updated. + if !room_account_data.is_empty() { + response + .extensions .account_data - .changes_since(Some(room_id), sender_user, Some(*roomsince), Some(next_batch)) - .ready_filter_map(|e| extract_variant!(e, AnyRawAccountDataEvent::Room)) - .collect() - .await, - ); + .rooms + .insert(room_id.to_owned(), room_account_data); + } } let last_privateread_update = services diff --git a/src/service/rooms/event_handler/fetch_and_handle_outliers.rs b/src/service/rooms/event_handler/fetch_and_handle_outliers.rs index b4285be37..3813e10db 100644 --- a/src/service/rooms/event_handler/fetch_and_handle_outliers.rs +++ b/src/service/rooms/event_handler/fetch_and_handle_outliers.rs @@ -155,7 +155,12 @@ impl super::Service { .prev_events() .stream() .fold(0_u8, |i, event_id| async move { - if self.services.timeline.pdu_exists(event_id).await { + if self + .services + .timeline + .non_outlier_pdu_exists(event_id) + .await + { i } else { i.expected_add(1)