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

Include bundled aggregations for the latest event in a thread #12273

Merged
merged 37 commits into from
May 4, 2022

Conversation

clokep
Copy link
Member

@clokep clokep commented Mar 23, 2022

Fixes #12270; we were previously handling edits to the latest event in a thread (see #11973), but not notifying the client that this was an edit via the bundled aggregations.

It is wanted that the bundled aggregations for the latest event in a thread include everything so it is easy to render the thread summary.

I think this is OK, but does go a little bit down a slippery slope -- I wonder if it would have been better to not include the full event (at the risk of causing many more event look-ups).

@clokep clokep marked this pull request as ready for review March 23, 2022 17:26
@clokep clokep requested a review from a team as a code owner March 23, 2022 17:26
@richvdh richvdh self-assigned this Mar 25, 2022
Copy link
Member

@richvdh richvdh left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've got to say I'm struggling to follow all this, though it seems plausible enough. I have a few questions and a few requests for changes.

It seems like other HS implementations could easily make the same mistake, and that we should make the behaviour explicit in the spec and/or add a complement test to enforce it.

changelog.d/12273.bugfix Outdated Show resolved Hide resolved
synapse/events/utils.py Outdated Show resolved Hide resolved
synapse/events/utils.py Show resolved Hide resolved
synapse/events/utils.py Outdated Show resolved Hide resolved
synapse/events/utils.py Outdated Show resolved Hide resolved
synapse/events/utils.py Outdated Show resolved Hide resolved
synapse/handlers/relations.py Outdated Show resolved Hide resolved
synapse/handlers/relations.py Outdated Show resolved Hide resolved
synapse/storage/databases/main/relations.py Outdated Show resolved Hide resolved
synapse/handlers/relations.py Outdated Show resolved Hide resolved
@richvdh richvdh removed their assignment Mar 25, 2022
@clokep clokep requested a review from richvdh April 19, 2022 16:07
synapse/events/utils.py Outdated Show resolved Hide resolved
@clokep
Copy link
Member Author

clokep commented Apr 19, 2022

@richvdh Sorry for the extreme delaying in getting back to this. I've made some updates, resolved some conflicts. If you've lost all context and want to throw this back on the team pile that's quite fine too!

@clokep clokep removed the request for review from richvdh April 19, 2022 16:44
@clokep
Copy link
Member Author

clokep commented Apr 19, 2022

It seems I have a failing test, sorry about that.

@clokep clokep requested a review from richvdh April 19, 2022 17:23
@clokep clokep mentioned this pull request Apr 21, 2022
@clokep
Copy link
Member Author

clokep commented Apr 21, 2022

This somehow grew to a point where there's quite a bit of refactoring in it, I've split that out to #12519 to focus this PR more on behavior changes.

Comment on lines 394 to 395
# It is not valid to start a thread on an event which already has a relation.
[eid for eid in events_by_id.keys() if eid not in relations_by_id],
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I moved the filtering to here (instead of _inject_bundled_aggregations) as this better matches what we already did for annotations and edits. (See below, near line 411.)

This should avoid requesting data from the database which we will just throw away later on.

@clokep clokep requested a review from richvdh April 26, 2022 18:52
@clokep
Copy link
Member Author

clokep commented Apr 26, 2022

@richvdh I think this is ready for another look, I answered the questions from your last review above: #12273 (comment)

I've resolved all threads which I think are closed.

synapse/handlers/relations.py Outdated Show resolved Hide resolved
synapse/handlers/relations.py Outdated Show resolved Hide resolved
synapse/handlers/relations.py Show resolved Hide resolved
synapse/handlers/relations.py Show resolved Hide resolved
@@ -453,19 +405,43 @@ async def get_bundled_aggregations(
latest_thread_event = thread.latest_event
if latest_thread_event and latest_thread_event.event_id not in events_by_id:
events_by_id[latest_thread_event.event_id] = latest_thread_event
# The latest event in the thread must have a thread relation.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not following this. "must have" according to whom? Evidently it doesn't have a thread relation, otherwise we wouldn't have to do this?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The latest event is an event which has a rel_type = m.thread to an event. (That's what we just searched for above.) The latest events are new events found, not part of the original input set, so we're expanding the information we calculated above.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hopefully 4f7132c clarifies this.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yup, much clearer, thanks.

synapse/handlers/relations.py Outdated Show resolved Hide resolved
@clokep
Copy link
Member Author

clokep commented Apr 27, 2022

Main question though: is this behaviour defined in an MSC somewhere, or at least mentioned as a comment on one? It feels quite subtle and should definitely make it into the spec.

No, not really. The only description of this field is a single line in the MSC:

matrix-org/matrix-spec-proposals#3785 was made to clarify this.

clokep and others added 4 commits April 27, 2022 09:00
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
@clokep clokep requested a review from richvdh April 27, 2022 14:54
Copy link
Member

@richvdh richvdh left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm. Sorry this one has taken so long!

@clokep
Copy link
Member Author

clokep commented May 4, 2022

lgtm. Sorry this one has taken so long!

No problem! Thank you for the thorough review!

@clokep clokep merged commit 75dff3d into develop May 4, 2022
@clokep clokep deleted the clokep/bundled-aggs-edits branch May 4, 2022 12:38
DMRobertson pushed a commit that referenced this pull request May 10, 2022
Synapse 1.59.0rc1 (2022-05-10)
==============================

This release makes several changes that server administrators should be aware of:

- Device name lookup over federation is now disabled by default. ([\#12616](#12616))
- The `synapse.app.appservice` and `synapse.app.user_dir` worker application types are now deprecated. ([\#12452](#12452), [\#12654](#12654))

See [the upgrade notes](https://github.com/matrix-org/synapse/blob/develop/docs/upgrade.md#upgrading-to-v1590) for more details.

Additionally, this release removes the non-standard `m.login.jwt` login type from Synapse. It can be replaced with `org.matrix.login.jwt` for identical behaviour. This is only used if `jwt_config.enabled` is set to `true` in the configuration. ([\#12597](#12597))

Features
--------

- Support [MSC3266](matrix-org/matrix-spec-proposals#3266) room summaries over federation. ([\#11507](#11507))
- Implement [changes](matrix-org/matrix-spec-proposals@4a77139) to [MSC2285 (hidden read receipts)](matrix-org/matrix-spec-proposals#2285). Contributed by @SimonBrandner. ([\#12168](#12168), [\#12635](#12635), [\#12636](#12636), [\#12670](#12670))
- Extend the [module API](https://github.com/matrix-org/synapse/blob/release-v1.59/synapse/module_api/__init__.py) to allow modules to change actions for existing push rules of local users. ([\#12406](#12406))
- Add the `notify_appservices_from_worker` configuration option (superseding `notify_appservices`) to allow a generic worker to be designated as the worker to send traffic to Application Services. ([\#12452](#12452))
- Add the `update_user_directory_from_worker` configuration option (superseding `update_user_directory`) to allow a generic worker to be designated as the worker to update the user directory. ([\#12654](#12654))
- Add new `enable_registration_token_3pid_bypass` configuration option to allow registrations via token as an alternative to verifying a 3pid. ([\#12526](#12526))
- Implement [MSC3786](matrix-org/matrix-spec-proposals#3786): Add a default push rule to ignore `m.room.server_acl` events. ([\#12601](#12601))
- Add new `mau_appservice_trial_days` configuration option to specify a different trial period for users registered via an appservice. ([\#12619](#12619))

Bugfixes
--------

- Fix a bug introduced in Synapse 1.48.0 where the latest thread reply provided failed to include the proper bundled aggregations. ([\#12273](#12273))
- Fix a bug introduced in Synapse 1.22.0 where attempting to send a large amount of read receipts to an application service all at once would result in duplicate content and abnormally high memory usage. Contributed by Brad & Nick @ Beeper. ([\#12544](#12544))
- Fix a bug introduced in Synapse 1.57.0 which could cause `Failed to calculate hosts in room` errors to be logged for outbound federation. ([\#12570](#12570))
- Fix a long-standing bug where status codes would almost always get logged as `200!`, irrespective of the actual status code, when clients disconnect before a request has finished processing. ([\#12580](#12580))
- Fix race when persisting an event and deleting a room that could lead to outbound federation breaking. ([\#12594](#12594))
- Fix a bug introduced in Synapse 1.53.0 where bundled aggregations for annotations/edits were incorrectly calculated. ([\#12633](#12633))
- Fix a long-standing bug where rooms containing power levels with string values could not be upgraded. ([\#12657](#12657))
- Prevent memory leak from reoccurring when presence is disabled. ([\#12656](#12656))

Updates to the Docker image
---------------------------

- Explicitly opt-in to using [BuildKit-specific features](https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/syntax.md) in the Dockerfile. This fixes issues with building images in some GitLab CI environments. ([\#12541](#12541))
- Update the "Build docker images" GitHub Actions workflow to use `docker/metadata-action` to generate docker image tags, instead of a custom shell script. Contributed by @henryclw. ([\#12573](#12573))

Improved Documentation
----------------------

- Update SQL statements and replace use of old table `user_stats_historical` in docs for Synapse Admins. ([\#12536](#12536))
- Add missing linebreak to `pipx` install instructions. ([\#12579](#12579))
- Add information about the TCP replication module to docs. ([\#12621](#12621))
- Fixes to the formatting of `README.rst`. ([\#12627](#12627))
- Fix docs on how to run specific Complement tests using the `complement.sh` test runner. ([\#12664](#12664))

Deprecations and Removals
-------------------------

- Remove unstable identifiers from [MSC3069](matrix-org/matrix-spec-proposals#3069). ([\#12596](#12596))
- Remove the unspecified `m.login.jwt` login type and the unstable `uk.half-shot.msc2778.login.application_service` from
  [MSC2778](matrix-org/matrix-spec-proposals#2778). ([\#12597](#12597))
- Synapse now requires at least Python 3.7.1 (up from 3.7.0), for compatibility with the latest Twisted trunk. ([\#12613](#12613))

Internal Changes
----------------

- Use supervisord to supervise Postgres and Caddy in the Complement image to reduce restart time. ([\#12480](#12480))
- Immediately retry any requests that have backed off when a server comes back online. ([\#12500](#12500))
- Use `make_awaitable` instead of `defer.succeed` for return values of mocks in tests. ([\#12505](#12505))
- Consistently check if an object is a `frozendict`. ([\#12564](#12564))
- Protect module callbacks with read semantics against cancellation. ([\#12568](#12568))
- Improve comments and error messages around access tokens. ([\#12577](#12577))
- Improve docstrings for the receipts store. ([\#12581](#12581))
- Use constants for read-receipts in tests. ([\#12582](#12582))
- Log status code of cancelled requests as 499 and avoid logging stack traces for them. ([\#12587](#12587), [\#12663](#12663))
- Remove special-case for `twisted` logger from default log config. ([\#12589](#12589))
- Use `getClientAddress` instead of the deprecated `getClientIP`. ([\#12599](#12599))
- Add link to documentation in Grafana Dashboard. ([\#12602](#12602))
- Reduce log spam when running multiple event persisters. ([\#12610](#12610))
- Add extra debug logging to federation sender. ([\#12614](#12614))
- Prevent remote homeservers from requesting local user device names by default. ([\#12616](#12616))
- Add a consistency check on events which we read from the database. ([\#12620](#12620))
- Remove use of the `constantly` library and switch to enums for `EventRedactBehaviour`. Contributed by @andrewdoh. ([\#12624](#12624))
- Remove unused code related to receipts. ([\#12632](#12632))
- Minor improvements to the scripts for running Synapse in worker mode under Complement. ([\#12637](#12637))
- Move `pympler` back in to the `all` extras. ([\#12652](#12652))
- Fix spelling of `M_UNRECOGNIZED` in comments. ([\#12665](#12665))
- Release script: confirm the commit to be tagged before tagging. ([\#12556](#12556))
- Fix a typo in the announcement text generated by the Synapse release development script. ([\#12612](#12612))

- Fix scripts-dev to pass typechecking. ([\#12356](#12356))
- Add some type hints to datastore. ([\#12485](#12485))
- Remove unused `# type: ignore`s. ([\#12531](#12531))
- Allow unused `# type: ignore` comments in bleeding edge CI jobs. ([\#12576](#12576))
- Remove redundant lines of config from `mypy.ini`. ([\#12608](#12608))
- Update to mypy 0.950. ([\#12650](#12650))
- Use `Concatenate` to better annotate `_do_execute`. ([\#12666](#12666))
- Use `ParamSpec` to refine type hints. ([\#12667](#12667))
- Fix mypy against latest pillow stubs. ([\#12671](#12671))
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Thread bundled relationships can return a split-brained latest_event
2 participants