diff options
author | Erik Johnston <erik@matrix.org> | 2020-09-24 16:53:51 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-24 16:53:51 +0100 |
commit | f112cfe5bb2c918c9e942941686a05664d8bd7da (patch) | |
tree | 7e58da475bcfe5ddb8c1191d1ef20c32069f5f5f /changelog.d | |
parent | Add type annotations to SimpleHttpClient (#8372) (diff) | |
download | synapse-f112cfe5bb2c918c9e942941686a05664d8bd7da.tar.xz |
Fix MultiWriteIdGenerator's handling of restarts. (#8374)
On startup `MultiWriteIdGenerator` fetches the maximum stream ID for each instance from the table and uses that as its initial "current position" for each writer. This is problematic as a) it involves either a scan of events table or an index (neither of which is ideal), and b) if rows are being persisted out of order elsewhere while the process restarts then using the maximum stream ID is not correct. This could theoretically lead to race conditions where e.g. events that are persisted out of order are not sent down sync streams. We fix this by creating a new table that tracks the current positions of each writer to the stream, and update it each time we finish persisting a new entry. This is a relatively small overhead when persisting events. However for the cache invalidation stream this is a much bigger relative overhead, so instead we note that for invalidation we don't actually care about reliability over restarts (as there's no caches to invalidate) and simply don't bother reading and writing to the new table in that particular case.
Diffstat (limited to 'changelog.d')
-rw-r--r-- | changelog.d/8374.bugfix | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/changelog.d/8374.bugfix b/changelog.d/8374.bugfix new file mode 100644 index 0000000000..155bc3404f --- /dev/null +++ b/changelog.d/8374.bugfix @@ -0,0 +1 @@ +Fix theoretical race condition where events are not sent down `/sync` if the synchrotron worker is restarted without restarting other workers. |