33 Commits

Author SHA1 Message Date
Guillem Nieto Taló
45f3e012db fix: urlencode since opaque string
Since/next batch is an opaque string and might need to be urlencoded
before being sent to the server.

Signed-off-by: Guillem Nieto <gnieto.talo@gmail.com>
2024-05-20 12:09:31 +02:00
Boris Rybalkin
8d38785ac0 back to util functions 2023-11-16 19:31:43 +00:00
Boris Rybalkin
b055d27d22 extract HomeServerUrl struct 2023-11-16 13:57:51 +00:00
Boris Rybalkin
ae73ace4a4 unix socket support
Signed-off-by: Boris Rybalkin <ribalkin@gmail.com>
2023-11-16 11:02:53 +00:00
David Robertson
7111ab1d9f
Check that the homeserver is reachable at startup
Closes #286.

Tested as follows (see line 4):

```
Sync v3 [0.99.10] (6fe9b18)
Debug=true LogLevel= MaxConns=0
Starting prometheus listener on :6060
13:23:33 WRN Could not contact upstream homeserver. Is SYNCV3_SERVER set correctly? error="Get \"http://localhost:8888/_matrix/client/versions\": dial tcp [::1]:8888: connect: connection refused" dest=http://localhost:8888
2023/09/26 13:23:33 OK   20230728114555_device_data_drop_id.sql (7.48ms)
2023/09/26 13:23:33 OK   20230802121023_device_data_jsonb.go (13.85ms)
2023/09/26 13:23:33 OK   20230814183302_cbor_device_data.go (9.01ms)
2023/09/26 13:23:33 OK   20230822180807_bogus_snapshot_cleanup.go (7.64ms)
2023/09/26 13:23:33 OK   20230913120537_events_missing_previous.sql (7.15ms)
2023/09/26 13:23:33 goose: successfully migrated database to version: 20230913120537
13:23:33 INF creating handler
13:23:33 INF retrieved global snapshot from database
13:23:33 INF listening on 0.0.0.0:8844
13:23:33 INF StartV2Pollers num_devices=0 num_fail_decrypt=0
13:23:33 INF StartV2Pollers finished
```
2023-09-26 13:24:26 +01:00
Till Faelligen
a397b72c30
Make HTTP timeout configurable 2023-09-19 11:48:49 +02:00
Quentin Gliech
af5e8579b2 Better propagate request context
This properly propagates the go Context on down to all HTTP calls, which means that outgoing request have the OTLP trace context.
This also adds the Jaeger propagator to the list of OTEL propagators, so that Synapse properly gets the incoming trace context.
It also upgrades all the OTEL libraries
2023-09-13 19:41:52 +02:00
Till Faelligen
215da69b45
Filter out presence events from /sync requests 2023-09-07 12:05:44 +02:00
Till Faelligen
c4fb0017a3
set_presence=offline to reduce load on upstream homeservers 2023-09-07 11:28:31 +02:00
Kegan Dougal
b2c26b7e93 Redact events in the DB on m.room.redaction
Fixes #279
2023-08-31 17:06:44 +01:00
Mathieu Velten
3bf3f23053 Increase timeout of init sync to 30mn for small homeservers 2023-06-27 20:07:21 +02:00
David Robertson
aadc358581
Request timeline limit of 50 instead of HS default 2023-04-14 17:57:04 +01:00
David Robertson
846197e996
Have WhoAmI extract the device_id
Useful for #51, small enough to include in isolation
2023-04-11 22:14:15 +01:00
Kegan Dougal
6bdef5feba bugfix: expire connections when the access token gets invalidated
With regression test. The behaviour is:
 - Delete the connection, such that incoming requests will end up with M_UNKNOWN_POS
 - The next request will then return HTTP 401.

This has knock-on effects:
 - We no longer send HTTP 502 if /whoami returns 401, instead we return 401.
 - When the token is expired (pollers get 401, the device is deleted from the DB).
2023-03-01 16:40:15 +00:00
Kegan Dougal
48f28f9f6c perf: filter out all rooms when doing an initial sync on 2nd+ pollers
Fixes #17 in theory, as now the initial sync request will have no
rooms and hence be faster to return. In theory. Maybe. Let's see.
2023-01-05 18:25:25 +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
47ddc04652 E2EE extension: Add support for device_unused_fallback_key_types
With tests
2022-08-09 10:05:18 +01:00
Kegan Dougal
0a17d0a4e4 perf: don't alert connstate for every event in state
We don't care about that as they never form part of the timeline.
Also, only send up a timeline limit: 1 filter to sync v2 when there
is no ?since token. Otherwise, we want a timeline limit >1 so we
can ensure that we remain gapless (else the proxy drops events).
2022-07-21 16:47:13 +01:00
Kegan Dougal
b9196db30b BREAKING(db): refactor how history is calculated
- Completely ignore events in the `state` block when processing
  sync v3 requests with a large `timeline_limit`. We should never
  have been including them in the first place as they are not
  chronological at all.
- Perform sync v2 requests with a timeline limit of 1 to ensure
  we can always return a `prev_batch` token to the caller. This
  means on the first startup, clicking a room will force a `/messages`
  hit until there have been `$limit` new events, in which case it
  will be able to serve these events from the local DB. Critically,
  this ensures that we never send back an empty `prev_batch`, which
  causes clients to believe that there is no history in a room.
2022-07-21 16:20:59 +01:00
Kegan Dougal
47b74a6be6 Automatically start v2 pollers on startup
We can do this now because we store the access token for each device.

Throttled at 16 concurrent sync requests to avoid causing
thundering herds on startup.
2022-07-14 10:48:45 +01:00
Kegan Dougal
5c666a8e50 use constants for alice/aliceToken in integration tests 2022-03-25 13:07:12 +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
c6de2270ed bugfix: is_dm filter was ignored for new live events
Caused by not loading the `UserRoomData` when applying the filter.
Added regression test.
2021-11-11 12:39:19 +00:00
Kegan Dougal
a2d6774024 Support filters.is_dm
- Add `AccountDataTable` with tests.
- Read global and per-room account data from sync v2 and add new callbacks to the poller.
- Update the `SyncV3Handler` to persist account data from sync v2 then notify the user cache.
- Update the `UserCache` to update `UserRoomData.IsDM` status on `m.direct` events.
- Read `m.direct` event from the DB when `UserCache` is created to track DM status per-room.
2021-11-09 15:08:08 +00:00
Kegan Dougal
7ca81ef68a bugfix: ensure notification counts don't get reset on new events
With regression tests
2021-11-03 11:07:01 +00:00
Kegan Dougal
6c12077f62 Ensure the first sync is snappy if there is no traffic 2021-10-29 13:15:39 +01:00
Kegan Dougal
91653ce3d1 Add integration test jig and a basic test
- Add sync3.Response UnmarshalJSON() so we can dynamically make the
  correct single/range op.
- Create sub-structs for sync2.Response to make inline embedding
  easier in tests.
2021-10-25 18:03:32 +01:00
Kegan Dougal
fb9394d73b Add UnreadTable to track per-user per-room unread counters
With tests. Add function to V2DataReceiver interface.
2021-10-08 12:31:56 +01:00
Kegan Dougal
07950a6acc Handle left rooms in v2 response 2021-09-30 18:23:52 +01:00
Kegan Dougal
f968478387 Set user-agent on v2 requests 2021-09-30 17:32:30 +01:00
Kegan Dougal
749e4d413e Add integration tests on the http handler 2021-07-21 16:35:36 +01:00
Kegan Dougal
747d85e87c Map Auth header to user via /whoami; add query for highest nid
Add stub room list stream
2021-06-16 18:56:31 +01:00
Kegan Dougal
29b17b89e5 Shuffle package names around so we don't clash with Go terminology for v2 and v3 2021-06-09 17:27:54 +01:00