summary refs log tree commit diff
path: root/synapse/app/synctl.py (unfollow)
Commit message (Collapse)AuthorFilesLines
2022-03-07Fix a bug in background updates wherein background updates are never run ↵Shay4-15/+16
using the default batch size (#12157)
2022-03-07Invalidate caches when an event with a relation is redacted. (#12121)Patrick Cloke6-48/+202
The caches for the target of the relation must be cleared so that the bundled aggregations are re-calculated after the redaction is processed.
2022-03-07Switch the `tests-done` job to an Action (#12161)Richard van der Hoff2-21/+10
I've factored it out for easier use in other workflows.
2022-03-04Relax version guard for packaging (#12166)David Robertson2-2/+3
It’s just occurred to me that #12088 pulled in the “packaging” package (~=21.3). I pulled in the newest version I had at the time. I only use it for packaging.requirements.Requirements. Which was added in packaging 16.1: https://github.com/pypa/packaging/releases/tag/16.1 https://pkgs.org/download/python3-packaging suggests that the oldest version we care about is 17.1 in Ubuntu Bionic. So I think with this bound we're hunky dory.
2022-03-04Reduce to-device queries for /sync. (#12163)Erik Johnston2-0/+4
2022-03-04Add type hints for `ObservableDeferred` attributes (#12159)Sean Quah2-3/+12
Signed-off-by: Sean Quah <seanq@element.io>
2022-03-04Add test for `ObservableDeferred`'s cancellation behaviour (#12149)Sean Quah2-0/+29
Signed-off-by: Sean Quah <seanq@element.io>
2022-03-04Remove backwards compatibility with RelationPaginationToken. (#12138)Patrick Cloke4-144/+16
2022-03-04Changelog (#12153)David Robertson3-1/+2
2022-03-04Move synctl into `synapse._scripts` and expose as an entrypoint (#12140)David Robertson11-13/+33
2022-03-04Spread out sending device lists to remote hosts (#12132)Erik Johnston7-16/+79
2022-03-04Update client-visibility filtering for outlier events (#12155)Richard van der Hoff3-4/+90
Avoid trying to get the state for outliers, which isn't a sensible thing to do.
2022-03-04Fix type of `events` in `StateGroupStorage` and `StateHandler` (#12156)Richard van der Hoff3-7/+8
We make multiple passes over this, so a regular iterable won't do.
2022-03-03Avoid generating state groups for local out-of-band leaves (#12154)Richard van der Hoff2-1/+2
If we locally generate a rejection for an invite received over federation, it is stored as an outlier (because we probably don't have the state for the room). However, currently we still generate a state group for it (even though the state in that state group will be nonsense). By setting the `outlier` param on `create_event`, we avoid the nonsensical state.
2022-03-03Rename various ApplicationServices interested methods (#11915)Andrew Morgan8-76/+175
2022-03-03Detox, part 2 of N (#12152)David Robertson2-26/+1
I've argued in #11537 that poetry and tox don't cooperate well at the moment. (See also #12119.) Therefore I'm pruning away bits of tox to make the transition to poetry easier. This change removes the commands for coverage. We don't use coverage in anger at the moment. It shouldn't be too hard to add coverage as a dev-dependency and reintroduce this if we really want it.
2022-03-03Add type hints to `tests/rest` (#12146)Dirk Klimpel9-92/+104
* Add type hints to `tests/rest` * newsfile * change import from `SigningKey`
2022-03-03Use the proper serialization format when bundling aggregations. (#12090)Patrick Cloke10-143/+130
This ensures that the `latest_event` field of the bundled aggregation for threads uses the same format as the other events in the response.
2022-03-03Don't impose version checks on dev extras at runtime (#12129)David Robertson3-9/+74
* Fix incorrect argument in test case * Add copyright header * Docstring and __all__ * Exclude dev depenencies * Use changelog from #12088 * Include version in error messages This will hopefully distinguish between the version of the source code and the version of the distribution package that is installed. * Linter script is your friend
2022-03-03Enable MSC2716 Complement tests in Synapse (#12145)Eric Eastwood3-2/+3
Co-authored-by: Brendan Abolivier <babolivier@matrix.org>
2022-03-03Limit the size of the aggregation_key (#12101)Erik Johnston2-0/+4
There's no reason to let people use long keys.
2022-03-03Enable MSC3030 Complement tests in Synapse (#12144)Eric Eastwood3-2/+3
The Complement tests for MSC3030 are now merged, https://github.com/matrix-org/complement/pull/178 Synapse implmentation: https://github.com/matrix-org/synapse/pull/9445
2022-03-03Correctly register deactivation and profile update module callbacks (#12141)Brendan Abolivier3-3/+16
2022-03-02Move the `snapcraft` configuration to `contrib`. (#12142)David Robertson3-1/+1
* Move the `snapcraft` configuration to `contrib`. We're happy for people to package this as a snap image if it's useful, but we don't support or maintain it. I'd like to move the config to `contrib` to reflect this state of affairs. * Changelog
2022-03-02Add suffices to scripts in scripts-dev (#12137)David Robertson11-12/+19
* Rename scripts-dev to have suffices * Update references to `scripts-dev` * Changelog * These scripts don't pass mypy
2022-03-02Remove unused mocks from `test_typing` (#12136)David Robertson2-31/+2
* Remove unused mocks from `test_typing` It's not clear what these do. `get_user_by_access_token` has the wrong signature, including the return type. Tests all pass without these. I think we should nuke them. * Changelog * Fixup imports
2022-03-02Add type hints to `tests/rest/client` (#12108)Dirk Klimpel9-352/+423
* Add type hints to `tests/rest/client` * newsfile * fix imports * add `test_account.py` * Remove one type hint in `test_report_event.py` * change `on_create_room` to `async` * update new functions in `test_third_party_rules.py` * Add `test_filter.py` * add `test_rooms.py` * change to `assertEquals` to `assertEqual` * lint
2022-03-02Enable complexity checking in complexity checking docs example (#11998)Andrew Morgan2-9/+11
2022-03-02Make release script write correct no-op changelog (#12127)Erik Johnston2-2/+29
As we want to include the previous version in the "No new changes..." string.
2022-03-02Check if instances are lists, not sequences. (#12128)Patrick Cloke3-5/+6
As a str is a sequence, the checks were not granular enough and would allow lists or strings, when only lists were valid.
2022-03-02Move scripts directory inside synapse, exposing as setuptools entry_points ↵David Robertson27-135/+77
(#12118) * Two scripts are basically entry_points already * Move and rename scripts/* to synapse/_scripts/*.py * Delete sync_room_to_group.pl * Expose entry points in setup.py * Update linter script and config * Fixup scripts & docs mentioning scripts that moved Co-authored-by: Andrew Morgan <1342360+anoadragon453@users.noreply.github.com>
2022-03-02Reword changelog line about URL previews v1.54.0rc1Olivier Wilkinson (reivilibre)1-1/+1
2022-03-02Tweak changelogOlivier Wilkinson (reivilibre)1-1/+1
2022-03-02Improve and refactor the tests for relations. (#12113)Patrick Cloke2-208/+179
* Modernizes code (f-strings, etc.) * Fixes incorrect comments. * Splits the test case into two. * Factors out some duplicated code.
2022-03-02Apply suggestions to changelogOlivier Wilkinson (reivilibre)1-10/+9
2022-03-02Reword changelogOlivier Wilkinson (reivilibre)1-12/+16
2022-03-021.54.0rc1Olivier Wilkinson (reivilibre)74-72/+103
2022-03-02Remove misleading newsfile from #12126 which backs out an unreleased change.Olivier Wilkinson (reivilibre)1-1/+0
2022-03-02Back out in-flight state caching changes. (#12126)reivilibre7-676/+26
2022-03-02Make get_room_version use cached get_room_version_id. (#11808)lukasdenk3-15/+18
2022-03-01Detox, part 1 of N (#12119)David Robertson4-14/+12
* Don't use `tox` for `check-sampleconfig` * Don't use `tox` for check-newsfragment
2022-03-01Use importlib.metadata to read requirements (#12088)David Robertson13-115/+237
* Pull runtime dep checks into their own module * Reimplement `check_requirements` using `importlib` I've tried to make this clearer. We start by working out which of Synapse's requirements we need to be installed here and now. I was surprised that there wasn't an easier way to see which packages were installed by a given extra. I've pulled out the error messages into functions that deal with "is this for an extra or not". And I've rearranged the loop over two different sets of requirements into one loop with a "must be instaled" flag. I hope you agree that this is clearer. * Test cases
2022-03-01Fix rare error in `ReadWriteLock` when writers complete immediately (#12105)Sean Quah3-1/+35
Signed-off-by: Sean Quah <seanq@element.io>
2022-03-01Add module callbacks called for reacting to deactivation status change and ↵Brendan Abolivier7-7/+360
profile update (#12062)
2022-03-01Use Python 3.9 in Synapse dockerfiles by default (#12112)Andrew Morgan2-2/+3
2022-03-01Add `stop_cancellation` utility function (#12106)Sean Quah3-0/+65
2022-03-01Order in-flight state group queries in biggest-first order (#11610)reivilibre3-4/+131
Co-authored-by: Patrick Cloke <clokep@users.noreply.github.com>
2022-03-01Faster joins: persist to database (#12012)Richard van der Hoff12-32/+297
When we get a partial_state response from send_join, store information in the database about it: * store a record about the room as a whole having partial state, and stash the list of member servers too. * flag the join event itself as having partial state * also, for any new events whose prev-events are partial-stated, note that they will *also* be partial-stated. We don't yet make any attempt to interpret this data, so API calls (and a bunch of other things) are just going to get incorrect data.
2022-03-01Advertise Python 3.10 support in setup.py (#12111)Andrew Morgan2-0/+2
2022-03-01Fix 'Unhandled error in Deferred' (#12089)Richard van der Hoff3-37/+38
* Fix 'Unhandled error in Deferred' Fixes a CRITICAL "Unhandled error in Deferred" log message which happened when a function wrapped with `@cachedList` failed * Minor optimisation to cachedListDescriptor we can avoid re-using `missing`, which saves looking up entries in `deferreds_map`, and means we don't need to copy it. * Improve type annotation on CachedListDescriptor
2022-03-01Improve exception handling for concurrent execution (#12109)Richard van der Hoff5-27/+151
* fix incorrect unwrapFirstError import this was being imported from the wrong place * Refactor `concurrently_execute` to use `yieldable_gather_results` * Improve exception handling in `yieldable_gather_results` Try to avoid swallowing so many stack traces. * mark unwrapFirstError deprecated * changelog
2022-02-28Add type hints to `tests/rest/client` (#12094)Dirk Klimpel5-64/+72
* Add type hints to `tests/rest/client` * update `mypy.ini` * newsfile * add `test_register.py`
2022-02-28Remove the unstable `/spaces` endpoint. (#12073)Patrick Cloke8-802/+46
...and various code supporting it. The /spaces endpoint was from an old version of MSC2946 and included both a Client-Server and Server-Server API. Note that the unstable /hierarchy endpoint (from the final version of MSC2946) is not yet removed.
2022-02-28Move experimental support for MSC3440 to /versions. (#12099)Patrick Cloke3-3/+3
Instead of being part of /capabilities, this matches a change to MSC3440 to properly use these endpoints.
2022-02-28Add type hints to `tests/rest/client` (#12084)Dirk Klimpel12-138/+198
2022-02-28Fix `PushRuleEvaluator` and `Filter` to work on frozendicts (#12100)Richard van der Hoff5-6/+27
* Fix `PushRuleEvaluator` to work on frozendicts frozendicts do not (necessarily) inherit from dict, so this needs to handle them correctly. * Fix event filtering for frozen events Looks like this one was introduced by #11194.
2022-02-28Actually fix bad debug logging rejecting device list & signing key ↵David Robertson3-2/+21
transactions (#12098)
2022-02-28Properly failover for unknown endpoints from Conduit/Dendrite. (#12077)Patrick Cloke2-9/+14
Before this fix, a legitimate 404 from a federation endpoint (e.g. due to an unknown room) would be treated as an unknown endpoint. This could cause unnecessary federation traffic.
2022-02-28Replace assertEquals and friends with non-deprecated versions. (#12092)Patrick Cloke62-889/+888
2022-02-28synctl: print warning if synctl_cache_factor is set in config (#11865)lukasdenk2-0/+9
Co-authored-by: Andrew Morgan <1342360+anoadragon453@users.noreply.github.com>
2022-02-25Ensure that `get_datastores().main` is typed (#12070)Sean Quah2-1/+3
Signed-off-by: Sean Quah <seanq@element.io>
2022-02-25Minor typing fixes for `synapse/storage/persist_events.py` (#12069)Sean Quah3-23/+26
Signed-off-by: Sean Quah <seanq@element.io>
2022-02-24Add type hints to `tests/rest/client` (#12072)Dirk Klimpel11-102/+160
2022-02-24Add support for MSC3202: sending one-time key counts and fallback key usage ↵reivilibre11-38/+528
states to Application Services. (#11617) Co-authored-by: Erik Johnston <erik@matrix.org>
2022-02-24Fix non-strings in the `event_search` table (#12037)Sean Quah5-11/+173
Don't attempt to add non-string `value`s to `event_search` and add a background update to clear out bad rows from `event_search` when using sqlite. Signed-off-by: Sean Quah <seanq@element.io>
2022-02-23Add documentation for missing worker types. (#11599)Patrick Cloke2-14/+77
And clean-up the endpoints which should be routed to workers.
2022-02-23Add logging to `/sync` for debugging #11916 (#12068)Erik Johnston2-0/+10
2022-02-23Add type hints to `tests/rest/client` (#12066)Dirk Klimpel5-119/+149
2022-02-23Remove more references to `get_datastore` (#12067)Richard van der Hoff4-6/+6
These have snuck in since #12031 was started. Also a couple of other cleanups while we're in the area.
2022-02-23Remove `HomeServer.get_datastore()` (#12031)Richard van der Hoff230-500/+526
The presence of this method was confusing, and mostly present for backwards compatibility. Let's get rid of it. Part of #11733
2022-02-23Rename default branch of complement.sh to main (#12063)Nicolas Werner2-2/+3
The complement.sh script relies on the name of the ref matching the name of the unpacked folder. The branch redirect from renaming the default branch breaks that assumption. Signed-off-by: Nicolas Werner <n.werner@famedly.com>
2022-02-22Remove excess condition on `knock->leave` check (#11900)Travis Ralston2-3/+4
2022-02-22Better error message when failing to request from another process (#12060)Erik Johnston2-1/+4
2022-02-22Implement account status endpoints (MSC3720) (#12001)Brendan Abolivier11-6/+511
See matrix-org/matrix-doc#3720 Co-authored-by: Sean Quah <8349537+squahtx@users.noreply.github.com>
2022-02-22Prune setup.cfg some more (#12059)David Robertson5-13/+14
* Remove `trial` section from setup.cfg This was added in the initial commit from 2014. I can't see that it does anything. Maybe it's there so that you can run `trial` without any extra args, but if I do that then I just get the `--help` message. * Move flake8's config to its own file
2022-02-22Cap the number of in-flight requests for state from a single group (#11608)reivilibre3-0/+86
2022-02-22Use room version 9 as the default room version (per MSC3589). (#12058)Patrick Cloke3-2/+3
2022-02-22Run `_handle_queued_pdus` as a background process (#12041)Richard van der Hoff2-2/+5
... to ensure it gets a proper log context, mostly.
2022-02-22Fix slow performance of `/logout` in some cases where refresh tokens are in ↵reivilibre4-4/+136
use. The slowness existed since the initial implementation of refresh tokens. (#12056)
2022-02-22Faster joins: Support for calling `/federation/v1/state` (#12013)Richard van der Hoff7-17/+377
This is an endpoint that we have server-side support for, but no client-side support. It's going to be useful for resyncing partial-stated rooms, so let's introduce it.
2022-02-22Fetch images when previewing Twitter URLs. (#11985)AndrewRyanChama3-4/+11
By including "bot" in the User-Agent, which some sites use to decide whether to include additional Open Graph information.
2022-02-22Update changelogErik Johnston1-1/+1
2022-02-22Update changelogErik Johnston1-2/+2
2022-02-22Add more tests for in-flight state query duplication. (#12033)reivilibre2-21/+172
2022-02-22Tidy the building of sdists and wheels (#12051)David Robertson3-28/+4
* Don't build distribution pkgs in tests.yml * Run `release-artifacts` on release branches * Use backend-meta workflow for packaging
2022-02-221.53.0 v1.53.0Erik Johnston3-1/+13
2022-02-22Move isort config to `pyproject.toml` (#12052)David Robertson4-12/+14
2022-02-22Use v3 endpoints for fallback auth (Matrix 1.1) (#12019)Travis Ralston2-4/+5
2022-02-21remote join processing: get create event from state, not auth_chain (#12039)Richard van der Hoff4-5/+8
A follow-up to #12005, in which I apparently missed that there are a bunch of other places that assume the create event is in the auth chain.
2022-02-21Minor typing fixes (#12034)Richard van der Hoff4-16/+19
These started failing in https://github.com/matrix-org/synapse/pull/12031... I'm a bit mystified by how they ever worked.
2022-02-21Add type hints to `synapse/storage/databases/main` (#11984)Dirk Klimpel7-53/+79
2022-02-21Advertise Matrix 1.2 in `/_matrix/client/versions` (#12022)Travis Ralston2-0/+2
Co-authored-by: Patrick Cloke <patrickc@matrix.org>
2022-02-18Document why auth providers aren't validated in the admin API. (#12004)Patrick Cloke4-2/+29
Since it is reasonable to give a future or past auth provider, which might not be in the current configuration.
2022-02-18Track and deduplicate in-flight requests to `_get_state_for_groups`. (#10870)reivilibre3-25/+312
Co-authored-by: Patrick Cloke <clokep@users.noreply.github.com>
2022-02-18Upgrade mypy to version 0.931 (#12030)Sean Quah9-19/+33
Upgrade mypy to 0.931, mypy-zope to 0.3.5 and fix new complaints.
2022-02-18Fix bug in `StateFilter.return_expanded()` and add some tests. (#12016)reivilibre3-1/+117
2022-02-18Advertise Matrix 1.1 in `/_matrix/client/versions` (#12020)Travis Ralston2-0/+2
2022-02-18Use stable MSC3069 `is_guest` flag on `/whoami`. (#12021)Travis Ralston3-3/+9
Keeping backwards compatibility with the unstable flag for now.
2022-02-18Fix 500 error with Postgres when looking backwards with the MSC3030 ↵Eric Eastwood2-1/+2
`/timestamp_to_event` endpoint (#12024)
2022-02-18Update the olddeps CI check to use an old version of markupsafe (#12025)Brendan Abolivier2-0/+4
2022-02-17Remove unstable MSC3283 flags (#12018)Erik Johnston3-17/+1
Fixes #11962
2022-02-17Allow modules to set a display name on registration (#12009)Brendan Abolivier6-34/+195
Co-authored-by: Patrick Cloke <clokep@users.noreply.github.com>
2022-02-17Faster joins: parse msc3706 fields in send_join response (#12011)Richard van der Hoff6-33/+140
Part of my work on #11249: add code to handle the new fields added in MSC3706.
2022-02-17Configure `tox` to use `venv` (#12015)Richard van der Hoff3-1/+9
As the comment says, virtualenv is a pile of fail.
2022-02-17Remove support for the legacy structured logging configuration. (#12008)Patrick Cloke5-175/+24
2022-02-17`send_join` response: get create event from `state`, not `auth_chain` (#12005)Richard van der Hoff2-1/+2
msc3706 proposes changing the `/send_join` response: > Any events returned within `state` can be omitted from `auth_chain`. Currently, we rely on `m.room.create` being returned in `auth_chain`, but since the `m.room.create` event must necessarily be part of the state, the above change will break this. In short, let's look for `m.room.create` in `state` rather than `auth_chain`.
2022-02-17Prevent duplicate push notifications for room reads (#11835)lukasdenk3-66/+71
2022-02-16Explain the meaning of spam checker callbacks' return values (#12003)David Robertson2-13/+28
Co-authored-by: Patrick Cloke <clokep@users.noreply.github.com>
2022-02-16Fix a typo in a comment.Patrick Cloke1-1/+1
2022-02-16Limit concurrent AS joins (#11996)Brendan Abolivier2-19/+28
Initially introduced in matrix-org-hotfixes by e5537cf (and tweaked by later commits). Fixes #11995 See also #4826
2022-02-15Optimise calculating device_list changes in `/sync`. (#11974)Erik Johnston4-15/+126
For users with large accounts it is inefficient to calculate the set of users they share a room with (and takes a lot of space in the cache). Instead we can look at users whose devices have changed since the last sync and check if they share a room with the syncing user.
2022-02-15`_auth_and_persist_outliers`: drop events we have already seen (#11994)Richard van der Hoff2-24/+21
We already have two copies of this code, in 2/3 of the callers of `_auth_and_persist_outliers`. Before I add a third, let's push it down.
2022-02-15Track cache invalidations (#12000)Erik Johnston4-1/+10
Currently we only track evictions due to size or time constraints.
2022-02-15Fix incorrect `get_rooms_for_user` for remote user (#11999)Erik Johnston3-11/+124
When the server leaves a room the `get_rooms_for_user` cache is not correctly invalidated for the remote users in the room. This means that subsequent calls to `get_rooms_for_user` for the remote users would incorrectly include the room (it shouldn't be included because the server no longer knows anything about the room).
2022-02-15Docker: remove `VOLUME` directive (#11997)Richard van der Hoff2-2/+1
The driver for this is to stop Complement complaining about it, but as far as I can tell it was pointless and needed to go away anyway. I'm a bit unclear about what exactly VOLUME does, but I think what it means is that, if you don't override it with an explicit -v argument, then docker run will create a temporary volume, and copy things into it. The temporary volume is then deleted when the container finishes. That only sounds useful if your image has something to copy into it (otherwise you may as well just use the default root filesystem), and our image notably doesn't copy anything into /data. So... this wasn't doing anything, except annoying Complement?
2022-02-15Refactor search code to reduce function size. (#11991)Patrick Cloke3-226/+435
Splits the search code into a few logical functions instead of a single unreadable function. There are also a few additional changes for readability. After refactoring it was clear to see there were some unused and unnecessary variables, which were simplified.
2022-02-15Fix incorrect thread summaries when the latest event is edited. (#11992)Patrick Cloke5-31/+107
If the latest event in a thread was edited than the original event content was included in bundled aggregation for threads instead of the edited event content.
2022-02-15Add some tests for propagation of device list changes between local users ↵Andrew Morgan4-3/+163
(#11972)
2022-02-15Update CHANGES.md v1.53.0rc1Sean Quah1-7/+7
2022-02-151.53.0rc1Sean Quah60-58/+86
2022-02-14Revert "Pin to frozendict<2.1.2 (#11625)" and allow frozendict>2.1.2 (#11969)Pascal Bach2-1/+2
This reverts commit 2bf31f7807c7a0c229170803c97090d612dc16f9. Signed-off-by: Pascal Bach <pascal.bach@nextrem.ch>
2022-02-14Fix M_WRONG_ROOM_KEYS_VERSION error not including `current_version` field ↵Michael Telatynski2-0/+4
(#11988) Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2022-02-14Note when unstable MSC3283 prefixes will be removed (#11989)Andrew Morgan2-1/+2
2022-02-14remove empty file, reword/rename newsfragment, and add line to upgrade docH. Shay4-1/+2
2022-02-14 Require that modules register their callbacks using keyword arguments. (#11975)Patrick Cloke2-0/+7
To allow for easier backwards/forwards compatibility by making it easier to add/remove callbacks.
2022-02-14Use version string helper from matrix-common (#11979)David Robertson13-112/+42
* Require latest matrix-common * Use the common function
2022-02-12Notify users, rather than rooms, of device list updates (#11905)Andrew Morgan2-5/+4
Co-authored-by: Patrick Cloke <clokep@users.noreply.github.com>
2022-02-12Implement MSC3706: partial state in `/send_join` response (#11967)Richard van der Hoff7-21/+262
* Make `get_auth_chain_ids` return a Set It has a set internally, and a set is often useful where it gets used, so let's avoid converting to an intermediate list. * Minor refactors in `on_send_join_request` A little bit of non-functional groundwork * Implement MSC3706: partial state in /send_join response
2022-02-11Enable cache time-based expiry by default (#11849)Shay5-11/+50
2022-02-11Support the MSC3715 for `/relations`. (#11941)Patrick Cloke3-6/+36
This adds an unstable org.matrix.msc3715.dir parameter which acts like dir on /mesages.
2022-02-11Fetch thread summaries for multiple events in a single query (#11752)Patrick Cloke3-74/+151
This should reduce database usage when fetching bundled aggregations as the number of individual queries (and round trips to the database) are reduced.
2022-02-11Prepare for rename of default complement branch (#11971)Richard van der Hoff2-3/+4