Skip to content
This repository was archived by the owner on Mar 26, 2024. It is now read-only.

Commit abee71f

Browse files
committed
Merge tag 'v1.90.0' into merge-1.90
No significant changes since 1.90.0rc1. - Scope transaction IDs to devices (implement [MSC3970](matrix-org/matrix-spec-proposals#3970)). ([\matrix-org#15629](matrix-org#15629)) - Remove old rows from the `cache_invalidation_stream_by_instance` table automatically (this table is unused in SQLite). ([\matrix-org#15868](matrix-org#15868)) - Fix a long-standing bug where purging history and paginating simultaneously could lead to database corruption when using workers. ([\matrix-org#15791](matrix-org#15791)) - Fix a long-standing bug where profile endpoint returned a 404 when the user's display name was empty. ([\matrix-org#16012](matrix-org#16012)) - Fix a long-standing bug where the `synapse_port_db` failed to configure sequences for application services and partial stated rooms. ([\matrix-org#16043](matrix-org#16043)) - Fix long-standing bug with deletion in dehydrated devices v2. ([\matrix-org#16046](matrix-org#16046)) - Add `org.opencontainers.image.version` labels to Docker containers [published by Matrix.org](https://hub.docker.com/r/matrixdotorg/synapse). Contributed by Mo Balaa. ([\matrix-org#15972](matrix-org#15972), [\matrix-org#16009](matrix-org#16009)) - Add a internal documentation page describing the ["streams" used within Synapse](https://matrix-org.github.io/synapse/v1.90/development/synapse_architecture/streams.html). ([\matrix-org#16015](matrix-org#16015)) - Clarify comment on the keys/upload over replication enpoint. ([\matrix-org#16016](matrix-org#16016)) - Do not expose Admin API in caddy reverse proxy example. Contributed by @NilsIrl. ([\matrix-org#16027](matrix-org#16027)) - Remove support for legacy application service paths. ([\matrix-org#15964](matrix-org#15964)) - Move support for application service query parameter authorization behind a configuration option. ([\matrix-org#16017](matrix-org#16017)) - Update SQL queries to inline boolean parameters as supported in SQLite 3.27. ([\matrix-org#15525](matrix-org#15525)) - Allow for the configuration of the backoff algorithm for federation destinations. ([\matrix-org#15754](matrix-org#15754)) - Allow modules to check whether the current worker is configured to run background tasks. ([\matrix-org#15991](matrix-org#15991)) - Update support for [MSC3958](matrix-org/matrix-spec-proposals#3958) to match the latest revision of the MSC. ([\matrix-org#15992](matrix-org#15992)) - Allow modules to schedule delayed background calls. ([\matrix-org#15993](matrix-org#15993)) - Properly overwrite the `redacts` content-property for forwards-compatibility with room versions 1 through 10. ([\matrix-org#16013](matrix-org#16013)) - Fix building the nix development environment on MacOS systems. ([\matrix-org#16019](matrix-org#16019)) - Remove leading and trailing spaces when setting a display name. ([\matrix-org#16031](matrix-org#16031)) - Combine duplicated code. ([\matrix-org#16023](matrix-org#16023)) - Collect additional metrics from `ResponseCache` for eviction. ([\matrix-org#16028](matrix-org#16028)) - Fix endpoint improperly declaring support for MSC3814. ([\matrix-org#16068](matrix-org#16068)) - Drop backwards compat hack for event serialization. ([\matrix-org#16069](matrix-org#16069)) * Update PyYAML to 6.0.1. ([\matrix-org#16011](matrix-org#16011)) * Bump cryptography from 41.0.2 to 41.0.3. ([\matrix-org#16048](matrix-org#16048)) * Bump furo from 2023.5.20 to 2023.7.26. ([\matrix-org#16077](matrix-org#16077)) * Bump immutabledict from 2.2.4 to 3.0.0. ([\matrix-org#16034](matrix-org#16034)) * Update certifi to 2023.7.22 and pygments to 2.15.1. ([\matrix-org#16044](matrix-org#16044)) * Bump jsonschema from 4.18.3 to 4.19.0. ([\matrix-org#16081](matrix-org#16081)) * Bump phonenumbers from 8.13.14 to 8.13.18. ([\matrix-org#16076](matrix-org#16076)) * Bump regex from 1.9.1 to 1.9.3. ([\matrix-org#16073](matrix-org#16073)) * Bump serde from 1.0.171 to 1.0.175. ([\matrix-org#15982](matrix-org#15982)) * Bump serde from 1.0.175 to 1.0.179. ([\matrix-org#16033](matrix-org#16033)) * Bump serde from 1.0.179 to 1.0.183. ([\matrix-org#16074](matrix-org#16074)) * Bump serde_json from 1.0.103 to 1.0.104. ([\matrix-org#16032](matrix-org#16032)) * Bump service-identity from 21.1.0 to 23.1.0. ([\matrix-org#16038](matrix-org#16038)) * Bump types-commonmark from 0.9.2.3 to 0.9.2.4. ([\matrix-org#16037](matrix-org#16037)) * Bump types-jsonschema from 4.17.0.8 to 4.17.0.10. ([\matrix-org#16036](matrix-org#16036)) * Bump types-netaddr from 0.8.0.8 to 0.8.0.9. ([\matrix-org#16035](matrix-org#16035)) * Bump types-opentracing from 2.4.10.5 to 2.4.10.6. ([\matrix-org#16078](matrix-org#16078)) * Bump types-setuptools from 68.0.0.0 to 68.0.0.3. ([\matrix-org#16079](matrix-org#16079)) # -----BEGIN PGP SIGNATURE----- # # iQIzBAABCAAdFiEE8SRSDO7gYkSP4chELS76LzL74EcFAmTbUOEACgkQLS76LzL7 # 4Efskw/+J4X30PoqSvBWbilr8kTzwNSDXrkefYXR2sLburgowCyuAtKtCdbvnZUX # 3KRwii5/GDsduXiNY836oRxO/KWE43b1ce9C9qJM7V6NmgkJBgHRvnh69wdlmBqt # 6b6TQHoEByYS7yK90+QsRm1Bqrw7eoVO9oxcZ+4lb7Mjswf491Pga8kFJqdvjtTX # UXo4vAqYyP6Yn7sUrQmXy0N8gZ5ZFHhZEvZZ8+iEsNjPO468cSVGq8/iPB1EwBm2 # nbfZWMDnD2p7plJezXOPEBxnVR3RrWbCbK08SiiNMcQynCvBgAUfkd3GnsO726jb # 19i8p6tjuj2r41UgqYCTG2i2ij6uJquA/qq3rIiVNQVKG9aPHQ8hJfu9XOdEvaJe # Je9H6QFrU/hR640tFvb5Hdc/4ThabvtC5xgl4ZGT6y6I0s5LNwk8fJiz3sDFt0i1 # XKsqGVemBGopZnwjQIPFJaHjPT7of33PXLE/hf1vX+oXU/6MNbFYkDLY9nnnQeOx # 0GEbiYaxrj8SfxNmEykMLNCfxwJ719cSR1q8vPYn6r6TOS1pJMV0SgciXoaQ/VW6 # WlRpZolvXYSye34JW8Rg4ojAz0oYfJ2IiUpwY7eSEq4DtuosTjEECKrgB8DLqKlM # +qDd4/yeqVN5/sui5oGsR71aTMy/jdnzqmdmuFvsSwz9/7PfMEU= # =FWp5 # -----END PGP SIGNATURE----- # gpg: Signature made Tue Aug 15 11:18:09 2023 BST # gpg: using RSA key F124520CEEE062448FE1C8442D2EFA2F32FBE047 # gpg: Can't check signature: No public key # Conflicts: # .github/workflows/docker.yml # CHANGES.md # Cargo.lock # debian/changelog # docs/upgrade.md # flake.lock # poetry.lock # pyproject.toml # rust/src/push/base_rules.rs # synapse/events/utils.py # synapse/handlers/pagination.py # synapse/http/site.py # synapse/rest/client/devices.py # synapse/storage/databases/main/roommember.py # synapse/storage/schema/__init__.py # tests/rest/client/test_devices.py # tests/rest/client/test_redactions.py
2 parents 42b643e + 2963822 commit abee71f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+1910
-476
lines changed

CHANGES.md

+70
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,73 @@
1+
# Synapse 1.90.0 (2023-08-15)
2+
3+
No significant changes since 1.90.0rc1.
4+
5+
6+
# Synapse 1.90.0rc1 (2023-08-08)
7+
8+
### Features
9+
10+
- Scope transaction IDs to devices (implement [MSC3970](https://github.com/matrix-org/matrix-spec-proposals/pull/3970)). ([\#15629](https://github.com/matrix-org/synapse/issues/15629))
11+
- Remove old rows from the `cache_invalidation_stream_by_instance` table automatically (this table is unused in SQLite). ([\#15868](https://github.com/matrix-org/synapse/issues/15868))
12+
13+
### Bugfixes
14+
15+
- Fix a long-standing bug where purging history and paginating simultaneously could lead to database corruption when using workers. ([\#15791](https://github.com/matrix-org/synapse/issues/15791))
16+
- Fix a long-standing bug where profile endpoint returned a 404 when the user's display name was empty. ([\#16012](https://github.com/matrix-org/synapse/issues/16012))
17+
- Fix a long-standing bug where the `synapse_port_db` failed to configure sequences for application services and partial stated rooms. ([\#16043](https://github.com/matrix-org/synapse/issues/16043))
18+
- Fix long-standing bug with deletion in dehydrated devices v2. ([\#16046](https://github.com/matrix-org/synapse/issues/16046))
19+
20+
### Updates to the Docker image
21+
22+
- Add `org.opencontainers.image.version` labels to Docker containers [published by Matrix.org](https://hub.docker.com/r/matrixdotorg/synapse). Contributed by Mo Balaa. ([\#15972](https://github.com/matrix-org/synapse/issues/15972), [\#16009](https://github.com/matrix-org/synapse/issues/16009))
23+
24+
### Improved Documentation
25+
26+
- Add a internal documentation page describing the ["streams" used within Synapse](https://matrix-org.github.io/synapse/v1.90/development/synapse_architecture/streams.html). ([\#16015](https://github.com/matrix-org/synapse/issues/16015))
27+
- Clarify comment on the keys/upload over replication enpoint. ([\#16016](https://github.com/matrix-org/synapse/issues/16016))
28+
- Do not expose Admin API in caddy reverse proxy example. Contributed by @NilsIrl. ([\#16027](https://github.com/matrix-org/synapse/issues/16027))
29+
30+
### Deprecations and Removals
31+
32+
- Remove support for legacy application service paths. ([\#15964](https://github.com/matrix-org/synapse/issues/15964))
33+
- Move support for application service query parameter authorization behind a configuration option. ([\#16017](https://github.com/matrix-org/synapse/issues/16017))
34+
35+
### Internal Changes
36+
37+
- Update SQL queries to inline boolean parameters as supported in SQLite 3.27. ([\#15525](https://github.com/matrix-org/synapse/issues/15525))
38+
- Allow for the configuration of the backoff algorithm for federation destinations. ([\#15754](https://github.com/matrix-org/synapse/issues/15754))
39+
- Allow modules to check whether the current worker is configured to run background tasks. ([\#15991](https://github.com/matrix-org/synapse/issues/15991))
40+
- Update support for [MSC3958](https://github.com/matrix-org/matrix-spec-proposals/pull/3958) to match the latest revision of the MSC. ([\#15992](https://github.com/matrix-org/synapse/issues/15992))
41+
- Allow modules to schedule delayed background calls. ([\#15993](https://github.com/matrix-org/synapse/issues/15993))
42+
- Properly overwrite the `redacts` content-property for forwards-compatibility with room versions 1 through 10. ([\#16013](https://github.com/matrix-org/synapse/issues/16013))
43+
- Fix building the nix development environment on MacOS systems. ([\#16019](https://github.com/matrix-org/synapse/issues/16019))
44+
- Remove leading and trailing spaces when setting a display name. ([\#16031](https://github.com/matrix-org/synapse/issues/16031))
45+
- Combine duplicated code. ([\#16023](https://github.com/matrix-org/synapse/issues/16023))
46+
- Collect additional metrics from `ResponseCache` for eviction. ([\#16028](https://github.com/matrix-org/synapse/issues/16028))
47+
- Fix endpoint improperly declaring support for MSC3814. ([\#16068](https://github.com/matrix-org/synapse/issues/16068))
48+
- Drop backwards compat hack for event serialization. ([\#16069](https://github.com/matrix-org/synapse/issues/16069))
49+
50+
### Updates to locked dependencies
51+
52+
* Update PyYAML to 6.0.1. ([\#16011](https://github.com/matrix-org/synapse/issues/16011))
53+
* Bump cryptography from 41.0.2 to 41.0.3. ([\#16048](https://github.com/matrix-org/synapse/issues/16048))
54+
* Bump furo from 2023.5.20 to 2023.7.26. ([\#16077](https://github.com/matrix-org/synapse/issues/16077))
55+
* Bump immutabledict from 2.2.4 to 3.0.0. ([\#16034](https://github.com/matrix-org/synapse/issues/16034))
56+
* Update certifi to 2023.7.22 and pygments to 2.15.1. ([\#16044](https://github.com/matrix-org/synapse/issues/16044))
57+
* Bump jsonschema from 4.18.3 to 4.19.0. ([\#16081](https://github.com/matrix-org/synapse/issues/16081))
58+
* Bump phonenumbers from 8.13.14 to 8.13.18. ([\#16076](https://github.com/matrix-org/synapse/issues/16076))
59+
* Bump regex from 1.9.1 to 1.9.3. ([\#16073](https://github.com/matrix-org/synapse/issues/16073))
60+
* Bump serde from 1.0.171 to 1.0.175. ([\#15982](https://github.com/matrix-org/synapse/issues/15982))
61+
* Bump serde from 1.0.175 to 1.0.179. ([\#16033](https://github.com/matrix-org/synapse/issues/16033))
62+
* Bump serde from 1.0.179 to 1.0.183. ([\#16074](https://github.com/matrix-org/synapse/issues/16074))
63+
* Bump serde_json from 1.0.103 to 1.0.104. ([\#16032](https://github.com/matrix-org/synapse/issues/16032))
64+
* Bump service-identity from 21.1.0 to 23.1.0. ([\#16038](https://github.com/matrix-org/synapse/issues/16038))
65+
* Bump types-commonmark from 0.9.2.3 to 0.9.2.4. ([\#16037](https://github.com/matrix-org/synapse/issues/16037))
66+
* Bump types-jsonschema from 4.17.0.8 to 4.17.0.10. ([\#16036](https://github.com/matrix-org/synapse/issues/16036))
67+
* Bump types-netaddr from 0.8.0.8 to 0.8.0.9. ([\#16035](https://github.com/matrix-org/synapse/issues/16035))
68+
* Bump types-opentracing from 2.4.10.5 to 2.4.10.6. ([\#16078](https://github.com/matrix-org/synapse/issues/16078))
69+
* Bump types-setuptools from 68.0.0.0 to 68.0.0.3. ([\#16079](https://github.com/matrix-org/synapse/issues/16079))
70+
171
# Synapse 1.89.0 (2023-08-01)
272

373
No significant changes since 1.89.0rc1.

Cargo.lock

+15-15
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

debian/changelog

+12
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
matrix-synapse-py3 (1.90.0) stable; urgency=medium
2+
3+
* New Synapse release 1.90.0.
4+
5+
-- Synapse Packaging team <packages@matrix.org> Tue, 15 Aug 2023 11:17:34 +0100
6+
7+
matrix-synapse-py3 (1.90.0~rc1) stable; urgency=medium
8+
9+
* New Synapse release 1.90.0rc1.
10+
11+
-- Synapse Packaging team <packages@matrix.org> Tue, 08 Aug 2023 15:29:34 +0100
12+
113
matrix-synapse-py3 (1.89.0) stable; urgency=medium
214

315
* New Synapse release 1.89.0.

docs/SUMMARY.md

+1
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
- [Cancellation](development/synapse_architecture/cancellation.md)
9898
- [Log Contexts](log_contexts.md)
9999
- [Replication](replication.md)
100+
- [Streams](development/synapse_architecture/streams.md)
100101
- [TCP Replication](tcp_replication.md)
101102
- [Faster remote joins](development/synapse_architecture/faster_joins.md)
102103
- [Internal Documentation](development/internal_documentation/README.md)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
## Streams
2+
3+
Synapse has a concept of "streams", which are roughly described in [`id_generators.py`](
4+
https://github.com/matrix-org/synapse/blob/develop/synapse/storage/util/id_generators.py
5+
).
6+
Generally speaking, streams are a series of notifications that something in Synapse's database has changed that the application might need to respond to.
7+
For example:
8+
9+
- The events stream reports new events (PDUs) that Synapse creates, or that Synapse accepts from another homeserver.
10+
- The account data stream reports changes to users' [account data](https://spec.matrix.org/v1.7/client-server-api/#client-config).
11+
- The to-device stream reports when a device has a new [to-device message](https://spec.matrix.org/v1.7/client-server-api/#send-to-device-messaging).
12+
13+
See [`synapse.replication.tcp.streams`](
14+
https://github.com/matrix-org/synapse/blob/develop/synapse/replication/tcp/streams/__init__.py
15+
) for the full list of streams.
16+
17+
It is very helpful to understand the streams mechanism when working on any part of Synapse that needs to respond to changes—especially if those changes are made by different workers.
18+
To that end, let's describe streams formally, paraphrasing from the docstring of [`AbstractStreamIdGenerator`](
19+
https://github.com/matrix-org/synapse/blob/a719b703d9bd0dade2565ddcad0e2f3a7a9d4c37/synapse/storage/util/id_generators.py#L96
20+
).
21+
22+
### Definition
23+
24+
A stream is an append-only log `T1, T2, ..., Tn, ...` of facts[^1] which grows over time.
25+
Only "writers" can add facts to a stream, and there may be multiple writers.
26+
27+
Each fact has an ID, called its "stream ID".
28+
Readers should only process facts in ascending stream ID order.
29+
30+
Roughly speaking, each stream is backed by a database table.
31+
It should have a `stream_id` (or similar) bigint column holding stream IDs, plus additional columns as necessary to describe the fact.
32+
Typically, a fact is expressed with a single row in its backing table.[^2]
33+
Within a stream, no two facts may have the same stream_id.
34+
35+
> _Aside_. Some additional notes on streams' backing tables.
36+
>
37+
> 1. Rich would like to [ditch the backing tables](https://github.com/matrix-org/synapse/issues/13456).
38+
> 2. The backing tables may have other uses.
39+
> For example, the events table serves backs the events stream, and is read when processing new events.
40+
> But old rows are read from the table all the time, whenever Synapse needs to lookup some facts about an event.
41+
> 3. Rich suspects that sometimes the stream is backed by multiple tables, so the stream proper is the union of those tables.
42+
43+
Stream writers can "reserve" a stream ID, and then later mark it as having being completed.
44+
Stream writers need to track the completion of each stream fact.
45+
In the happy case, completion means a fact has been written to the stream table.
46+
But unhappy cases (e.g. transaction rollback due to an error) also count as completion.
47+
Once completed, the rows written with that stream ID are fixed, and no new rows
48+
will be inserted with that ID.
49+
50+
### Current stream ID
51+
52+
For any given stream reader (including writers themselves), we may define a per-writer current stream ID:
53+
54+
> The current stream ID _for a writer W_ is the largest stream ID such that
55+
> all transactions added by W with equal or smaller ID have completed.
56+
57+
Similarly, there is a "linear" notion of current stream ID:
58+
59+
> The "linear" current stream ID is the largest stream ID such that
60+
> all facts (added by any writer) with equal or smaller ID have completed.
61+
62+
Because different stream readers A and B learn about new facts at different times, A and B may disagree about current stream IDs.
63+
Put differently: we should think of stream readers as being independent of each other, proceeding through a stream of facts at different rates.
64+
65+
**NB.** For both senses of "current", that if a writer opens a transaction that never completes, the current stream ID will never advance beyond that writer's last written stream ID.
66+
67+
For single-writer streams, the per-writer current ID and the linear current ID are the same.
68+
Both senses of current ID are monotonic, but they may "skip" or jump over IDs because facts complete out of order.
69+
70+
71+
_Example_.
72+
Consider a single-writer stream which is initially at ID 1.
73+
74+
| Action | Current stream ID | Notes |
75+
|------------|-------------------|-------------------------------------------------|
76+
| | 1 | |
77+
| Reserve 2 | 1 | |
78+
| Reserve 3 | 1 | |
79+
| Complete 3 | 1 | current ID unchanged, waiting for 2 to complete |
80+
| Complete 2 | 3 | current ID jumps from 1 -> 3 |
81+
| Reserve 4 | 3 | |
82+
| Reserve 5 | 3 | |
83+
| Reserve 6 | 3 | |
84+
| Complete 5 | 3 | |
85+
| Complete 4 | 5 | current ID jumps 3->5, even though 6 is pending |
86+
| Complete 6 | 6 | |
87+
88+
89+
### Multi-writer streams
90+
91+
There are two ways to view a multi-writer stream.
92+
93+
1. Treat it as a collection of distinct single-writer streams, one
94+
for each writer.
95+
2. Treat it as a single stream.
96+
97+
The single stream (option 2) is conceptually simpler, and easier to represent (a single stream id).
98+
However, it requires each reader to know about the entire set of writers, to ensures that readers don't erroneously advance their current stream position too early and miss a fact from an unknown writer.
99+
In contrast, multiple parallel streams (option 1) are more complex, requiring more state to represent (map from writer to stream id).
100+
The payoff for doing so is that readers can "peek" ahead to facts that completed on one writer no matter the state of the others, reducing latency.
101+
102+
Note that a multi-writer stream can be viewed in both ways.
103+
For example, the events stream is treated as multiple single-writer streams (option 1) by the sync handler, so that events are sent to clients as soon as possible.
104+
But the background process that works through events treats them as a single linear stream.
105+
106+
Another useful example is the cache invalidation stream.
107+
The facts this stream holds are instructions to "you should now invalidate these cache entries".
108+
We only ever treat this as a multiple single-writer streams as there is no important ordering between cache invalidations.
109+
(Invalidations are self-contained facts; and the invalidations commute/are idempotent).
110+
111+
### Writing to streams
112+
113+
Writers need to track:
114+
- track their current position (i.e. its own per-writer stream ID).
115+
- their facts currently awaiting completion.
116+
117+
At startup,
118+
- the current position of that writer can be found by querying the database (which suggests that facts need to be written to the database atomically, in a transaction); and
119+
- there are no facts awaiting completion.
120+
121+
To reserve a stream ID, call [`nextval`](https://www.postgresql.org/docs/current/functions-sequence.html) on the appropriate postgres sequence.
122+
123+
To write a fact to the stream: insert the appropriate rows to the appropriate backing table.
124+
125+
To complete a fact, first remove it from your map of facts currently awaiting completion.
126+
Then, if no earlier fact is awaiting completion, the writer can advance its current position in that stream.
127+
Upon doing so it should emit an `RDATA` message[^3], once for every fact between the old and the new stream ID.
128+
129+
### Subscribing to streams
130+
131+
Readers need to track the current position of every writer.
132+
133+
At startup, they can find this by contacting each writer with a `REPLICATE` message,
134+
requesting that all writers reply describing their current position in their streams.
135+
Writers reply with a `POSITION` message.
136+
137+
To learn about new facts, readers should listen for `RDATA` messages and process them to respond to the new fact.
138+
The `RDATA` itself is not a self-contained representation of the fact;
139+
readers will have to query the stream tables for the full details.
140+
Readers must also advance their record of the writer's current position for that stream.
141+
142+
# Summary
143+
144+
In a nutshell: we have an append-only log with a "buffer/scratchpad" at the end where we have to wait for the sequence to be linear and contiguous.
145+
146+
147+
---
148+
149+
[^1]: we use the word _fact_ here for two reasons.
150+
Firstly, the word "event" is already heavily overloaded (PDUs, EDUs, account data, ...) and we don't need to make that worse.
151+
Secondly, "fact" emphasises that the things we append to a stream cannot change after the fact.
152+
153+
[^2]: A fact might be expressed with 0 rows, e.g. if we opened a transaction to persist an event, but failed and rolled the transaction back before marking the fact as completed.
154+
In principle a fact might be expressed with 2 or more rows; if so, each of those rows should share the fact's stream ID.
155+
156+
[^3]: This communication used to happen directly with the writers [over TCP](../../tcp_replication.md);
157+
nowadays it's done via Redis's Pubsub.

docs/reverse_proxy.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ matrix.example.com {
9595
}
9696
9797
example.com:8448 {
98-
reverse_proxy localhost:8008
98+
reverse_proxy /_matrix/* localhost:8008
9999
}
100100
```
101101

0 commit comments

Comments
 (0)