fix: implement MSC3959/3960/3961 extension room scoping and required_state delta #1450
Closed
0xnim
wants to merge 10 commits from
0xnim/continuwuity:fix/v5-sync into main
pull from: 0xnim/continuwuity:fix/v5-sync
merge into: continuwuation:main
continuwuation:main
continuwuation:renovate/rust-non-major
continuwuation:nex/feat/msc4491-invite-reasons-in-room-creation
continuwuation:renovate/ruma-digest
continuwuation:aranje/illegal-car-mods
continuwuation:renovate/cargo-bins-cargo-binstall-1.x
continuwuation:ginger/oauth
continuwuation:nex/feat/admin-api
continuwuation:nex/perf/get-missing-events
continuwuation:renovate/serde-saphyr-0.x
continuwuation:ginger/kill-sync-tokens
continuwuation:renovate/rand_core-0.x
continuwuation:nex/feat/deprecated-room-versions
continuwuation:release/v0.5.9
continuwuation:nex/feat/enable-debug-log-release-builds
continuwuation:nex/feat/room-purging
continuwuation:nex/feat/room-shutdown
continuwuation:ginger/ruma-upstreaming
continuwuation:jade/tls-backends
continuwuation:ginger/email-fixes
continuwuation:jade/changelog-labels
continuwuation:nex/fix/v12-publishing
continuwuation:jade/build-info
continuwuation:jade/purge-sync-tokens
continuwuation:ginger/terms-and-conditions
continuwuation:ginger/remove-sliding-sync-proxy
continuwuation:nex/fix/pusher-association
continuwuation:ginger/email-support
continuwuation:jade/community-guidelines
continuwuation:nex/fix/federation-format
continuwuation:jade/git-deps-updates
continuwuation:jade/changelog-check
continuwuation:jade/rust-1-92
continuwuation:ginger/password-reset
continuwuation:nex/experiment/push-gateway-logs
continuwuation:ginger/msc3575-obliteration
continuwuation:nex/feat/block-busted-rooms
continuwuation:nex/fix/informative-startup-errs
continuwuation:ginger/no-left-room-initial-sync
continuwuation:jade/docker-entrypoint
continuwuation:jade/dehydrated-devices
continuwuation:ginger/complement-fixes
continuwuation:nex/fix/stale-destination-cache
continuwuation:nex/experiment/sync-mutex
continuwuation:tcpipuk/docker-docs
continuwuation:jade/snafu
continuwuation:jade/rand-update
continuwuation:nex/stateres-refactor
continuwuation:ginger/779-in-troubleshooting
continuwuation:jade/liveit-guide
continuwuation:jade/http3
continuwuation:nex/feat/admin-hide-empty-rooms
continuwuation:ginger/oobe
continuwuation:nex/fix/debian-thingy
continuwuation:jade/ldap-admin-check
continuwuation:nex/fix/remote-restricted-joins
continuwuation:nex/feat/msc4406-sender-ignored
continuwuation:jade/deadlock-detection
continuwuation:jade/get-started
continuwuation:jade/docs-guide
continuwuation:ginger/fix-local-invites
continuwuation:nex/fix/tpi
continuwuation:nex/feat/room-deletion
continuwuation:nex/feat/msc4322-media-redaction
continuwuation:ginger/stitched-order
continuwuation:ginger/deps/update-rspress
continuwuation:jade/admin-announce-improvements
continuwuation:ginger/xtask-improvements
continuwuation:jade/improve-admin-config-display
continuwuation:nex/fix/better-stateres-error-logs
continuwuation:jade/sender-timeouts
continuwuation:nex/feat/custom-v12-room-ids
continuwuation:ginger/update-metadata
continuwuation:nex/feat/admin-force-logout
continuwuation:tom/max-perf-docs
continuwuation:nex/fix/invalid-appservice-reg
continuwuation:nex/feat/antispam
continuwuation:nex/feat/account-locking
continuwuation:jade/logging-cleanup
continuwuation:jade/remove-legacy-appservice-auth
continuwuation:nex/fix/key-query
continuwuation:jade/update-prek
continuwuation:nex/fix/room-summaries
continuwuation:ginger/restrict-admin-commands
continuwuation:ginger/enable-console-by-default
continuwuation:jade/tag-fixes
continuwuation:jade/otlp
continuwuation:nex/meta/pull-req-template
continuwuation:nex/fix/fed-invite-compliance
continuwuation:nex/feat/build-commit
continuwuation:nex/feat/join-logging
continuwuation:jade/mailmap-updates
continuwuation:jade/hack-ci-tmp
continuwuation:jade/v12-stable
continuwuation:jade/relations
continuwuation:ginger/database-refactor
continuwuation:jade/fix-ldap-uiaa
continuwuation:nex/fix/validation
continuwuation:ginger/nuke-invalid-msc4133-fields-in-migration
continuwuation:ginger/downgrade-artifact-actions
continuwuation:oddlid/reload-fix
continuwuation:jade/fix-assert
continuwuation:ginger/sync-v3-cleanup
continuwuation:ginger/remove-absolute-action-urls
continuwuation:jade/website
continuwuation:nex/fix/backoff
continuwuation:ginger/fix-mdbook-for-0.5
continuwuation:ginger/no-docker-on-prs
continuwuation:backport/v0.5.0-rc.8-1
continuwuation:nex/fed-improvements
continuwuation:jade/rust-1.90
continuwuation:jade/mirror-dockerhub
continuwuation:jade/clippy-fixes
continuwuation:jade/fix-support
continuwuation:jade/clean-images
continuwuation:jade/wal-compression-type
continuwuation:jade/flake-clone
continuwuation:ginger/upload-rpms-on-schedule
continuwuation:nex/fix/incoming-fetch
continuwuation:nex/fix/upgrade
continuwuation:tom/ci-fedora-rpm
continuwuation:jade/ci-release-fix
continuwuation:jade/rocksdb-10-5
continuwuation:ginger/fix-msc4133-migration
continuwuation:ginger/migrate-busted-tz
continuwuation:hydra/public
continuwuation:nex/feat/manual-extremities
continuwuation:nex/feat/async-media
continuwuation:nex/feat/fast-joins-hack-do-not-use-DO-NOT-USE
continuwuation:nex/feat/better-logging
continuwuation:trigger-ci-so-latest-isnt-on-illegal-car-mods
continuwuation:nex/feat/pins-backfill
continuwuation:jade/tuwunel-2025-06-old
continuwuation:jade/ai-slop-db-docs
continuwuation:nex/fix-create-auth
continuwuation:jade/version-stats
continuwuation:jade/read-receipts
continuwuation:jade/rust-toolchain-no-targets
continuwuation:jade/logging-features
continuwuation:jade/syncv5-typing
continuwuation:jade/msc2815
continuwuation:morguldir/see-eye
continuwuation:jade/css-small-screen
continuwuation:nex/wip-751
continuwuation:tuwunel-rebase
continuwuation:test
continuwuation:oddlid/rename-admin-room-bot
continuwuation:strawberry/nix-ci-stuff
continuwuation:strawberry/valgrind
continuwuation:phonemain
continuwuation:strawberry/morgs-snake-sync-jason-main
continuwuation:newer-media-endpoints
continuwuation:folly-coroutines-async-io
continuwuation:federation-retry-timer-port
continuwuation:bad-attempt-at-extracting-homeserver-signing-key
continuwuation:room-deletion-attempt-do-not-use
10 commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
5e33b29efc |
style: cargo +nightly fmt | |||
|
78f96806ee |
chore: add news fragment for v5 sync extension scoping fixes | |||
|
d793d442ec |
feat(sync): track sent required_state per room for incremental sync delta
Add SnakeSyncCache.sent_state: a per-room map of (event_type, state_key)
→ event_id recording which state events were last sent to the client.
Two new Service methods:
get_room_sent_state – read the cache for one room
update_room_sent_state – write the cache after each sync response
collect_required_state gains snake_key (None = connectionless/no cache)
and roomsince parameters:
- roomsince == 0 (initial sync): return all matching events and
populate the cache.
- roomsince != 0 and snake_key is Some (incremental, has connection):
only return events whose event_id differs from the cached value.
- roomsince != 0 and snake_key is None (connectionless incremental):
return all matching events (no cache to diff against).
Also export SnakeConnectionsKey from conduwuit-service::sync so the API
crate can reference it without duplicating the type definition.
|
|||
|
7634dd826e |
feat(sync): implement MSC3959/3960/3961 extension room scoping
Add extension_room_set helper that computes the qualifying room set for an extension from its lists and rooms filter fields per MSC4186. MSC3960 receipts: move collection out of process_rooms into collect_receipts, gated on enabled + filters. MSC3961 typing: replace the dead filter variables in collect_typing_events with an extension_room_set call so only qualifying rooms get typing data. MSC3959 account data: move per-room collection out of process_rooms into collect_account_data using per-room roomsince values and filter. Route handler: collect_receipts and collect_account_data now run after todo_rooms is populated; e2ee and to_device still run in parallel join. |
|||
|
614a1a28a0 |
fix(sync): restore _services param, add required_state skip, track room provenance
- Restore `_services: &Services` parameter on `collect_receipts` - Add cheap pre-guard in `process_rooms` to skip `collect_required_state` DB call when no state was requested and there is nothing else to send - `handle_lists` now returns `BTreeMap<String, BTreeSet<OwnedRoomId>>` (rooms visible per list window) - `fetch_subscriptions` now returns `BTreeSet<OwnedRoomId>` (subscription rooms); captured as `_rooms_by_list` / `_subscription_rooms` for use in the upcoming extension-scoping changes |
|||
|
7a5af75347 |
fix(sync): include required_state in incremental room skip condition
Rooms with pending required state events were incorrectly skipped on incremental syncs when the timeline and receipts were empty. Move collect_required_state before the early-continue and add its emptiness as a guard condition. |
|||
|
93b7aa6a34 |
fix(sync): avoid recomputing snake_key on each iteration in handle_lists
The key is derived from sender_user, sender_device, and conn_id, all of which are constant across list iterations. Compute it once before the loop. |
|||
|
379fd097d1 |
fix(sync): remove unused services parameter from collect_receipts
The parameter was unused and suppressed with an underscore prefix. Also replace explicit empty struct construction with Default::default(). |
|||
|
23e86e9e03 |
fix(sync): remove dead return type from handle_lists
handle_lists always returned BTreeMap::default() and the call site never captured the return value. |
|||
|
573bc731f9 |
fix(sync): combine duplicate timeline PDU iterations |