18 Commits

Author SHA1 Message Date
David Robertson
2798733377
Ensure future message deletes clear ack pos 2023-05-10 11:22:46 +01:00
David Robertson
109aae25ba
Fix indentation 2023-05-03 11:25:37 +01:00
David Robertson
e1bc972ff7
Update the to-device table 2023-05-02 18:16:14 +01:00
Kegan Dougal
a6c3f8f3fc When a device is deleted, remove all device data with it (to-device events, device lists) 2023-03-01 16:56:04 +00:00
Kegan Dougal
f47e71c726 Add index on (position, device_id) for the to-device table
It is a big table (>7m rows and counting) and having this index
speeds up querying for to-device events significantly.
2023-01-04 13:59:30 +00:00
Kegan Dougal
6c4f7d3722 improvement: completely refactor device data updates
- `Conn`s now expose a direct `OnUpdate(caches.Update)` function
  for updates which concern a specific device ID.
- Add a bitset in `DeviceData` to indicate if the OTK or fallback keys were changed.
- Pass through the affected `DeviceID` in `pubsub.V2DeviceData` updates.
- Remove `DeviceDataTable.SelectFrom` as it was unused.
- Refactor how the poller invokes `OnE2EEData`: it now only does this if
  there are changes to OTK counts and/or fallback key types and/or device lists,
  and _only_ sends those fields, setting the rest to the zero value.
- Remove noisy logging.
- Add `caches.DeviceDataUpdate` which has no data but serves to wake-up the long poller.
- Only send OTK counts / fallback key types when they have changed, not constantly. This
  matches the behaviour described in MSC3884

The entire flow now looks like:
- Poller notices a diff against in-memory version of otk count and invokes `OnE2EEData`
- Handler updates device data table, bumps the changed bit for otk count.
- Other handler gets the pubsub update, directly finds the `Conn` based on the `DeviceID`.
  Invokes `OnUpdate(caches.DeviceDataUpdate)`
- This update is handled by the E2EE extension which then pulls the data out from the database
  and returns it.
- On initial connections, all OTK / fallback data is returned.
2022-12-22 15:08:42 +00:00
Kegan Dougal
f80dc00eaf Log org.matrix.msgid fields if they are present 2022-12-21 11:28:43 +00:00
Kegan Dougal
aa28df161c Rename package -> github.com/matrix-org/sliding-sync 2022-12-15 11:08:50 +00:00
Kegan Dougal
be8543a21a add extensions for typing and receipts; bugfixes and additional perf improvements
Features:
 - Add `typing` extension.
 - Add `receipts` extension.
 - Add comprehensive prometheus `/metrics` activated via `SYNCV3_PROM`.
 - Add `SYNCV3_PPROF` support.
 - Add `by_notification_level` sort order.
 - Add `include_old_rooms` support.
 - Add support for `$ME` and `$LAZY`.
 - Add correct filtering when `*,*` is used as `required_state`.
 - Add `num_live` to each room response to indicate how many timeline entries are live.

Bug fixes:
 - Use a stricter comparison function on ranges: fixes an issue whereby UTs fail on go1.19 due to change in sorting algorithm.
 - Send back an `errcode` on HTTP errors (e.g expired sessions).
 - Remove `unsigned.txn_id` on insertion into the DB. Otherwise other users would see other users txn IDs :(
 - Improve range delta algorithm: previously it didn't handle cases like `[0,20] -> [20,30]` and would panic.
 - Send HTTP 400 for invalid range requests.
 - Don't publish no-op unread counts which just adds extra noise.
 - Fix leaking DB connections which could eventually consume all available connections.
 - Ensure we always unblock WaitUntilInitialSync even on invalid access tokens. Other code relies on WaitUntilInitialSync() actually returning at _some_ point e.g on startup we have N workers which bound the number of concurrent pollers made at any one time, we need to not just hog a worker forever.

Improvements:
 - Greatly improve startup times of sync3 handlers by improving `JoinedRoomsTracker`: a modest amount of data would take ~28s to create the handler, now it takes 4s.
 - Massively improve initial initial v3 sync times, by refactoring `JoinedRoomsTracker`, from ~47s to <1s.
 - Add `SlidingSyncUntil...` in tests to reduce races.
 - Tweak the API shape of JoinedUsersForRoom to reduce state block processing time for large rooms from 63s to 39s.
 - Add trace task for initial syncs.
 - Include the proxy version in UA strings.
 - HTTP errors now wait 1s before returning to stop clients tight-looping on error.
 - Pending event buffer is now 2000.
 - Index the room ID first to cull the most events when returning timeline entries. Speeds up `SelectLatestEventsBetween` by a factor of 8.
 - Remove cancelled `m.room_key_requests` from the to-device inbox. Cuts down the amount of events in the inbox by ~94% for very large (20k+) inboxes, ~50% for moderate sized (200 events) inboxes. Adds book-keeping to remember the unacked to-device position for each client.
2022-12-14 18:53:55 +00:00
Kegan Dougal
10f94336ba state: rewrite SELECT ... IN to be SELECT ... ANY
Using ANY allows us to give a single parameter containing many many
entries, which bypasses the postgres parameter limit of 65535. Without
this, large rooms like Matrix HQ which have current state >65535 events
will not be stored correctly.

Add torture test to the events table to assert that we can query >65535
events.
2022-02-22 17:38:18 +00:00
Kegan Dougal
064095c899 BREAKING: Modify syncv3_to_device_messages to include columns for type/sender
We want to be able to query based on these fields.
2022-02-22 17:04:31 +00:00
Kegan Dougal
502d3b5852 Flesh out test cases for to-device events 2021-12-14 14:38:39 +00:00
Kegan Dougal
0e021eb560 Pass to-device messages through to the client
- Treat to-device messages as opaque JSON blobs
- Add basic integration test to ensure the messages make it from v2 to v3.
2021-12-14 11:51:47 +00:00
Kegan Dougal
8c27fbb877 Implement to_device message cleanup after all sessions have ACKed the message 2021-08-05 12:50:03 +01:00
Kegan Dougal
9c967ffe2a Implement to_device limits
- Fix a bug where copies of `Token` didn't copy the position (swap to actual arrays not slices)
- Modify the interface for `DataInRange` to allow it to return an `upTo` value. Required because
  requesting positions 10-50 when the limit is 20 may return events between 10-30, meaning the
  to position needs updating else the events between 30-50 will be lost.
2021-08-05 10:54:04 +01:00
Kegan Dougal
5b4b1a10ed Glue to_device stuff into the v3 handler, refactor to prevent import cycles 2021-08-03 12:06:09 +01:00
Kegan Dougal
0075b46bc9 Flesh out to_device_table with tests, update gjson dep 2021-08-03 09:33:38 +01:00
Kegan Dougal
bcfe9b051f Add to_device table; factor out Chunkify so we can re-use it 2021-08-02 16:45:09 +01:00