matrix-synapse 1.142.0rc3__cp314-abi3-musllinux_1_2_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of matrix-synapse might be problematic. Click here for more details.
- matrix_synapse-1.142.0rc3.dist-info/AUTHORS.rst +51 -0
- matrix_synapse-1.142.0rc3.dist-info/LICENSE-AGPL-3.0 +661 -0
- matrix_synapse-1.142.0rc3.dist-info/LICENSE-COMMERCIAL +6 -0
- matrix_synapse-1.142.0rc3.dist-info/METADATA +375 -0
- matrix_synapse-1.142.0rc3.dist-info/RECORD +1057 -0
- matrix_synapse-1.142.0rc3.dist-info/WHEEL +4 -0
- matrix_synapse-1.142.0rc3.dist-info/entry_points.txt +14 -0
- matrix_synapse.libs/libgcc_s-2d945d6c.so.1 +0 -0
- synapse/__init__.py +97 -0
- synapse/_scripts/__init__.py +0 -0
- synapse/_scripts/export_signing_key.py +109 -0
- synapse/_scripts/generate_config.py +83 -0
- synapse/_scripts/generate_log_config.py +56 -0
- synapse/_scripts/generate_signing_key.py +55 -0
- synapse/_scripts/generate_workers_map.py +318 -0
- synapse/_scripts/hash_password.py +95 -0
- synapse/_scripts/move_remote_media_to_new_store.py +128 -0
- synapse/_scripts/register_new_matrix_user.py +374 -0
- synapse/_scripts/review_recent_signups.py +212 -0
- synapse/_scripts/synapse_port_db.py +1603 -0
- synapse/_scripts/synctl.py +365 -0
- synapse/_scripts/update_synapse_database.py +130 -0
- synapse/api/__init__.py +20 -0
- synapse/api/auth/__init__.py +207 -0
- synapse/api/auth/base.py +406 -0
- synapse/api/auth/internal.py +299 -0
- synapse/api/auth/mas.py +457 -0
- synapse/api/auth/msc3861_delegated.py +617 -0
- synapse/api/auth_blocking.py +144 -0
- synapse/api/constants.py +362 -0
- synapse/api/errors.py +907 -0
- synapse/api/filtering.py +539 -0
- synapse/api/presence.py +104 -0
- synapse/api/ratelimiting.py +482 -0
- synapse/api/room_versions.py +535 -0
- synapse/api/urls.py +119 -0
- synapse/app/__init__.py +60 -0
- synapse/app/_base.py +866 -0
- synapse/app/admin_cmd.py +388 -0
- synapse/app/appservice.py +30 -0
- synapse/app/client_reader.py +30 -0
- synapse/app/complement_fork_starter.py +206 -0
- synapse/app/event_creator.py +29 -0
- synapse/app/federation_reader.py +30 -0
- synapse/app/federation_sender.py +30 -0
- synapse/app/frontend_proxy.py +30 -0
- synapse/app/generic_worker.py +475 -0
- synapse/app/homeserver.py +504 -0
- synapse/app/media_repository.py +30 -0
- synapse/app/phone_stats_home.py +296 -0
- synapse/app/pusher.py +30 -0
- synapse/app/synchrotron.py +30 -0
- synapse/app/user_dir.py +31 -0
- synapse/appservice/__init__.py +461 -0
- synapse/appservice/api.py +569 -0
- synapse/appservice/scheduler.py +567 -0
- synapse/config/__init__.py +27 -0
- synapse/config/__main__.py +62 -0
- synapse/config/_base.py +1108 -0
- synapse/config/_base.pyi +217 -0
- synapse/config/_util.py +99 -0
- synapse/config/account_validity.py +116 -0
- synapse/config/api.py +141 -0
- synapse/config/appservice.py +210 -0
- synapse/config/auth.py +80 -0
- synapse/config/auto_accept_invites.py +43 -0
- synapse/config/background_updates.py +44 -0
- synapse/config/cache.py +231 -0
- synapse/config/captcha.py +90 -0
- synapse/config/cas.py +116 -0
- synapse/config/consent.py +73 -0
- synapse/config/database.py +184 -0
- synapse/config/emailconfig.py +367 -0
- synapse/config/experimental.py +595 -0
- synapse/config/federation.py +114 -0
- synapse/config/homeserver.py +141 -0
- synapse/config/jwt.py +55 -0
- synapse/config/key.py +447 -0
- synapse/config/logger.py +390 -0
- synapse/config/mas.py +191 -0
- synapse/config/matrixrtc.py +66 -0
- synapse/config/metrics.py +84 -0
- synapse/config/modules.py +40 -0
- synapse/config/oembed.py +185 -0
- synapse/config/oidc.py +509 -0
- synapse/config/password_auth_providers.py +82 -0
- synapse/config/push.py +64 -0
- synapse/config/ratelimiting.py +254 -0
- synapse/config/redis.py +74 -0
- synapse/config/registration.py +296 -0
- synapse/config/repository.py +311 -0
- synapse/config/retention.py +162 -0
- synapse/config/room.py +88 -0
- synapse/config/room_directory.py +165 -0
- synapse/config/saml2.py +251 -0
- synapse/config/server.py +1170 -0
- synapse/config/server_notices.py +84 -0
- synapse/config/spam_checker.py +66 -0
- synapse/config/sso.py +121 -0
- synapse/config/stats.py +54 -0
- synapse/config/third_party_event_rules.py +40 -0
- synapse/config/tls.py +192 -0
- synapse/config/tracer.py +71 -0
- synapse/config/user_directory.py +47 -0
- synapse/config/user_types.py +44 -0
- synapse/config/voip.py +59 -0
- synapse/config/workers.py +642 -0
- synapse/crypto/__init__.py +20 -0
- synapse/crypto/context_factory.py +278 -0
- synapse/crypto/event_signing.py +194 -0
- synapse/crypto/keyring.py +931 -0
- synapse/event_auth.py +1266 -0
- synapse/events/__init__.py +668 -0
- synapse/events/auto_accept_invites.py +216 -0
- synapse/events/builder.py +387 -0
- synapse/events/presence_router.py +245 -0
- synapse/events/snapshot.py +559 -0
- synapse/events/utils.py +928 -0
- synapse/events/validator.py +305 -0
- synapse/federation/__init__.py +22 -0
- synapse/federation/federation_base.py +383 -0
- synapse/federation/federation_client.py +2134 -0
- synapse/federation/federation_server.py +1544 -0
- synapse/federation/persistence.py +71 -0
- synapse/federation/send_queue.py +532 -0
- synapse/federation/sender/__init__.py +1165 -0
- synapse/federation/sender/per_destination_queue.py +884 -0
- synapse/federation/sender/transaction_manager.py +210 -0
- synapse/federation/transport/__init__.py +28 -0
- synapse/federation/transport/client.py +1201 -0
- synapse/federation/transport/server/__init__.py +334 -0
- synapse/federation/transport/server/_base.py +429 -0
- synapse/federation/transport/server/federation.py +912 -0
- synapse/federation/units.py +133 -0
- synapse/handlers/__init__.py +20 -0
- synapse/handlers/account.py +162 -0
- synapse/handlers/account_data.py +362 -0
- synapse/handlers/account_validity.py +361 -0
- synapse/handlers/admin.py +618 -0
- synapse/handlers/appservice.py +991 -0
- synapse/handlers/auth.py +2494 -0
- synapse/handlers/cas.py +413 -0
- synapse/handlers/deactivate_account.py +363 -0
- synapse/handlers/delayed_events.py +635 -0
- synapse/handlers/device.py +1873 -0
- synapse/handlers/devicemessage.py +399 -0
- synapse/handlers/directory.py +554 -0
- synapse/handlers/e2e_keys.py +1834 -0
- synapse/handlers/e2e_room_keys.py +455 -0
- synapse/handlers/event_auth.py +390 -0
- synapse/handlers/events.py +201 -0
- synapse/handlers/federation.py +2043 -0
- synapse/handlers/federation_event.py +2420 -0
- synapse/handlers/identity.py +812 -0
- synapse/handlers/initial_sync.py +528 -0
- synapse/handlers/jwt.py +120 -0
- synapse/handlers/message.py +2347 -0
- synapse/handlers/oidc.py +1803 -0
- synapse/handlers/pagination.py +768 -0
- synapse/handlers/password_policy.py +102 -0
- synapse/handlers/presence.py +2638 -0
- synapse/handlers/profile.py +655 -0
- synapse/handlers/push_rules.py +164 -0
- synapse/handlers/read_marker.py +79 -0
- synapse/handlers/receipts.py +351 -0
- synapse/handlers/register.py +1060 -0
- synapse/handlers/relations.py +624 -0
- synapse/handlers/reports.py +98 -0
- synapse/handlers/room.py +2447 -0
- synapse/handlers/room_list.py +632 -0
- synapse/handlers/room_member.py +2365 -0
- synapse/handlers/room_member_worker.py +146 -0
- synapse/handlers/room_policy.py +186 -0
- synapse/handlers/room_summary.py +1057 -0
- synapse/handlers/saml.py +524 -0
- synapse/handlers/search.py +723 -0
- synapse/handlers/send_email.py +209 -0
- synapse/handlers/set_password.py +71 -0
- synapse/handlers/sliding_sync/__init__.py +1701 -0
- synapse/handlers/sliding_sync/extensions.py +970 -0
- synapse/handlers/sliding_sync/room_lists.py +2266 -0
- synapse/handlers/sliding_sync/store.py +128 -0
- synapse/handlers/sso.py +1292 -0
- synapse/handlers/state_deltas.py +82 -0
- synapse/handlers/stats.py +322 -0
- synapse/handlers/sync.py +3109 -0
- synapse/handlers/thread_subscriptions.py +190 -0
- synapse/handlers/typing.py +606 -0
- synapse/handlers/ui_auth/__init__.py +48 -0
- synapse/handlers/ui_auth/checkers.py +332 -0
- synapse/handlers/user_directory.py +783 -0
- synapse/handlers/worker_lock.py +365 -0
- synapse/http/__init__.py +106 -0
- synapse/http/additional_resource.py +62 -0
- synapse/http/client.py +1360 -0
- synapse/http/connectproxyclient.py +309 -0
- synapse/http/federation/__init__.py +19 -0
- synapse/http/federation/matrix_federation_agent.py +490 -0
- synapse/http/federation/srv_resolver.py +196 -0
- synapse/http/federation/well_known_resolver.py +367 -0
- synapse/http/matrixfederationclient.py +1875 -0
- synapse/http/proxy.py +290 -0
- synapse/http/proxyagent.py +497 -0
- synapse/http/replicationagent.py +203 -0
- synapse/http/request_metrics.py +309 -0
- synapse/http/server.py +1114 -0
- synapse/http/servlet.py +1019 -0
- synapse/http/site.py +825 -0
- synapse/http/types.py +27 -0
- synapse/logging/__init__.py +31 -0
- synapse/logging/_remote.py +261 -0
- synapse/logging/_terse_json.py +95 -0
- synapse/logging/context.py +1211 -0
- synapse/logging/formatter.py +63 -0
- synapse/logging/handlers.py +99 -0
- synapse/logging/loggers.py +25 -0
- synapse/logging/opentracing.py +1132 -0
- synapse/logging/scopecontextmanager.py +161 -0
- synapse/media/_base.py +827 -0
- synapse/media/filepath.py +417 -0
- synapse/media/media_repository.py +1580 -0
- synapse/media/media_storage.py +704 -0
- synapse/media/oembed.py +277 -0
- synapse/media/preview_html.py +559 -0
- synapse/media/storage_provider.py +195 -0
- synapse/media/thumbnailer.py +833 -0
- synapse/media/url_previewer.py +875 -0
- synapse/metrics/__init__.py +754 -0
- synapse/metrics/_gc.py +219 -0
- synapse/metrics/_reactor_metrics.py +171 -0
- synapse/metrics/_types.py +38 -0
- synapse/metrics/background_process_metrics.py +556 -0
- synapse/metrics/common_usage_metrics.py +94 -0
- synapse/metrics/jemalloc.py +248 -0
- synapse/module_api/__init__.py +2154 -0
- synapse/module_api/callbacks/__init__.py +50 -0
- synapse/module_api/callbacks/account_validity_callbacks.py +106 -0
- synapse/module_api/callbacks/media_repository_callbacks.py +160 -0
- synapse/module_api/callbacks/ratelimit_callbacks.py +79 -0
- synapse/module_api/callbacks/spamchecker_callbacks.py +1113 -0
- synapse/module_api/callbacks/third_party_event_rules_callbacks.py +599 -0
- synapse/module_api/errors.py +42 -0
- synapse/notifier.py +972 -0
- synapse/push/__init__.py +212 -0
- synapse/push/bulk_push_rule_evaluator.py +637 -0
- synapse/push/clientformat.py +126 -0
- synapse/push/emailpusher.py +333 -0
- synapse/push/httppusher.py +564 -0
- synapse/push/mailer.py +1012 -0
- synapse/push/presentable_names.py +216 -0
- synapse/push/push_tools.py +114 -0
- synapse/push/push_types.py +141 -0
- synapse/push/pusher.py +87 -0
- synapse/push/pusherpool.py +501 -0
- synapse/push/rulekinds.py +33 -0
- synapse/py.typed +0 -0
- synapse/replication/__init__.py +20 -0
- synapse/replication/http/__init__.py +68 -0
- synapse/replication/http/_base.py +468 -0
- synapse/replication/http/account_data.py +297 -0
- synapse/replication/http/deactivate_account.py +81 -0
- synapse/replication/http/delayed_events.py +62 -0
- synapse/replication/http/devices.py +254 -0
- synapse/replication/http/federation.py +334 -0
- synapse/replication/http/login.py +106 -0
- synapse/replication/http/membership.py +364 -0
- synapse/replication/http/presence.py +133 -0
- synapse/replication/http/push.py +156 -0
- synapse/replication/http/register.py +172 -0
- synapse/replication/http/send_events.py +182 -0
- synapse/replication/http/state.py +82 -0
- synapse/replication/http/streams.py +101 -0
- synapse/replication/tcp/__init__.py +56 -0
- synapse/replication/tcp/client.py +552 -0
- synapse/replication/tcp/commands.py +569 -0
- synapse/replication/tcp/context.py +41 -0
- synapse/replication/tcp/external_cache.py +156 -0
- synapse/replication/tcp/handler.py +942 -0
- synapse/replication/tcp/protocol.py +608 -0
- synapse/replication/tcp/redis.py +509 -0
- synapse/replication/tcp/resource.py +348 -0
- synapse/replication/tcp/streams/__init__.py +96 -0
- synapse/replication/tcp/streams/_base.py +766 -0
- synapse/replication/tcp/streams/events.py +287 -0
- synapse/replication/tcp/streams/federation.py +92 -0
- synapse/replication/tcp/streams/partial_state.py +80 -0
- synapse/res/providers.json +29 -0
- synapse/res/templates/_base.html +29 -0
- synapse/res/templates/account_previously_renewed.html +6 -0
- synapse/res/templates/account_renewed.html +6 -0
- synapse/res/templates/add_threepid.html +8 -0
- synapse/res/templates/add_threepid.txt +6 -0
- synapse/res/templates/add_threepid_failure.html +7 -0
- synapse/res/templates/add_threepid_success.html +6 -0
- synapse/res/templates/already_in_use.html +12 -0
- synapse/res/templates/already_in_use.txt +10 -0
- synapse/res/templates/auth_success.html +21 -0
- synapse/res/templates/invalid_token.html +6 -0
- synapse/res/templates/mail-Element.css +7 -0
- synapse/res/templates/mail-Vector.css +7 -0
- synapse/res/templates/mail-expiry.css +4 -0
- synapse/res/templates/mail.css +156 -0
- synapse/res/templates/notice_expiry.html +46 -0
- synapse/res/templates/notice_expiry.txt +7 -0
- synapse/res/templates/notif.html +51 -0
- synapse/res/templates/notif.txt +22 -0
- synapse/res/templates/notif_mail.html +59 -0
- synapse/res/templates/notif_mail.txt +10 -0
- synapse/res/templates/password_reset.html +10 -0
- synapse/res/templates/password_reset.txt +7 -0
- synapse/res/templates/password_reset_confirmation.html +15 -0
- synapse/res/templates/password_reset_failure.html +7 -0
- synapse/res/templates/password_reset_success.html +6 -0
- synapse/res/templates/recaptcha.html +42 -0
- synapse/res/templates/registration.html +12 -0
- synapse/res/templates/registration.txt +10 -0
- synapse/res/templates/registration_failure.html +6 -0
- synapse/res/templates/registration_success.html +6 -0
- synapse/res/templates/registration_token.html +18 -0
- synapse/res/templates/room.html +33 -0
- synapse/res/templates/room.txt +9 -0
- synapse/res/templates/sso.css +129 -0
- synapse/res/templates/sso_account_deactivated.html +25 -0
- synapse/res/templates/sso_auth_account_details.html +186 -0
- synapse/res/templates/sso_auth_account_details.js +116 -0
- synapse/res/templates/sso_auth_bad_user.html +26 -0
- synapse/res/templates/sso_auth_confirm.html +27 -0
- synapse/res/templates/sso_auth_success.html +26 -0
- synapse/res/templates/sso_error.html +71 -0
- synapse/res/templates/sso_footer.html +19 -0
- synapse/res/templates/sso_login_idp_picker.html +60 -0
- synapse/res/templates/sso_new_user_consent.html +30 -0
- synapse/res/templates/sso_partial_profile.html +19 -0
- synapse/res/templates/sso_redirect_confirm.html +39 -0
- synapse/res/templates/style.css +33 -0
- synapse/res/templates/terms.html +27 -0
- synapse/rest/__init__.py +197 -0
- synapse/rest/admin/__init__.py +390 -0
- synapse/rest/admin/_base.py +72 -0
- synapse/rest/admin/background_updates.py +171 -0
- synapse/rest/admin/devices.py +221 -0
- synapse/rest/admin/event_reports.py +173 -0
- synapse/rest/admin/events.py +69 -0
- synapse/rest/admin/experimental_features.py +137 -0
- synapse/rest/admin/federation.py +243 -0
- synapse/rest/admin/media.py +540 -0
- synapse/rest/admin/registration_tokens.py +358 -0
- synapse/rest/admin/rooms.py +1061 -0
- synapse/rest/admin/scheduled_tasks.py +70 -0
- synapse/rest/admin/server_notice_servlet.py +132 -0
- synapse/rest/admin/statistics.py +132 -0
- synapse/rest/admin/username_available.py +58 -0
- synapse/rest/admin/users.py +1608 -0
- synapse/rest/client/__init__.py +20 -0
- synapse/rest/client/_base.py +113 -0
- synapse/rest/client/account.py +930 -0
- synapse/rest/client/account_data.py +319 -0
- synapse/rest/client/account_validity.py +103 -0
- synapse/rest/client/appservice_ping.py +125 -0
- synapse/rest/client/auth.py +218 -0
- synapse/rest/client/auth_metadata.py +122 -0
- synapse/rest/client/capabilities.py +121 -0
- synapse/rest/client/delayed_events.py +111 -0
- synapse/rest/client/devices.py +587 -0
- synapse/rest/client/directory.py +211 -0
- synapse/rest/client/events.py +116 -0
- synapse/rest/client/filter.py +112 -0
- synapse/rest/client/initial_sync.py +65 -0
- synapse/rest/client/keys.py +678 -0
- synapse/rest/client/knock.py +104 -0
- synapse/rest/client/login.py +754 -0
- synapse/rest/client/login_token_request.py +127 -0
- synapse/rest/client/logout.py +93 -0
- synapse/rest/client/matrixrtc.py +52 -0
- synapse/rest/client/media.py +286 -0
- synapse/rest/client/mutual_rooms.py +93 -0
- synapse/rest/client/notifications.py +137 -0
- synapse/rest/client/openid.py +109 -0
- synapse/rest/client/password_policy.py +69 -0
- synapse/rest/client/presence.py +131 -0
- synapse/rest/client/profile.py +291 -0
- synapse/rest/client/push_rule.py +331 -0
- synapse/rest/client/pusher.py +181 -0
- synapse/rest/client/read_marker.py +104 -0
- synapse/rest/client/receipts.py +165 -0
- synapse/rest/client/register.py +1067 -0
- synapse/rest/client/relations.py +138 -0
- synapse/rest/client/rendezvous.py +76 -0
- synapse/rest/client/reporting.py +207 -0
- synapse/rest/client/room.py +1669 -0
- synapse/rest/client/room_keys.py +426 -0
- synapse/rest/client/room_upgrade_rest_servlet.py +112 -0
- synapse/rest/client/sendtodevice.py +85 -0
- synapse/rest/client/sync.py +1131 -0
- synapse/rest/client/tags.py +129 -0
- synapse/rest/client/thirdparty.py +130 -0
- synapse/rest/client/thread_subscriptions.py +247 -0
- synapse/rest/client/tokenrefresh.py +52 -0
- synapse/rest/client/transactions.py +149 -0
- synapse/rest/client/user_directory.py +90 -0
- synapse/rest/client/versions.py +191 -0
- synapse/rest/client/voip.py +88 -0
- synapse/rest/consent/__init__.py +0 -0
- synapse/rest/consent/consent_resource.py +210 -0
- synapse/rest/health.py +38 -0
- synapse/rest/key/__init__.py +20 -0
- synapse/rest/key/v2/__init__.py +40 -0
- synapse/rest/key/v2/local_key_resource.py +125 -0
- synapse/rest/key/v2/remote_key_resource.py +302 -0
- synapse/rest/media/__init__.py +0 -0
- synapse/rest/media/config_resource.py +53 -0
- synapse/rest/media/create_resource.py +90 -0
- synapse/rest/media/download_resource.py +110 -0
- synapse/rest/media/media_repository_resource.py +113 -0
- synapse/rest/media/preview_url_resource.py +77 -0
- synapse/rest/media/thumbnail_resource.py +142 -0
- synapse/rest/media/upload_resource.py +187 -0
- synapse/rest/media/v1/__init__.py +39 -0
- synapse/rest/media/v1/_base.py +23 -0
- synapse/rest/media/v1/media_storage.py +23 -0
- synapse/rest/media/v1/storage_provider.py +23 -0
- synapse/rest/synapse/__init__.py +20 -0
- synapse/rest/synapse/client/__init__.py +93 -0
- synapse/rest/synapse/client/federation_whitelist.py +66 -0
- synapse/rest/synapse/client/jwks.py +77 -0
- synapse/rest/synapse/client/new_user_consent.py +115 -0
- synapse/rest/synapse/client/oidc/__init__.py +45 -0
- synapse/rest/synapse/client/oidc/backchannel_logout_resource.py +42 -0
- synapse/rest/synapse/client/oidc/callback_resource.py +48 -0
- synapse/rest/synapse/client/password_reset.py +129 -0
- synapse/rest/synapse/client/pick_idp.py +107 -0
- synapse/rest/synapse/client/pick_username.py +153 -0
- synapse/rest/synapse/client/rendezvous.py +58 -0
- synapse/rest/synapse/client/saml2/__init__.py +42 -0
- synapse/rest/synapse/client/saml2/metadata_resource.py +46 -0
- synapse/rest/synapse/client/saml2/response_resource.py +52 -0
- synapse/rest/synapse/client/sso_register.py +56 -0
- synapse/rest/synapse/client/unsubscribe.py +88 -0
- synapse/rest/synapse/mas/__init__.py +71 -0
- synapse/rest/synapse/mas/_base.py +55 -0
- synapse/rest/synapse/mas/devices.py +239 -0
- synapse/rest/synapse/mas/users.py +469 -0
- synapse/rest/well_known.py +148 -0
- synapse/server.py +1258 -0
- synapse/server_notices/__init__.py +0 -0
- synapse/server_notices/consent_server_notices.py +136 -0
- synapse/server_notices/resource_limits_server_notices.py +215 -0
- synapse/server_notices/server_notices_manager.py +388 -0
- synapse/server_notices/server_notices_sender.py +67 -0
- synapse/server_notices/worker_server_notices_sender.py +46 -0
- synapse/spam_checker_api/__init__.py +31 -0
- synapse/state/__init__.py +1022 -0
- synapse/state/v1.py +370 -0
- synapse/state/v2.py +985 -0
- synapse/static/client/login/index.html +47 -0
- synapse/static/client/login/js/jquery-3.4.1.min.js +2 -0
- synapse/static/client/login/js/login.js +291 -0
- synapse/static/client/login/spinner.gif +0 -0
- synapse/static/client/login/style.css +79 -0
- synapse/static/index.html +63 -0
- synapse/storage/__init__.py +43 -0
- synapse/storage/_base.py +245 -0
- synapse/storage/admin_client_config.py +26 -0
- synapse/storage/background_updates.py +1189 -0
- synapse/storage/controllers/__init__.py +57 -0
- synapse/storage/controllers/persist_events.py +1239 -0
- synapse/storage/controllers/purge_events.py +456 -0
- synapse/storage/controllers/state.py +954 -0
- synapse/storage/controllers/stats.py +119 -0
- synapse/storage/database.py +2720 -0
- synapse/storage/databases/__init__.py +175 -0
- synapse/storage/databases/main/__init__.py +424 -0
- synapse/storage/databases/main/account_data.py +1060 -0
- synapse/storage/databases/main/appservice.py +473 -0
- synapse/storage/databases/main/cache.py +911 -0
- synapse/storage/databases/main/censor_events.py +225 -0
- synapse/storage/databases/main/client_ips.py +817 -0
- synapse/storage/databases/main/delayed_events.py +560 -0
- synapse/storage/databases/main/deviceinbox.py +1272 -0
- synapse/storage/databases/main/devices.py +2581 -0
- synapse/storage/databases/main/directory.py +212 -0
- synapse/storage/databases/main/e2e_room_keys.py +690 -0
- synapse/storage/databases/main/end_to_end_keys.py +1896 -0
- synapse/storage/databases/main/event_federation.py +2509 -0
- synapse/storage/databases/main/event_push_actions.py +1937 -0
- synapse/storage/databases/main/events.py +3746 -0
- synapse/storage/databases/main/events_bg_updates.py +2910 -0
- synapse/storage/databases/main/events_forward_extremities.py +126 -0
- synapse/storage/databases/main/events_worker.py +2784 -0
- synapse/storage/databases/main/experimental_features.py +130 -0
- synapse/storage/databases/main/filtering.py +231 -0
- synapse/storage/databases/main/keys.py +291 -0
- synapse/storage/databases/main/lock.py +553 -0
- synapse/storage/databases/main/media_repository.py +1070 -0
- synapse/storage/databases/main/metrics.py +460 -0
- synapse/storage/databases/main/monthly_active_users.py +443 -0
- synapse/storage/databases/main/openid.py +61 -0
- synapse/storage/databases/main/presence.py +511 -0
- synapse/storage/databases/main/profile.py +541 -0
- synapse/storage/databases/main/purge_events.py +511 -0
- synapse/storage/databases/main/push_rule.py +972 -0
- synapse/storage/databases/main/pusher.py +794 -0
- synapse/storage/databases/main/receipts.py +1342 -0
- synapse/storage/databases/main/registration.py +3076 -0
- synapse/storage/databases/main/rejections.py +38 -0
- synapse/storage/databases/main/relations.py +1118 -0
- synapse/storage/databases/main/room.py +2781 -0
- synapse/storage/databases/main/roommember.py +2112 -0
- synapse/storage/databases/main/search.py +941 -0
- synapse/storage/databases/main/session.py +151 -0
- synapse/storage/databases/main/signatures.py +94 -0
- synapse/storage/databases/main/sliding_sync.py +603 -0
- synapse/storage/databases/main/state.py +1006 -0
- synapse/storage/databases/main/state_deltas.py +329 -0
- synapse/storage/databases/main/stats.py +791 -0
- synapse/storage/databases/main/stream.py +2580 -0
- synapse/storage/databases/main/tags.py +360 -0
- synapse/storage/databases/main/task_scheduler.py +225 -0
- synapse/storage/databases/main/thread_subscriptions.py +591 -0
- synapse/storage/databases/main/transactions.py +681 -0
- synapse/storage/databases/main/ui_auth.py +420 -0
- synapse/storage/databases/main/user_directory.py +1331 -0
- synapse/storage/databases/main/user_erasure_store.py +117 -0
- synapse/storage/databases/state/__init__.py +22 -0
- synapse/storage/databases/state/bg_updates.py +499 -0
- synapse/storage/databases/state/deletion.py +558 -0
- synapse/storage/databases/state/store.py +949 -0
- synapse/storage/engines/__init__.py +70 -0
- synapse/storage/engines/_base.py +154 -0
- synapse/storage/engines/postgres.py +261 -0
- synapse/storage/engines/sqlite.py +199 -0
- synapse/storage/invite_rule.py +112 -0
- synapse/storage/keys.py +40 -0
- synapse/storage/prepare_database.py +731 -0
- synapse/storage/push_rule.py +28 -0
- synapse/storage/roommember.py +89 -0
- synapse/storage/schema/README.md +4 -0
- synapse/storage/schema/__init__.py +182 -0
- synapse/storage/schema/common/delta/25/00background_updates.sql +40 -0
- synapse/storage/schema/common/delta/35/00background_updates_add_col.sql +36 -0
- synapse/storage/schema/common/delta/58/00background_update_ordering.sql +38 -0
- synapse/storage/schema/common/full_schemas/72/full.sql.postgres +8 -0
- synapse/storage/schema/common/full_schemas/72/full.sql.sqlite +6 -0
- synapse/storage/schema/common/schema_version.sql +60 -0
- synapse/storage/schema/main/delta/12/v12.sql +82 -0
- synapse/storage/schema/main/delta/13/v13.sql +38 -0
- synapse/storage/schema/main/delta/14/v14.sql +42 -0
- synapse/storage/schema/main/delta/15/appservice_txns.sql +50 -0
- synapse/storage/schema/main/delta/15/presence_indices.sql +2 -0
- synapse/storage/schema/main/delta/15/v15.sql +24 -0
- synapse/storage/schema/main/delta/16/events_order_index.sql +4 -0
- synapse/storage/schema/main/delta/16/remote_media_cache_index.sql +2 -0
- synapse/storage/schema/main/delta/16/remove_duplicates.sql +9 -0
- synapse/storage/schema/main/delta/16/room_alias_index.sql +3 -0
- synapse/storage/schema/main/delta/16/unique_constraints.sql +72 -0
- synapse/storage/schema/main/delta/16/users.sql +56 -0
- synapse/storage/schema/main/delta/17/drop_indexes.sql +37 -0
- synapse/storage/schema/main/delta/17/server_keys.sql +43 -0
- synapse/storage/schema/main/delta/17/user_threepids.sql +9 -0
- synapse/storage/schema/main/delta/18/server_keys_bigger_ints.sql +51 -0
- synapse/storage/schema/main/delta/19/event_index.sql +38 -0
- synapse/storage/schema/main/delta/20/dummy.sql +1 -0
- synapse/storage/schema/main/delta/20/pushers.py +93 -0
- synapse/storage/schema/main/delta/21/end_to_end_keys.sql +53 -0
- synapse/storage/schema/main/delta/21/receipts.sql +57 -0
- synapse/storage/schema/main/delta/22/receipts_index.sql +41 -0
- synapse/storage/schema/main/delta/22/user_threepids_unique.sql +19 -0
- synapse/storage/schema/main/delta/24/stats_reporting.sql +37 -0
- synapse/storage/schema/main/delta/25/fts.py +81 -0
- synapse/storage/schema/main/delta/25/guest_access.sql +44 -0
- synapse/storage/schema/main/delta/25/history_visibility.sql +44 -0
- synapse/storage/schema/main/delta/25/tags.sql +57 -0
- synapse/storage/schema/main/delta/26/account_data.sql +36 -0
- synapse/storage/schema/main/delta/27/account_data.sql +55 -0
- synapse/storage/schema/main/delta/27/forgotten_memberships.sql +45 -0
- synapse/storage/schema/main/delta/27/ts.py +61 -0
- synapse/storage/schema/main/delta/28/event_push_actions.sql +46 -0
- synapse/storage/schema/main/delta/28/events_room_stream.sql +39 -0
- synapse/storage/schema/main/delta/28/public_roms_index.sql +39 -0
- synapse/storage/schema/main/delta/28/receipts_user_id_index.sql +41 -0
- synapse/storage/schema/main/delta/28/upgrade_times.sql +40 -0
- synapse/storage/schema/main/delta/28/users_is_guest.sql +41 -0
- synapse/storage/schema/main/delta/29/push_actions.sql +54 -0
- synapse/storage/schema/main/delta/30/alias_creator.sql +35 -0
- synapse/storage/schema/main/delta/30/as_users.py +82 -0
- synapse/storage/schema/main/delta/30/deleted_pushers.sql +44 -0
- synapse/storage/schema/main/delta/30/presence_stream.sql +49 -0
- synapse/storage/schema/main/delta/30/public_rooms.sql +42 -0
- synapse/storage/schema/main/delta/30/push_rule_stream.sql +57 -0
- synapse/storage/schema/main/delta/30/threepid_guest_access_tokens.sql +43 -0
- synapse/storage/schema/main/delta/31/invites.sql +61 -0
- synapse/storage/schema/main/delta/31/local_media_repository_url_cache.sql +46 -0
- synapse/storage/schema/main/delta/31/pushers_0.py +92 -0
- synapse/storage/schema/main/delta/31/pushers_index.sql +41 -0
- synapse/storage/schema/main/delta/31/search_update.py +65 -0
- synapse/storage/schema/main/delta/32/events.sql +35 -0
- synapse/storage/schema/main/delta/32/openid.sql +9 -0
- synapse/storage/schema/main/delta/32/pusher_throttle.sql +42 -0
- synapse/storage/schema/main/delta/32/remove_indices.sql +52 -0
- synapse/storage/schema/main/delta/32/reports.sql +44 -0
- synapse/storage/schema/main/delta/33/access_tokens_device_index.sql +36 -0
- synapse/storage/schema/main/delta/33/devices.sql +40 -0
- synapse/storage/schema/main/delta/33/devices_for_e2e_keys.sql +38 -0
- synapse/storage/schema/main/delta/33/devices_for_e2e_keys_clear_unknown_device.sql +39 -0
- synapse/storage/schema/main/delta/33/event_fields.py +61 -0
- synapse/storage/schema/main/delta/33/remote_media_ts.py +43 -0
- synapse/storage/schema/main/delta/33/user_ips_index.sql +36 -0
- synapse/storage/schema/main/delta/34/appservice_stream.sql +42 -0
- synapse/storage/schema/main/delta/34/cache_stream.py +50 -0
- synapse/storage/schema/main/delta/34/device_inbox.sql +43 -0
- synapse/storage/schema/main/delta/34/push_display_name_rename.sql +39 -0
- synapse/storage/schema/main/delta/34/received_txn_purge.py +36 -0
- synapse/storage/schema/main/delta/35/contains_url.sql +36 -0
- synapse/storage/schema/main/delta/35/device_outbox.sql +58 -0
- synapse/storage/schema/main/delta/35/device_stream_id.sql +40 -0
- synapse/storage/schema/main/delta/35/event_push_actions_index.sql +36 -0
- synapse/storage/schema/main/delta/35/public_room_list_change_stream.sql +52 -0
- synapse/storage/schema/main/delta/35/stream_order_to_extrem.sql +56 -0
- synapse/storage/schema/main/delta/36/readd_public_rooms.sql +45 -0
- synapse/storage/schema/main/delta/37/remove_auth_idx.py +89 -0
- synapse/storage/schema/main/delta/37/user_threepids.sql +71 -0
- synapse/storage/schema/main/delta/38/postgres_fts_gist.sql +38 -0
- synapse/storage/schema/main/delta/39/appservice_room_list.sql +48 -0
- synapse/storage/schema/main/delta/39/device_federation_stream_idx.sql +35 -0
- synapse/storage/schema/main/delta/39/event_push_index.sql +36 -0
- synapse/storage/schema/main/delta/39/federation_out_position.sql +41 -0
- synapse/storage/schema/main/delta/39/membership_profile.sql +39 -0
- synapse/storage/schema/main/delta/40/current_state_idx.sql +36 -0
- synapse/storage/schema/main/delta/40/device_inbox.sql +40 -0
- synapse/storage/schema/main/delta/40/device_list_streams.sql +79 -0
- synapse/storage/schema/main/delta/40/event_push_summary.sql +57 -0
- synapse/storage/schema/main/delta/40/pushers.sql +58 -0
- synapse/storage/schema/main/delta/41/device_list_stream_idx.sql +36 -0
- synapse/storage/schema/main/delta/41/device_outbound_index.sql +35 -0
- synapse/storage/schema/main/delta/41/event_search_event_id_idx.sql +36 -0
- synapse/storage/schema/main/delta/41/ratelimit.sql +41 -0
- synapse/storage/schema/main/delta/42/current_state_delta.sql +48 -0
- synapse/storage/schema/main/delta/42/device_list_last_id.sql +52 -0
- synapse/storage/schema/main/delta/42/event_auth_state_only.sql +36 -0
- synapse/storage/schema/main/delta/42/user_dir.py +88 -0
- synapse/storage/schema/main/delta/43/blocked_rooms.sql +40 -0
- synapse/storage/schema/main/delta/43/quarantine_media.sql +36 -0
- synapse/storage/schema/main/delta/43/url_cache.sql +35 -0
- synapse/storage/schema/main/delta/43/user_share.sql +52 -0
- synapse/storage/schema/main/delta/44/expire_url_cache.sql +60 -0
- synapse/storage/schema/main/delta/45/group_server.sql +186 -0
- synapse/storage/schema/main/delta/45/profile_cache.sql +47 -0
- synapse/storage/schema/main/delta/46/drop_refresh_tokens.sql +36 -0
- synapse/storage/schema/main/delta/46/drop_unique_deleted_pushers.sql +54 -0
- synapse/storage/schema/main/delta/46/group_server.sql +51 -0
- synapse/storage/schema/main/delta/46/local_media_repository_url_idx.sql +43 -0
- synapse/storage/schema/main/delta/46/user_dir_null_room_ids.sql +54 -0
- synapse/storage/schema/main/delta/46/user_dir_typos.sql +43 -0
- synapse/storage/schema/main/delta/47/last_access_media.sql +35 -0
- synapse/storage/schema/main/delta/47/postgres_fts_gin.sql +36 -0
- synapse/storage/schema/main/delta/47/push_actions_staging.sql +47 -0
- synapse/storage/schema/main/delta/48/add_user_consent.sql +37 -0
- synapse/storage/schema/main/delta/48/add_user_ips_last_seen_index.sql +36 -0
- synapse/storage/schema/main/delta/48/deactivated_users.sql +44 -0
- synapse/storage/schema/main/delta/48/group_unique_indexes.py +67 -0
- synapse/storage/schema/main/delta/48/groups_joinable.sql +41 -0
- synapse/storage/schema/main/delta/49/add_user_consent_server_notice_sent.sql +39 -0
- synapse/storage/schema/main/delta/49/add_user_daily_visits.sql +40 -0
- synapse/storage/schema/main/delta/49/add_user_ips_last_seen_only_index.sql +36 -0
- synapse/storage/schema/main/delta/50/add_creation_ts_users_index.sql +38 -0
- synapse/storage/schema/main/delta/50/erasure_store.sql +40 -0
- synapse/storage/schema/main/delta/50/make_event_content_nullable.py +102 -0
- synapse/storage/schema/main/delta/51/e2e_room_keys.sql +58 -0
- synapse/storage/schema/main/delta/51/monthly_active_users.sql +46 -0
- synapse/storage/schema/main/delta/52/add_event_to_state_group_index.sql +38 -0
- synapse/storage/schema/main/delta/52/device_list_streams_unique_idx.sql +55 -0
- synapse/storage/schema/main/delta/52/e2e_room_keys.sql +72 -0
- synapse/storage/schema/main/delta/53/add_user_type_to_users.sql +38 -0
- synapse/storage/schema/main/delta/53/drop_sent_transactions.sql +35 -0
- synapse/storage/schema/main/delta/53/event_format_version.sql +35 -0
- synapse/storage/schema/main/delta/53/user_dir_populate.sql +49 -0
- synapse/storage/schema/main/delta/53/user_ips_index.sql +49 -0
- synapse/storage/schema/main/delta/53/user_share.sql +63 -0
- synapse/storage/schema/main/delta/53/user_threepid_id.sql +48 -0
- synapse/storage/schema/main/delta/53/users_in_public_rooms.sql +47 -0
- synapse/storage/schema/main/delta/54/account_validity_with_renewal.sql +49 -0
- synapse/storage/schema/main/delta/54/add_validity_to_server_keys.sql +42 -0
- synapse/storage/schema/main/delta/54/delete_forward_extremities.sql +42 -0
- synapse/storage/schema/main/delta/54/drop_legacy_tables.sql +49 -0
- synapse/storage/schema/main/delta/54/drop_presence_list.sql +35 -0
- synapse/storage/schema/main/delta/54/relations.sql +46 -0
- synapse/storage/schema/main/delta/54/stats.sql +99 -0
- synapse/storage/schema/main/delta/54/stats2.sql +47 -0
- synapse/storage/schema/main/delta/55/access_token_expiry.sql +37 -0
- synapse/storage/schema/main/delta/55/track_threepid_validations.sql +50 -0
- synapse/storage/schema/main/delta/55/users_alter_deactivated.sql +38 -0
- synapse/storage/schema/main/delta/56/add_spans_to_device_lists.sql +39 -0
- synapse/storage/schema/main/delta/56/current_state_events_membership.sql +41 -0
- synapse/storage/schema/main/delta/56/current_state_events_membership_mk2.sql +43 -0
- synapse/storage/schema/main/delta/56/delete_keys_from_deleted_backups.sql +44 -0
- synapse/storage/schema/main/delta/56/destinations_failure_ts.sql +44 -0
- synapse/storage/schema/main/delta/56/destinations_retry_interval_type.sql.postgres +18 -0
- synapse/storage/schema/main/delta/56/device_stream_id_insert.sql +39 -0
- synapse/storage/schema/main/delta/56/devices_last_seen.sql +43 -0
- synapse/storage/schema/main/delta/56/drop_unused_event_tables.sql +39 -0
- synapse/storage/schema/main/delta/56/event_expiry.sql +40 -0
- synapse/storage/schema/main/delta/56/event_labels.sql +49 -0
- synapse/storage/schema/main/delta/56/event_labels_background_update.sql +36 -0
- synapse/storage/schema/main/delta/56/fix_room_keys_index.sql +37 -0
- synapse/storage/schema/main/delta/56/hidden_devices.sql +37 -0
- synapse/storage/schema/main/delta/56/hidden_devices_fix.sql.sqlite +42 -0
- synapse/storage/schema/main/delta/56/nuke_empty_communities_from_db.sql +48 -0
- synapse/storage/schema/main/delta/56/public_room_list_idx.sql +35 -0
- synapse/storage/schema/main/delta/56/redaction_censor.sql +35 -0
- synapse/storage/schema/main/delta/56/redaction_censor2.sql +41 -0
- synapse/storage/schema/main/delta/56/redaction_censor3_fix_update.sql.postgres +25 -0
- synapse/storage/schema/main/delta/56/redaction_censor4.sql +35 -0
- synapse/storage/schema/main/delta/56/remove_tombstoned_rooms_from_directory.sql +38 -0
- synapse/storage/schema/main/delta/56/room_key_etag.sql +36 -0
- synapse/storage/schema/main/delta/56/room_membership_idx.sql +37 -0
- synapse/storage/schema/main/delta/56/room_retention.sql +52 -0
- synapse/storage/schema/main/delta/56/signing_keys.sql +75 -0
- synapse/storage/schema/main/delta/56/signing_keys_nonunique_signatures.sql +41 -0
- synapse/storage/schema/main/delta/56/stats_separated.sql +175 -0
- synapse/storage/schema/main/delta/56/unique_user_filter_index.py +46 -0
- synapse/storage/schema/main/delta/56/user_external_ids.sql +43 -0
- synapse/storage/schema/main/delta/56/users_in_public_rooms_idx.sql +36 -0
- synapse/storage/schema/main/delta/57/delete_old_current_state_events.sql +41 -0
- synapse/storage/schema/main/delta/57/device_list_remote_cache_stale.sql +44 -0
- synapse/storage/schema/main/delta/57/local_current_membership.py +111 -0
- synapse/storage/schema/main/delta/57/remove_sent_outbound_pokes.sql +40 -0
- synapse/storage/schema/main/delta/57/rooms_version_column.sql +43 -0
- synapse/storage/schema/main/delta/57/rooms_version_column_2.sql.postgres +35 -0
- synapse/storage/schema/main/delta/57/rooms_version_column_2.sql.sqlite +22 -0
- synapse/storage/schema/main/delta/57/rooms_version_column_3.sql.postgres +39 -0
- synapse/storage/schema/main/delta/57/rooms_version_column_3.sql.sqlite +23 -0
- synapse/storage/schema/main/delta/58/02remove_dup_outbound_pokes.sql +41 -0
- synapse/storage/schema/main/delta/58/03persist_ui_auth.sql +55 -0
- synapse/storage/schema/main/delta/58/05cache_instance.sql.postgres +30 -0
- synapse/storage/schema/main/delta/58/06dlols_unique_idx.py +83 -0
- synapse/storage/schema/main/delta/58/07add_method_to_thumbnail_constraint.sql.postgres +33 -0
- synapse/storage/schema/main/delta/58/07add_method_to_thumbnail_constraint.sql.sqlite +44 -0
- synapse/storage/schema/main/delta/58/07persist_ui_auth_ips.sql +44 -0
- synapse/storage/schema/main/delta/58/08_media_safe_from_quarantine.sql.postgres +18 -0
- synapse/storage/schema/main/delta/58/08_media_safe_from_quarantine.sql.sqlite +18 -0
- synapse/storage/schema/main/delta/58/09shadow_ban.sql +37 -0
- synapse/storage/schema/main/delta/58/10_pushrules_enabled_delete_obsolete.sql +47 -0
- synapse/storage/schema/main/delta/58/10drop_local_rejections_stream.sql +41 -0
- synapse/storage/schema/main/delta/58/10federation_pos_instance_name.sql +41 -0
- synapse/storage/schema/main/delta/58/11dehydration.sql +39 -0
- synapse/storage/schema/main/delta/58/11fallback.sql +43 -0
- synapse/storage/schema/main/delta/58/11user_id_seq.py +38 -0
- synapse/storage/schema/main/delta/58/12room_stats.sql +51 -0
- synapse/storage/schema/main/delta/58/13remove_presence_allow_inbound.sql +36 -0
- synapse/storage/schema/main/delta/58/14events_instance_name.sql +35 -0
- synapse/storage/schema/main/delta/58/14events_instance_name.sql.postgres +28 -0
- synapse/storage/schema/main/delta/58/15_catchup_destination_rooms.sql +61 -0
- synapse/storage/schema/main/delta/58/15unread_count.sql +45 -0
- synapse/storage/schema/main/delta/58/16populate_stats_process_rooms_fix.sql +41 -0
- synapse/storage/schema/main/delta/58/17_catchup_last_successful.sql +40 -0
- synapse/storage/schema/main/delta/58/18stream_positions.sql +41 -0
- synapse/storage/schema/main/delta/58/19instance_map.sql.postgres +25 -0
- synapse/storage/schema/main/delta/58/19txn_id.sql +59 -0
- synapse/storage/schema/main/delta/58/20instance_name_event_tables.sql +36 -0
- synapse/storage/schema/main/delta/58/20user_daily_visits.sql +37 -0
- synapse/storage/schema/main/delta/58/21as_device_stream.sql +36 -0
- synapse/storage/schema/main/delta/58/21drop_device_max_stream_id.sql +1 -0
- synapse/storage/schema/main/delta/58/22puppet_token.sql +36 -0
- synapse/storage/schema/main/delta/58/22users_have_local_media.sql +2 -0
- synapse/storage/schema/main/delta/58/23e2e_cross_signing_keys_idx.sql +36 -0
- synapse/storage/schema/main/delta/58/24drop_event_json_index.sql +38 -0
- synapse/storage/schema/main/delta/58/25user_external_ids_user_id_idx.sql +36 -0
- synapse/storage/schema/main/delta/58/26access_token_last_validated.sql +37 -0
- synapse/storage/schema/main/delta/58/27local_invites.sql +37 -0
- synapse/storage/schema/main/delta/58/28drop_last_used_column.sql.postgres +16 -0
- synapse/storage/schema/main/delta/58/28drop_last_used_column.sql.sqlite +62 -0
- synapse/storage/schema/main/delta/59/01ignored_user.py +85 -0
- synapse/storage/schema/main/delta/59/02shard_send_to_device.sql +37 -0
- synapse/storage/schema/main/delta/59/03shard_send_to_device_sequence.sql.postgres +25 -0
- synapse/storage/schema/main/delta/59/04_event_auth_chains.sql +71 -0
- synapse/storage/schema/main/delta/59/04_event_auth_chains.sql.postgres +16 -0
- synapse/storage/schema/main/delta/59/04drop_account_data.sql +36 -0
- synapse/storage/schema/main/delta/59/05cache_invalidation.sql +36 -0
- synapse/storage/schema/main/delta/59/06chain_cover_index.sql +36 -0
- synapse/storage/schema/main/delta/59/06shard_account_data.sql +39 -0
- synapse/storage/schema/main/delta/59/06shard_account_data.sql.postgres +32 -0
- synapse/storage/schema/main/delta/59/07shard_account_data_fix.sql +37 -0
- synapse/storage/schema/main/delta/59/08delete_pushers_for_deactivated_accounts.sql +39 -0
- synapse/storage/schema/main/delta/59/08delete_stale_pushers.sql +39 -0
- synapse/storage/schema/main/delta/59/09rejected_events_metadata.sql +45 -0
- synapse/storage/schema/main/delta/59/10delete_purged_chain_cover.sql +36 -0
- synapse/storage/schema/main/delta/59/11add_knock_members_to_stats.sql +39 -0
- synapse/storage/schema/main/delta/59/11drop_thumbnail_constraint.sql.postgres +22 -0
- synapse/storage/schema/main/delta/59/12account_validity_token_used_ts_ms.sql +37 -0
- synapse/storage/schema/main/delta/59/12presence_stream_instance.sql +37 -0
- synapse/storage/schema/main/delta/59/12presence_stream_instance_seq.sql.postgres +20 -0
- synapse/storage/schema/main/delta/59/13users_to_send_full_presence_to.sql +53 -0
- synapse/storage/schema/main/delta/59/14refresh_tokens.sql +53 -0
- synapse/storage/schema/main/delta/59/15locks.sql +56 -0
- synapse/storage/schema/main/delta/59/16federation_inbound_staging.sql +51 -0
- synapse/storage/schema/main/delta/60/01recreate_stream_ordering.sql.postgres +45 -0
- synapse/storage/schema/main/delta/60/02change_stream_ordering_columns.sql.postgres +30 -0
- synapse/storage/schema/main/delta/61/01change_appservices_txns.sql.postgres +23 -0
- synapse/storage/schema/main/delta/61/01insertion_event_lookups.sql +68 -0
- synapse/storage/schema/main/delta/61/02drop_redundant_room_depth_index.sql +37 -0
- synapse/storage/schema/main/delta/61/03recreate_min_depth.py +74 -0
- synapse/storage/schema/main/delta/62/01insertion_event_extremities.sql +43 -0
- synapse/storage/schema/main/delta/63/01create_registration_tokens.sql +42 -0
- synapse/storage/schema/main/delta/63/02delete_unlinked_email_pushers.sql +39 -0
- synapse/storage/schema/main/delta/63/02populate-rooms-creator.sql +36 -0
- synapse/storage/schema/main/delta/63/03session_store.sql +42 -0
- synapse/storage/schema/main/delta/63/04add_presence_stream_not_offline_index.sql +37 -0
- synapse/storage/schema/main/delta/64/01msc2716_chunk_to_batch_rename.sql.postgres +23 -0
- synapse/storage/schema/main/delta/64/01msc2716_chunk_to_batch_rename.sql.sqlite +37 -0
- synapse/storage/schema/main/delta/65/01msc2716_insertion_event_edges.sql +38 -0
- synapse/storage/schema/main/delta/65/03remove_hidden_devices_from_device_inbox.sql +41 -0
- synapse/storage/schema/main/delta/65/04_local_group_updates.sql +37 -0
- synapse/storage/schema/main/delta/65/05_remove_room_stats_historical_and_user_stats_historical.sql +38 -0
- synapse/storage/schema/main/delta/65/06remove_deleted_devices_from_device_inbox.sql +53 -0
- synapse/storage/schema/main/delta/65/07_arbitrary_relations.sql +37 -0
- synapse/storage/schema/main/delta/65/08_device_inbox_background_updates.sql +37 -0
- synapse/storage/schema/main/delta/65/10_expirable_refresh_tokens.sql +47 -0
- synapse/storage/schema/main/delta/65/11_devices_auth_provider_session.sql +46 -0
- synapse/storage/schema/main/delta/67/01drop_public_room_list_stream.sql +37 -0
- synapse/storage/schema/main/delta/68/01event_columns.sql +45 -0
- synapse/storage/schema/main/delta/68/02_msc2409_add_device_id_appservice_stream_type.sql +40 -0
- synapse/storage/schema/main/delta/68/03_delete_account_data_for_deactivated_accounts.sql +39 -0
- synapse/storage/schema/main/delta/68/04_refresh_tokens_index_next_token_id.sql +47 -0
- synapse/storage/schema/main/delta/68/04partial_state_rooms.sql +60 -0
- synapse/storage/schema/main/delta/68/05_delete_non_strings_from_event_search.sql.sqlite +22 -0
- synapse/storage/schema/main/delta/68/05partial_state_rooms_triggers.py +80 -0
- synapse/storage/schema/main/delta/68/06_msc3202_add_device_list_appservice_stream_type.sql +42 -0
- synapse/storage/schema/main/delta/69/01as_txn_seq.py +54 -0
- synapse/storage/schema/main/delta/69/01device_list_oubound_by_room.sql +57 -0
- synapse/storage/schema/main/delta/69/02cache_invalidation_index.sql +37 -0
- synapse/storage/schema/main/delta/70/01clean_table_purged_rooms.sql +39 -0
- synapse/storage/schema/main/delta/71/01rebuild_event_edges.sql.postgres +43 -0
- synapse/storage/schema/main/delta/71/01rebuild_event_edges.sql.sqlite +47 -0
- synapse/storage/schema/main/delta/71/01remove_noop_background_updates.sql +80 -0
- synapse/storage/schema/main/delta/71/02event_push_summary_unique.sql +37 -0
- synapse/storage/schema/main/delta/72/01add_room_type_to_state_stats.sql +38 -0
- synapse/storage/schema/main/delta/72/01event_push_summary_receipt.sql +54 -0
- synapse/storage/schema/main/delta/72/02event_push_actions_index.sql +38 -0
- synapse/storage/schema/main/delta/72/03bg_populate_events_columns.py +57 -0
- synapse/storage/schema/main/delta/72/03drop_event_reference_hashes.sql +36 -0
- synapse/storage/schema/main/delta/72/03remove_groups.sql +50 -0
- synapse/storage/schema/main/delta/72/04drop_column_application_services_state_last_txn.sql.postgres +17 -0
- synapse/storage/schema/main/delta/72/04drop_column_application_services_state_last_txn.sql.sqlite +40 -0
- synapse/storage/schema/main/delta/72/05receipts_event_stream_ordering.sql +38 -0
- synapse/storage/schema/main/delta/72/05remove_unstable_private_read_receipts.sql +38 -0
- synapse/storage/schema/main/delta/72/06add_consent_ts_to_users.sql +35 -0
- synapse/storage/schema/main/delta/72/06thread_notifications.sql +49 -0
- synapse/storage/schema/main/delta/72/07force_update_current_state_events_membership.py +67 -0
- synapse/storage/schema/main/delta/72/07thread_receipts.sql.postgres +30 -0
- synapse/storage/schema/main/delta/72/07thread_receipts.sql.sqlite +70 -0
- synapse/storage/schema/main/delta/72/08begin_cache_invalidation_seq_at_2.sql.postgres +23 -0
- synapse/storage/schema/main/delta/72/08thread_receipts.sql +39 -0
- synapse/storage/schema/main/delta/72/09partial_indices.sql.sqlite +56 -0
- synapse/storage/schema/main/delta/73/01event_failed_pull_attempts.sql +48 -0
- synapse/storage/schema/main/delta/73/02add_pusher_enabled.sql +35 -0
- synapse/storage/schema/main/delta/73/02room_id_indexes_for_purging.sql +41 -0
- synapse/storage/schema/main/delta/73/03pusher_device_id.sql +39 -0
- synapse/storage/schema/main/delta/73/03users_approved_column.sql +39 -0
- synapse/storage/schema/main/delta/73/04partial_join_details.sql +42 -0
- synapse/storage/schema/main/delta/73/04pending_device_list_updates.sql +47 -0
- synapse/storage/schema/main/delta/73/05old_push_actions.sql.postgres +22 -0
- synapse/storage/schema/main/delta/73/05old_push_actions.sql.sqlite +24 -0
- synapse/storage/schema/main/delta/73/06thread_notifications_thread_id_idx.sql +42 -0
- synapse/storage/schema/main/delta/73/08thread_receipts_non_null.sql.postgres +23 -0
- synapse/storage/schema/main/delta/73/08thread_receipts_non_null.sql.sqlite +76 -0
- synapse/storage/schema/main/delta/73/09partial_joined_via_destination.sql +37 -0
- synapse/storage/schema/main/delta/73/09threads_table.sql +49 -0
- synapse/storage/schema/main/delta/73/10_update_sqlite_fts4_tokenizer.py +71 -0
- synapse/storage/schema/main/delta/73/10login_tokens.sql +54 -0
- synapse/storage/schema/main/delta/73/11event_search_room_id_n_distinct.sql.postgres +33 -0
- synapse/storage/schema/main/delta/73/12refactor_device_list_outbound_pokes.sql +72 -0
- synapse/storage/schema/main/delta/73/13add_device_lists_index.sql +39 -0
- synapse/storage/schema/main/delta/73/20_un_partial_stated_room_stream.sql +51 -0
- synapse/storage/schema/main/delta/73/21_un_partial_stated_room_stream_seq.sql.postgres +20 -0
- synapse/storage/schema/main/delta/73/22_rebuild_user_dir_stats.sql +48 -0
- synapse/storage/schema/main/delta/73/22_un_partial_stated_event_stream.sql +53 -0
- synapse/storage/schema/main/delta/73/23_fix_thread_index.sql +52 -0
- synapse/storage/schema/main/delta/73/23_un_partial_stated_room_stream_seq.sql.postgres +20 -0
- synapse/storage/schema/main/delta/73/24_events_jump_to_date_index.sql +36 -0
- synapse/storage/schema/main/delta/73/25drop_presence.sql +36 -0
- synapse/storage/schema/main/delta/74/01_user_directory_stale_remote_users.sql +58 -0
- synapse/storage/schema/main/delta/74/02_set_device_id_for_pushers_bg_update.sql +38 -0
- synapse/storage/schema/main/delta/74/03_membership_tables_event_stream_ordering.sql.postgres +29 -0
- synapse/storage/schema/main/delta/74/03_membership_tables_event_stream_ordering.sql.sqlite +23 -0
- synapse/storage/schema/main/delta/74/03_room_membership_index.sql +38 -0
- synapse/storage/schema/main/delta/74/04_delete_e2e_backup_keys_for_deactivated_users.sql +36 -0
- synapse/storage/schema/main/delta/74/04_membership_tables_event_stream_ordering_triggers.py +87 -0
- synapse/storage/schema/main/delta/74/05_events_txn_id_device_id.sql +72 -0
- synapse/storage/schema/main/delta/74/90COMMENTS_destinations.sql.postgres +52 -0
- synapse/storage/schema/main/delta/76/01_add_profiles_full_user_id_column.sql +39 -0
- synapse/storage/schema/main/delta/76/02_add_user_filters_full_user_id_column.sql +39 -0
- synapse/storage/schema/main/delta/76/03_per_user_experimental_features.sql +46 -0
- synapse/storage/schema/main/delta/76/04_add_room_forgetter.sql +43 -0
- synapse/storage/schema/main/delta/77/01_add_profiles_not_valid_check.sql.postgres +16 -0
- synapse/storage/schema/main/delta/77/02_add_user_filters_not_valid_check.sql.postgres +16 -0
- synapse/storage/schema/main/delta/77/03bg_populate_full_user_id_profiles.sql +35 -0
- synapse/storage/schema/main/delta/77/04bg_populate_full_user_id_user_filters.sql +35 -0
- synapse/storage/schema/main/delta/77/05thread_notifications_backfill.sql +67 -0
- synapse/storage/schema/main/delta/77/06thread_notifications_not_null.sql.sqlite +102 -0
- synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_actions.sql.postgres +27 -0
- synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_actions_staging.sql.postgres +27 -0
- synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_summary.sql.postgres +29 -0
- synapse/storage/schema/main/delta/77/14bg_indices_event_stream_ordering.sql +39 -0
- synapse/storage/schema/main/delta/78/01_validate_and_update_profiles.py +99 -0
- synapse/storage/schema/main/delta/78/02_validate_and_update_user_filters.py +100 -0
- synapse/storage/schema/main/delta/78/03_remove_unused_indexes_user_filters.py +72 -0
- synapse/storage/schema/main/delta/78/03event_extremities_constraints.py +65 -0
- synapse/storage/schema/main/delta/78/04_add_full_user_id_index_user_filters.py +32 -0
- synapse/storage/schema/main/delta/79/03_read_write_locks_triggers.sql.postgres +102 -0
- synapse/storage/schema/main/delta/79/03_read_write_locks_triggers.sql.sqlite +72 -0
- synapse/storage/schema/main/delta/79/04_mitigate_stream_ordering_update_race.py +70 -0
- synapse/storage/schema/main/delta/79/05_read_write_locks_triggers.sql.postgres +69 -0
- synapse/storage/schema/main/delta/79/05_read_write_locks_triggers.sql.sqlite +65 -0
- synapse/storage/schema/main/delta/80/01_users_alter_locked.sql +35 -0
- synapse/storage/schema/main/delta/80/02_read_write_locks_unlogged.sql.postgres +30 -0
- synapse/storage/schema/main/delta/80/02_scheduled_tasks.sql +47 -0
- synapse/storage/schema/main/delta/80/03_read_write_locks_triggers.sql.postgres +37 -0
- synapse/storage/schema/main/delta/80/04_read_write_locks_deadlock.sql.postgres +71 -0
- synapse/storage/schema/main/delta/82/02_scheduled_tasks_index.sql +35 -0
- synapse/storage/schema/main/delta/82/04_add_indices_for_purging_rooms.sql +39 -0
- synapse/storage/schema/main/delta/82/05gaps.sql +44 -0
- synapse/storage/schema/main/delta/83/01_drop_old_tables.sql +43 -0
- synapse/storage/schema/main/delta/83/03_instance_name_receipts.sql.sqlite +17 -0
- synapse/storage/schema/main/delta/83/05_cross_signing_key_update_grant.sql +34 -0
- synapse/storage/schema/main/delta/83/06_event_push_summary_room.sql +36 -0
- synapse/storage/schema/main/delta/84/01_auth_links_stats.sql.postgres +20 -0
- synapse/storage/schema/main/delta/84/02_auth_links_index.sql +16 -0
- synapse/storage/schema/main/delta/84/03_auth_links_analyze.sql.postgres +16 -0
- synapse/storage/schema/main/delta/84/04_access_token_index.sql +15 -0
- synapse/storage/schema/main/delta/85/01_add_suspended.sql +14 -0
- synapse/storage/schema/main/delta/85/02_add_instance_names.sql +27 -0
- synapse/storage/schema/main/delta/85/03_new_sequences.sql.postgres +54 -0
- synapse/storage/schema/main/delta/85/04_cleanup_device_federation_outbox.sql +15 -0
- synapse/storage/schema/main/delta/85/05_add_instance_names_converted_pos.sql +16 -0
- synapse/storage/schema/main/delta/85/06_add_room_reports.sql +20 -0
- synapse/storage/schema/main/delta/86/01_authenticate_media.sql +15 -0
- synapse/storage/schema/main/delta/86/02_receipts_event_id_index.sql +15 -0
- synapse/storage/schema/main/delta/87/01_sliding_sync_memberships.sql +169 -0
- synapse/storage/schema/main/delta/87/02_per_connection_state.sql +81 -0
- synapse/storage/schema/main/delta/87/03_current_state_index.sql +19 -0
- synapse/storage/schema/main/delta/88/01_add_delayed_events.sql +43 -0
- synapse/storage/schema/main/delta/88/01_custom_profile_fields.sql +15 -0
- synapse/storage/schema/main/delta/88/02_fix_sliding_sync_membership_snapshots_forgotten_column.sql +21 -0
- synapse/storage/schema/main/delta/88/03_add_otk_ts_added_index.sql +18 -0
- synapse/storage/schema/main/delta/88/04_current_state_delta_index.sql +18 -0
- synapse/storage/schema/main/delta/88/05_drop_old_otks.sql.postgres +19 -0
- synapse/storage/schema/main/delta/88/05_drop_old_otks.sql.sqlite +19 -0
- synapse/storage/schema/main/delta/88/05_sliding_sync_room_config_index.sql +20 -0
- synapse/storage/schema/main/delta/88/06_events_received_ts_index.sql +17 -0
- synapse/storage/schema/main/delta/89/01_sliding_sync_membership_snapshot_index.sql +15 -0
- synapse/storage/schema/main/delta/90/01_add_column_participant_room_memberships_table.sql +16 -0
- synapse/storage/schema/main/delta/91/01_media_hash.sql +28 -0
- synapse/storage/schema/main/delta/92/01_remove_trigger.sql.postgres +16 -0
- synapse/storage/schema/main/delta/92/01_remove_trigger.sql.sqlite +16 -0
- synapse/storage/schema/main/delta/92/02_remove_populate_participant_bg_update.sql +17 -0
- synapse/storage/schema/main/delta/92/04_ss_membership_snapshot_idx.sql +16 -0
- synapse/storage/schema/main/delta/92/04_thread_subscriptions.sql +59 -0
- synapse/storage/schema/main/delta/92/04_thread_subscriptions_seq.sql.postgres +19 -0
- synapse/storage/schema/main/delta/92/05_fixup_max_depth_cap.sql +17 -0
- synapse/storage/schema/main/delta/92/05_thread_subscriptions_comments.sql.postgres +18 -0
- synapse/storage/schema/main/delta/92/06_device_federation_inbox_index.sql +16 -0
- synapse/storage/schema/main/delta/92/06_threads_last_sent_stream_ordering_comments.sql.postgres +24 -0
- synapse/storage/schema/main/delta/92/07_add_user_reports.sql +22 -0
- synapse/storage/schema/main/delta/92/07_event_txn_id_device_id_txn_id2.sql +15 -0
- synapse/storage/schema/main/delta/92/08_room_ban_redactions.sql +21 -0
- synapse/storage/schema/main/delta/92/08_thread_subscriptions_seq_fixup.sql.postgres +19 -0
- synapse/storage/schema/main/delta/92/09_thread_subscriptions_update.sql +20 -0
- synapse/storage/schema/main/delta/92/09_thread_subscriptions_update.sql.postgres +18 -0
- synapse/storage/schema/main/full_schemas/72/full.sql.postgres +1344 -0
- synapse/storage/schema/main/full_schemas/72/full.sql.sqlite +646 -0
- synapse/storage/schema/state/delta/23/drop_state_index.sql +35 -0
- synapse/storage/schema/state/delta/32/remove_state_indices.sql +38 -0
- synapse/storage/schema/state/delta/35/add_state_index.sql +36 -0
- synapse/storage/schema/state/delta/35/state.sql +41 -0
- synapse/storage/schema/state/delta/35/state_dedupe.sql +36 -0
- synapse/storage/schema/state/delta/47/state_group_seq.py +38 -0
- synapse/storage/schema/state/delta/56/state_group_room_idx.sql +36 -0
- synapse/storage/schema/state/delta/61/02state_groups_state_n_distinct.sql.postgres +34 -0
- synapse/storage/schema/state/delta/70/08_state_group_edges_unique.sql +36 -0
- synapse/storage/schema/state/delta/89/01_state_groups_deletion.sql +39 -0
- synapse/storage/schema/state/delta/90/02_delete_unreferenced_state_groups.sql +16 -0
- synapse/storage/schema/state/delta/90/03_remove_old_deletion_bg_update.sql +15 -0
- synapse/storage/schema/state/full_schemas/72/full.sql.postgres +30 -0
- synapse/storage/schema/state/full_schemas/72/full.sql.sqlite +20 -0
- synapse/storage/types.py +185 -0
- synapse/storage/util/__init__.py +20 -0
- synapse/storage/util/id_generators.py +909 -0
- synapse/storage/util/partial_state_events_tracker.py +194 -0
- synapse/storage/util/sequence.py +315 -0
- synapse/streams/__init__.py +43 -0
- synapse/streams/config.py +92 -0
- synapse/streams/events.py +203 -0
- synapse/synapse_rust/__init__.pyi +3 -0
- synapse/synapse_rust/acl.pyi +20 -0
- synapse/synapse_rust/events.pyi +136 -0
- synapse/synapse_rust/http_client.pyi +32 -0
- synapse/synapse_rust/push.pyi +86 -0
- synapse/synapse_rust/rendezvous.pyi +30 -0
- synapse/synapse_rust/segmenter.pyi +1 -0
- synapse/synapse_rust.abi3.so +0 -0
- synapse/types/__init__.py +1600 -0
- synapse/types/handlers/__init__.py +93 -0
- synapse/types/handlers/policy_server.py +16 -0
- synapse/types/handlers/sliding_sync.py +909 -0
- synapse/types/rest/__init__.py +25 -0
- synapse/types/rest/client/__init__.py +415 -0
- synapse/types/state.py +635 -0
- synapse/types/storage/__init__.py +66 -0
- synapse/util/__init__.py +170 -0
- synapse/util/async_helpers.py +1067 -0
- synapse/util/batching_queue.py +202 -0
- synapse/util/caches/__init__.py +300 -0
- synapse/util/caches/cached_call.py +143 -0
- synapse/util/caches/deferred_cache.py +530 -0
- synapse/util/caches/descriptors.py +694 -0
- synapse/util/caches/dictionary_cache.py +350 -0
- synapse/util/caches/expiringcache.py +251 -0
- synapse/util/caches/lrucache.py +977 -0
- synapse/util/caches/response_cache.py +323 -0
- synapse/util/caches/stream_change_cache.py +370 -0
- synapse/util/caches/treecache.py +189 -0
- synapse/util/caches/ttlcache.py +197 -0
- synapse/util/cancellation.py +63 -0
- synapse/util/check_dependencies.py +335 -0
- synapse/util/clock.py +500 -0
- synapse/util/constants.py +22 -0
- synapse/util/daemonize.py +165 -0
- synapse/util/distributor.py +159 -0
- synapse/util/events.py +134 -0
- synapse/util/file_consumer.py +164 -0
- synapse/util/frozenutils.py +57 -0
- synapse/util/gai_resolver.py +180 -0
- synapse/util/hash.py +38 -0
- synapse/util/httpresourcetree.py +108 -0
- synapse/util/iterutils.py +189 -0
- synapse/util/json.py +56 -0
- synapse/util/linked_list.py +156 -0
- synapse/util/logcontext.py +46 -0
- synapse/util/logformatter.py +28 -0
- synapse/util/macaroons.py +325 -0
- synapse/util/manhole.py +191 -0
- synapse/util/metrics.py +340 -0
- synapse/util/module_loader.py +116 -0
- synapse/util/msisdn.py +51 -0
- synapse/util/patch_inline_callbacks.py +250 -0
- synapse/util/pydantic_models.py +56 -0
- synapse/util/ratelimitutils.py +420 -0
- synapse/util/retryutils.py +339 -0
- synapse/util/rlimit.py +42 -0
- synapse/util/rust.py +134 -0
- synapse/util/sentinel.py +21 -0
- synapse/util/stringutils.py +293 -0
- synapse/util/task_scheduler.py +493 -0
- synapse/util/templates.py +126 -0
- synapse/util/threepids.py +123 -0
- synapse/util/wheel_timer.py +112 -0
- synapse/visibility.py +836 -0
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
#
|
|
2
|
+
# This file is licensed under the Affero General Public License (AGPL) version 3.
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2023 New Vector, Ltd
|
|
5
|
+
#
|
|
6
|
+
# This program is free software: you can redistribute it and/or modify
|
|
7
|
+
# it under the terms of the GNU Affero General Public License as
|
|
8
|
+
# published by the Free Software Foundation, either version 3 of the
|
|
9
|
+
# License, or (at your option) any later version.
|
|
10
|
+
#
|
|
11
|
+
# See the GNU Affero General Public License for more details:
|
|
12
|
+
# <https://www.gnu.org/licenses/agpl-3.0.html>.
|
|
13
|
+
#
|
|
14
|
+
# Originally licensed under the Apache License, Version 2.0:
|
|
15
|
+
# <http://www.apache.org/licenses/LICENSE-2.0>.
|
|
16
|
+
#
|
|
17
|
+
# [This file includes modifications made by New Vector Limited]
|
|
18
|
+
#
|
|
19
|
+
#
|
|
20
|
+
|
|
21
|
+
import logging
|
|
22
|
+
import threading
|
|
23
|
+
from contextlib import contextmanager, nullcontext
|
|
24
|
+
from functools import wraps
|
|
25
|
+
from types import TracebackType
|
|
26
|
+
from typing import (
|
|
27
|
+
TYPE_CHECKING,
|
|
28
|
+
Any,
|
|
29
|
+
Awaitable,
|
|
30
|
+
Callable,
|
|
31
|
+
ContextManager,
|
|
32
|
+
Generator,
|
|
33
|
+
Iterable,
|
|
34
|
+
Optional,
|
|
35
|
+
Protocol,
|
|
36
|
+
TypeVar,
|
|
37
|
+
Union,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
from prometheus_client import Metric
|
|
41
|
+
from prometheus_client.core import REGISTRY, Counter, Gauge
|
|
42
|
+
from typing_extensions import Concatenate, ParamSpec
|
|
43
|
+
|
|
44
|
+
from twisted.internet import defer
|
|
45
|
+
|
|
46
|
+
from synapse.logging.context import (
|
|
47
|
+
ContextResourceUsage,
|
|
48
|
+
LoggingContext,
|
|
49
|
+
PreserveLoggingContext,
|
|
50
|
+
)
|
|
51
|
+
from synapse.logging.opentracing import (
|
|
52
|
+
SynapseTags,
|
|
53
|
+
active_span,
|
|
54
|
+
start_active_span,
|
|
55
|
+
start_active_span_follows_from,
|
|
56
|
+
)
|
|
57
|
+
from synapse.metrics import SERVER_NAME_LABEL
|
|
58
|
+
from synapse.metrics._types import Collector
|
|
59
|
+
|
|
60
|
+
if TYPE_CHECKING:
|
|
61
|
+
import resource
|
|
62
|
+
|
|
63
|
+
# Old versions don't have `LiteralString`
|
|
64
|
+
from typing_extensions import LiteralString
|
|
65
|
+
|
|
66
|
+
from synapse.server import HomeServer
|
|
67
|
+
|
|
68
|
+
try:
|
|
69
|
+
import opentracing
|
|
70
|
+
except ImportError:
|
|
71
|
+
opentracing = None # type: ignore[assignment]
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
logger = logging.getLogger(__name__)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
_background_process_start_count = Counter(
|
|
78
|
+
"synapse_background_process_start_count",
|
|
79
|
+
"Number of background processes started",
|
|
80
|
+
labelnames=["name", SERVER_NAME_LABEL],
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
_background_process_in_flight_count = Gauge(
|
|
84
|
+
"synapse_background_process_in_flight_count",
|
|
85
|
+
"Number of background processes in flight",
|
|
86
|
+
labelnames=["name", SERVER_NAME_LABEL],
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
# we set registry=None in all of these to stop them getting registered with
|
|
90
|
+
# the default registry. Instead we collect them all via the CustomCollector,
|
|
91
|
+
# which ensures that we can update them before they are collected.
|
|
92
|
+
#
|
|
93
|
+
_background_process_ru_utime = Counter(
|
|
94
|
+
"synapse_background_process_ru_utime_seconds",
|
|
95
|
+
"User CPU time used by background processes, in seconds",
|
|
96
|
+
labelnames=["name", SERVER_NAME_LABEL],
|
|
97
|
+
registry=None,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
_background_process_ru_stime = Counter(
|
|
101
|
+
"synapse_background_process_ru_stime_seconds",
|
|
102
|
+
"System CPU time used by background processes, in seconds",
|
|
103
|
+
labelnames=["name", SERVER_NAME_LABEL],
|
|
104
|
+
registry=None,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
_background_process_db_txn_count = Counter(
|
|
108
|
+
"synapse_background_process_db_txn_count",
|
|
109
|
+
"Number of database transactions done by background processes",
|
|
110
|
+
labelnames=["name", SERVER_NAME_LABEL],
|
|
111
|
+
registry=None,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
_background_process_db_txn_duration = Counter(
|
|
115
|
+
"synapse_background_process_db_txn_duration_seconds",
|
|
116
|
+
(
|
|
117
|
+
"Seconds spent by background processes waiting for database "
|
|
118
|
+
"transactions, excluding scheduling time"
|
|
119
|
+
),
|
|
120
|
+
labelnames=["name", SERVER_NAME_LABEL],
|
|
121
|
+
registry=None,
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
_background_process_db_sched_duration = Counter(
|
|
125
|
+
"synapse_background_process_db_sched_duration_seconds",
|
|
126
|
+
"Seconds spent by background processes waiting for database connections",
|
|
127
|
+
labelnames=["name", SERVER_NAME_LABEL],
|
|
128
|
+
registry=None,
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
# map from description to a counter, so that we can name our logcontexts
|
|
132
|
+
# incrementally. (It actually duplicates _background_process_start_count, but
|
|
133
|
+
# it's much simpler to do so than to try to combine them.)
|
|
134
|
+
_background_process_counts: dict[str, int] = {}
|
|
135
|
+
|
|
136
|
+
# Set of all running background processes that became active active since the
|
|
137
|
+
# last time metrics were scraped (i.e. background processes that performed some
|
|
138
|
+
# work since the last scrape.)
|
|
139
|
+
#
|
|
140
|
+
# We do it like this to handle the case where we have a large number of
|
|
141
|
+
# background processes stacking up behind a lock or linearizer, where we then
|
|
142
|
+
# only need to iterate over and update metrics for the process that have
|
|
143
|
+
# actually been active and can ignore the idle ones.
|
|
144
|
+
_background_processes_active_since_last_scrape: "set[_BackgroundProcess]" = set()
|
|
145
|
+
|
|
146
|
+
# A lock that covers the above set and dict
|
|
147
|
+
_bg_metrics_lock = threading.Lock()
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
class _Collector(Collector):
|
|
151
|
+
"""A custom metrics collector for the background process metrics.
|
|
152
|
+
|
|
153
|
+
Ensures that all of the metrics are up-to-date with any in-flight processes
|
|
154
|
+
before they are returned.
|
|
155
|
+
"""
|
|
156
|
+
|
|
157
|
+
def collect(self) -> Iterable[Metric]:
|
|
158
|
+
global _background_processes_active_since_last_scrape
|
|
159
|
+
|
|
160
|
+
# We swap out the _background_processes set with an empty one so that
|
|
161
|
+
# we can safely iterate over the set without holding the lock.
|
|
162
|
+
with _bg_metrics_lock:
|
|
163
|
+
_background_processes_copy = _background_processes_active_since_last_scrape
|
|
164
|
+
_background_processes_active_since_last_scrape = set()
|
|
165
|
+
|
|
166
|
+
for process in _background_processes_copy:
|
|
167
|
+
process.update_metrics()
|
|
168
|
+
|
|
169
|
+
# now we need to run collect() over each of the static Counters, and
|
|
170
|
+
# yield each metric they return.
|
|
171
|
+
for m in (
|
|
172
|
+
_background_process_ru_utime,
|
|
173
|
+
_background_process_ru_stime,
|
|
174
|
+
_background_process_db_txn_count,
|
|
175
|
+
_background_process_db_txn_duration,
|
|
176
|
+
_background_process_db_sched_duration,
|
|
177
|
+
):
|
|
178
|
+
yield from m.collect()
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
# The `SERVER_NAME_LABEL` is included in the individual metrics added to this registry,
|
|
182
|
+
# so we don't need to worry about it on the collector itself.
|
|
183
|
+
REGISTRY.register(_Collector()) # type: ignore[missing-server-name-label]
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
class _BackgroundProcess:
|
|
187
|
+
def __init__(self, *, desc: str, server_name: str, ctx: LoggingContext):
|
|
188
|
+
self.desc = desc
|
|
189
|
+
self.server_name = server_name
|
|
190
|
+
self._context = ctx
|
|
191
|
+
self._reported_stats: Optional[ContextResourceUsage] = None
|
|
192
|
+
|
|
193
|
+
def update_metrics(self) -> None:
|
|
194
|
+
"""Updates the metrics with values from this process."""
|
|
195
|
+
new_stats = self._context.get_resource_usage()
|
|
196
|
+
if self._reported_stats is None:
|
|
197
|
+
diff = new_stats
|
|
198
|
+
else:
|
|
199
|
+
diff = new_stats - self._reported_stats
|
|
200
|
+
self._reported_stats = new_stats
|
|
201
|
+
|
|
202
|
+
# For unknown reasons, the difference in times can be negative. See comment in
|
|
203
|
+
# synapse.http.request_metrics.RequestMetrics.update_metrics.
|
|
204
|
+
_background_process_ru_utime.labels(
|
|
205
|
+
name=self.desc, **{SERVER_NAME_LABEL: self.server_name}
|
|
206
|
+
).inc(max(diff.ru_utime, 0))
|
|
207
|
+
_background_process_ru_stime.labels(
|
|
208
|
+
name=self.desc, **{SERVER_NAME_LABEL: self.server_name}
|
|
209
|
+
).inc(max(diff.ru_stime, 0))
|
|
210
|
+
_background_process_db_txn_count.labels(
|
|
211
|
+
name=self.desc, **{SERVER_NAME_LABEL: self.server_name}
|
|
212
|
+
).inc(diff.db_txn_count)
|
|
213
|
+
_background_process_db_txn_duration.labels(
|
|
214
|
+
name=self.desc, **{SERVER_NAME_LABEL: self.server_name}
|
|
215
|
+
).inc(diff.db_txn_duration_sec)
|
|
216
|
+
_background_process_db_sched_duration.labels(
|
|
217
|
+
name=self.desc, **{SERVER_NAME_LABEL: self.server_name}
|
|
218
|
+
).inc(diff.db_sched_duration_sec)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
R = TypeVar("R")
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def run_as_background_process(
|
|
225
|
+
desc: "LiteralString",
|
|
226
|
+
server_name: str,
|
|
227
|
+
func: Callable[..., Awaitable[Optional[R]]],
|
|
228
|
+
*args: Any,
|
|
229
|
+
bg_start_span: bool = True,
|
|
230
|
+
test_only_tracer: Optional["opentracing.Tracer"] = None,
|
|
231
|
+
**kwargs: Any,
|
|
232
|
+
) -> "defer.Deferred[Optional[R]]":
|
|
233
|
+
"""Run the given function in its own logcontext, with resource metrics
|
|
234
|
+
|
|
235
|
+
This should be used to wrap processes which are fired off to run in the
|
|
236
|
+
background, instead of being associated with a particular request.
|
|
237
|
+
|
|
238
|
+
It returns a Deferred which completes when the function completes, but it doesn't
|
|
239
|
+
follow the synapse logcontext rules, which makes it appropriate for passing to
|
|
240
|
+
clock.looping_call and friends (or for firing-and-forgetting in the middle of a
|
|
241
|
+
normal synapse async function).
|
|
242
|
+
|
|
243
|
+
Because the returned Deferred does not follow the synapse logcontext rules, awaiting
|
|
244
|
+
the result of this function will result in the log context being cleared (bad). In
|
|
245
|
+
order to properly await the result of this function and maintain the current log
|
|
246
|
+
context, use `make_deferred_yieldable`.
|
|
247
|
+
|
|
248
|
+
Args:
|
|
249
|
+
desc: a description for this background process type
|
|
250
|
+
server_name: The homeserver name that this background process is being run for
|
|
251
|
+
(this should be `hs.hostname`).
|
|
252
|
+
func: a function, which may return a Deferred or a coroutine
|
|
253
|
+
bg_start_span: Whether to start an opentracing span. Defaults to True.
|
|
254
|
+
Should only be disabled for processes that will not log to or tag
|
|
255
|
+
a span.
|
|
256
|
+
test_only_tracer: Set the OpenTracing tracer to use. This is only useful for
|
|
257
|
+
tests.
|
|
258
|
+
args: positional args for func
|
|
259
|
+
kwargs: keyword args for func
|
|
260
|
+
|
|
261
|
+
Returns:
|
|
262
|
+
Deferred which returns the result of func, or `None` if func raises.
|
|
263
|
+
Note that the returned Deferred does not follow the synapse logcontext
|
|
264
|
+
rules.
|
|
265
|
+
"""
|
|
266
|
+
|
|
267
|
+
# Since we track the tracing scope in the `LoggingContext`, before we move to the
|
|
268
|
+
# sentinel logcontext (or a new `LoggingContext`), grab the currently active
|
|
269
|
+
# tracing span (if any) so that we can create a cross-link to the background process
|
|
270
|
+
# trace.
|
|
271
|
+
original_active_tracing_span = active_span(tracer=test_only_tracer)
|
|
272
|
+
|
|
273
|
+
async def run() -> Optional[R]:
|
|
274
|
+
with _bg_metrics_lock:
|
|
275
|
+
count = _background_process_counts.get(desc, 0)
|
|
276
|
+
_background_process_counts[desc] = count + 1
|
|
277
|
+
|
|
278
|
+
_background_process_start_count.labels(
|
|
279
|
+
name=desc, **{SERVER_NAME_LABEL: server_name}
|
|
280
|
+
).inc()
|
|
281
|
+
_background_process_in_flight_count.labels(
|
|
282
|
+
name=desc, **{SERVER_NAME_LABEL: server_name}
|
|
283
|
+
).inc()
|
|
284
|
+
|
|
285
|
+
with BackgroundProcessLoggingContext(
|
|
286
|
+
name=desc, server_name=server_name, instance_id=count
|
|
287
|
+
) as logging_context:
|
|
288
|
+
try:
|
|
289
|
+
if bg_start_span:
|
|
290
|
+
# If there is already an active span (e.g. because this background
|
|
291
|
+
# process was started as part of handling a request for example),
|
|
292
|
+
# because this is a long-running background task that may serve a
|
|
293
|
+
# broader purpose than the request that kicked it off, we don't want
|
|
294
|
+
# it to be a direct child of the currently active trace connected to
|
|
295
|
+
# the request. We only want a loose reference to jump between the
|
|
296
|
+
# traces.
|
|
297
|
+
#
|
|
298
|
+
# For example, when making a `/messages` request, when approaching a
|
|
299
|
+
# gap, we may kick off a background process to fetch missing events
|
|
300
|
+
# from federation. The `/messages` request trace should't include
|
|
301
|
+
# the entire time taken and details around fetching the missing
|
|
302
|
+
# events since the request doesn't rely on the result, it was just
|
|
303
|
+
# part of the heuristic to initiate things.
|
|
304
|
+
#
|
|
305
|
+
# We don't care about the value from the context manager as it's not
|
|
306
|
+
# used (so we just use `Any` for the type). Ideally, we'd be able to
|
|
307
|
+
# mark this as unused like an `assert_never` of sorts.
|
|
308
|
+
tracing_scope: ContextManager[Any]
|
|
309
|
+
if original_active_tracing_span is not None:
|
|
310
|
+
# With the OpenTracing client that we're using, it's impossible to
|
|
311
|
+
# create a disconnected root span while also providing `references`
|
|
312
|
+
# so we first create a bare root span, then create a child span that
|
|
313
|
+
# includes the references that we want.
|
|
314
|
+
root_tracing_scope = start_active_span(
|
|
315
|
+
f"bgproc.{desc}",
|
|
316
|
+
tags={SynapseTags.REQUEST_ID: str(logging_context)},
|
|
317
|
+
# Create a root span for the background process (disconnected
|
|
318
|
+
# from other spans)
|
|
319
|
+
ignore_active_span=True,
|
|
320
|
+
tracer=test_only_tracer,
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
# Also add a span in the original request trace that cross-links
|
|
324
|
+
# to background process trace. We immediately finish the span as
|
|
325
|
+
# this is just a marker to follow where the real work is being
|
|
326
|
+
# done.
|
|
327
|
+
#
|
|
328
|
+
# In OpenTracing, `FOLLOWS_FROM` indicates parent-child
|
|
329
|
+
# relationship whereas we just want a cross-link to the
|
|
330
|
+
# downstream trace. This is a bit hacky, but the closest we
|
|
331
|
+
# can get to in OpenTracing land. If we ever migrate to
|
|
332
|
+
# OpenTelemetry, we should use a normal `Link` for this.
|
|
333
|
+
with start_active_span_follows_from(
|
|
334
|
+
f"start_bgproc.{desc}",
|
|
335
|
+
child_of=original_active_tracing_span,
|
|
336
|
+
ignore_active_span=True,
|
|
337
|
+
# Create the `FOLLOWS_FROM` reference to the background
|
|
338
|
+
# process span so there is a loose coupling between the two
|
|
339
|
+
# traces and it's easy to jump between.
|
|
340
|
+
contexts=[root_tracing_scope.span.context],
|
|
341
|
+
tracer=test_only_tracer,
|
|
342
|
+
):
|
|
343
|
+
pass
|
|
344
|
+
|
|
345
|
+
# Then start the tracing scope that we're going to use for
|
|
346
|
+
# the duration of the background process within the root
|
|
347
|
+
# span we just created.
|
|
348
|
+
child_tracing_scope = start_active_span_follows_from(
|
|
349
|
+
f"bgproc_child.{desc}",
|
|
350
|
+
child_of=root_tracing_scope.span,
|
|
351
|
+
ignore_active_span=True,
|
|
352
|
+
tags={SynapseTags.REQUEST_ID: str(logging_context)},
|
|
353
|
+
# Create the `FOLLOWS_FROM` reference to the request's
|
|
354
|
+
# span so there is a loose coupling between the two
|
|
355
|
+
# traces and it's easy to jump between.
|
|
356
|
+
contexts=[original_active_tracing_span.context],
|
|
357
|
+
tracer=test_only_tracer,
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
# For easy usage down below, we create a context manager that
|
|
361
|
+
# combines both scopes.
|
|
362
|
+
@contextmanager
|
|
363
|
+
def combined_context_manager() -> Generator[None, None, None]:
|
|
364
|
+
with root_tracing_scope, child_tracing_scope:
|
|
365
|
+
yield
|
|
366
|
+
|
|
367
|
+
tracing_scope = combined_context_manager()
|
|
368
|
+
|
|
369
|
+
else:
|
|
370
|
+
# Otherwise, when there is no active span, we will be creating
|
|
371
|
+
# a disconnected root span already and we don't have to
|
|
372
|
+
# worry about cross-linking to anything.
|
|
373
|
+
tracing_scope = start_active_span(
|
|
374
|
+
f"bgproc.{desc}",
|
|
375
|
+
tags={SynapseTags.REQUEST_ID: str(logging_context)},
|
|
376
|
+
tracer=test_only_tracer,
|
|
377
|
+
)
|
|
378
|
+
else:
|
|
379
|
+
tracing_scope = nullcontext()
|
|
380
|
+
|
|
381
|
+
with tracing_scope:
|
|
382
|
+
return await func(*args, **kwargs)
|
|
383
|
+
except Exception:
|
|
384
|
+
logger.exception(
|
|
385
|
+
"Background process '%s' threw an exception",
|
|
386
|
+
desc,
|
|
387
|
+
)
|
|
388
|
+
return None
|
|
389
|
+
finally:
|
|
390
|
+
_background_process_in_flight_count.labels(
|
|
391
|
+
name=desc, **{SERVER_NAME_LABEL: server_name}
|
|
392
|
+
).dec()
|
|
393
|
+
|
|
394
|
+
# To explain how the log contexts work here:
|
|
395
|
+
# - When `run_as_background_process` is called, the current context is stored
|
|
396
|
+
# (using `PreserveLoggingContext`), we kick off the background task, and we
|
|
397
|
+
# restore the original context before returning (also part of
|
|
398
|
+
# `PreserveLoggingContext`).
|
|
399
|
+
# - The background task runs in its own new logcontext named after `desc`
|
|
400
|
+
# - When the background task finishes, we don't want to leak our background context
|
|
401
|
+
# into the reactor which would erroneously get attached to the next operation
|
|
402
|
+
# picked up by the event loop. We use `PreserveLoggingContext` to set the
|
|
403
|
+
# `sentinel` context and means the new `BackgroundProcessLoggingContext` will
|
|
404
|
+
# remember the `sentinel` context as its previous context to return to when it
|
|
405
|
+
# exits and yields control back to the reactor.
|
|
406
|
+
#
|
|
407
|
+
# TODO: Why can't we simplify to using `return run_in_background(run)`?
|
|
408
|
+
with PreserveLoggingContext():
|
|
409
|
+
# Note that we return a Deferred here so that it can be used in a
|
|
410
|
+
# looping_call and other places that expect a Deferred.
|
|
411
|
+
return defer.ensureDeferred(run())
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
P = ParamSpec("P")
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
class HasHomeServer(Protocol):
|
|
418
|
+
hs: "HomeServer"
|
|
419
|
+
"""
|
|
420
|
+
The homeserver that this cache is associated with (used to label the metric and
|
|
421
|
+
track backgroun processes for clean shutdown).
|
|
422
|
+
"""
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
def wrap_as_background_process(
|
|
426
|
+
desc: "LiteralString",
|
|
427
|
+
) -> Callable[
|
|
428
|
+
[Callable[P, Awaitable[Optional[R]]]],
|
|
429
|
+
Callable[P, "defer.Deferred[Optional[R]]"],
|
|
430
|
+
]:
|
|
431
|
+
"""Decorator that wraps an asynchronous function `func`, returning a synchronous
|
|
432
|
+
decorated function. Calling the decorated version runs `func` as a background
|
|
433
|
+
process, forwarding all arguments verbatim.
|
|
434
|
+
|
|
435
|
+
That is,
|
|
436
|
+
|
|
437
|
+
@wrap_as_background_process
|
|
438
|
+
def func(*args): ...
|
|
439
|
+
func(1, 2, third=3)
|
|
440
|
+
|
|
441
|
+
is equivalent to:
|
|
442
|
+
|
|
443
|
+
def func(*args): ...
|
|
444
|
+
run_as_background_process(func, 1, 2, third=3)
|
|
445
|
+
|
|
446
|
+
The former can be convenient if `func` needs to be run as a background process in
|
|
447
|
+
multiple places.
|
|
448
|
+
"""
|
|
449
|
+
|
|
450
|
+
def wrapper(
|
|
451
|
+
func: Callable[Concatenate[HasHomeServer, P], Awaitable[Optional[R]]],
|
|
452
|
+
) -> Callable[P, "defer.Deferred[Optional[R]]"]:
|
|
453
|
+
@wraps(func)
|
|
454
|
+
def wrapped_func(
|
|
455
|
+
self: HasHomeServer, *args: P.args, **kwargs: P.kwargs
|
|
456
|
+
) -> "defer.Deferred[Optional[R]]":
|
|
457
|
+
assert self.hs is not None, (
|
|
458
|
+
"The `hs` attribute must be set on the object where `@wrap_as_background_process` decorator is used."
|
|
459
|
+
)
|
|
460
|
+
|
|
461
|
+
return self.hs.run_as_background_process(
|
|
462
|
+
desc,
|
|
463
|
+
func,
|
|
464
|
+
self,
|
|
465
|
+
*args,
|
|
466
|
+
**kwargs,
|
|
467
|
+
)
|
|
468
|
+
|
|
469
|
+
# There are some shenanigans here, because we're decorating a method but
|
|
470
|
+
# explicitly making use of the `self` parameter. The key thing here is that the
|
|
471
|
+
# return type within the return type for `measure_func` itself describes how the
|
|
472
|
+
# decorated function will be called.
|
|
473
|
+
return wrapped_func # type: ignore[return-value]
|
|
474
|
+
|
|
475
|
+
return wrapper # type: ignore[return-value]
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
class BackgroundProcessLoggingContext(LoggingContext):
|
|
479
|
+
"""A logging context that tracks in flight metrics for background
|
|
480
|
+
processes.
|
|
481
|
+
"""
|
|
482
|
+
|
|
483
|
+
__slots__ = ["_proc"]
|
|
484
|
+
|
|
485
|
+
def __init__(
|
|
486
|
+
self,
|
|
487
|
+
*,
|
|
488
|
+
name: str,
|
|
489
|
+
server_name: str,
|
|
490
|
+
instance_id: Optional[Union[int, str]] = None,
|
|
491
|
+
):
|
|
492
|
+
"""
|
|
493
|
+
|
|
494
|
+
Args:
|
|
495
|
+
name: The name of the background process. Each distinct `name` gets a
|
|
496
|
+
separate prometheus time series.
|
|
497
|
+
server_name: The homeserver name that this background process is being run for
|
|
498
|
+
(this should be `hs.hostname`).
|
|
499
|
+
instance_id: an identifer to add to `name` to distinguish this instance of
|
|
500
|
+
the named background process in the logs. If this is `None`, one is
|
|
501
|
+
made up based on id(self).
|
|
502
|
+
"""
|
|
503
|
+
if instance_id is None:
|
|
504
|
+
instance_id = id(self)
|
|
505
|
+
super().__init__(name="%s-%s" % (name, instance_id), server_name=server_name)
|
|
506
|
+
self._proc: Optional[_BackgroundProcess] = _BackgroundProcess(
|
|
507
|
+
desc=name, server_name=server_name, ctx=self
|
|
508
|
+
)
|
|
509
|
+
|
|
510
|
+
def start(self, rusage: "Optional[resource.struct_rusage]") -> None:
|
|
511
|
+
"""Log context has started running (again)."""
|
|
512
|
+
|
|
513
|
+
super().start(rusage)
|
|
514
|
+
|
|
515
|
+
if self._proc is None:
|
|
516
|
+
logger.error(
|
|
517
|
+
"Background process re-entered without a proc: %s",
|
|
518
|
+
self.name,
|
|
519
|
+
stack_info=True,
|
|
520
|
+
)
|
|
521
|
+
return
|
|
522
|
+
|
|
523
|
+
# We've become active again so we make sure we're in the list of active
|
|
524
|
+
# procs. (Note that "start" here means we've become active, as opposed
|
|
525
|
+
# to starting for the first time.)
|
|
526
|
+
with _bg_metrics_lock:
|
|
527
|
+
_background_processes_active_since_last_scrape.add(self._proc)
|
|
528
|
+
|
|
529
|
+
def __exit__(
|
|
530
|
+
self,
|
|
531
|
+
type: Optional[type[BaseException]],
|
|
532
|
+
value: Optional[BaseException],
|
|
533
|
+
traceback: Optional[TracebackType],
|
|
534
|
+
) -> None:
|
|
535
|
+
"""Log context has finished."""
|
|
536
|
+
|
|
537
|
+
super().__exit__(type, value, traceback)
|
|
538
|
+
|
|
539
|
+
if self._proc is None:
|
|
540
|
+
logger.error(
|
|
541
|
+
"Background process exited without a proc: %s",
|
|
542
|
+
self.name,
|
|
543
|
+
stack_info=True,
|
|
544
|
+
)
|
|
545
|
+
return
|
|
546
|
+
|
|
547
|
+
# The background process has finished. We explicitly remove and manually
|
|
548
|
+
# update the metrics here so that if nothing is scraping metrics the set
|
|
549
|
+
# doesn't infinitely grow.
|
|
550
|
+
with _bg_metrics_lock:
|
|
551
|
+
_background_processes_active_since_last_scrape.discard(self._proc)
|
|
552
|
+
|
|
553
|
+
self._proc.update_metrics()
|
|
554
|
+
|
|
555
|
+
# Set proc to None to break the reference cycle.
|
|
556
|
+
self._proc = None
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#
|
|
2
|
+
# This file is licensed under the Affero General Public License (AGPL) version 3.
|
|
3
|
+
#
|
|
4
|
+
# Copyright 2022 The Matrix.org Foundation C.I.C
|
|
5
|
+
# Copyright (C) 2023 New Vector, Ltd
|
|
6
|
+
#
|
|
7
|
+
# This program is free software: you can redistribute it and/or modify
|
|
8
|
+
# it under the terms of the GNU Affero General Public License as
|
|
9
|
+
# published by the Free Software Foundation, either version 3 of the
|
|
10
|
+
# License, or (at your option) any later version.
|
|
11
|
+
#
|
|
12
|
+
# See the GNU Affero General Public License for more details:
|
|
13
|
+
# <https://www.gnu.org/licenses/agpl-3.0.html>.
|
|
14
|
+
#
|
|
15
|
+
# Originally licensed under the Apache License, Version 2.0:
|
|
16
|
+
# <http://www.apache.org/licenses/LICENSE-2.0>.
|
|
17
|
+
#
|
|
18
|
+
# [This file includes modifications made by New Vector Limited]
|
|
19
|
+
#
|
|
20
|
+
#
|
|
21
|
+
from typing import TYPE_CHECKING
|
|
22
|
+
|
|
23
|
+
import attr
|
|
24
|
+
|
|
25
|
+
from synapse.metrics import SERVER_NAME_LABEL
|
|
26
|
+
|
|
27
|
+
if TYPE_CHECKING:
|
|
28
|
+
from synapse.server import HomeServer
|
|
29
|
+
|
|
30
|
+
from prometheus_client import Gauge
|
|
31
|
+
|
|
32
|
+
# Gauge to expose daily active users metrics
|
|
33
|
+
current_dau_gauge = Gauge(
|
|
34
|
+
"synapse_admin_daily_active_users",
|
|
35
|
+
"Current daily active users count",
|
|
36
|
+
labelnames=[SERVER_NAME_LABEL],
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@attr.s(auto_attribs=True)
|
|
41
|
+
class CommonUsageMetrics:
|
|
42
|
+
"""Usage metrics shared between the phone home stats and the prometheus exporter."""
|
|
43
|
+
|
|
44
|
+
daily_active_users: int
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class CommonUsageMetricsManager:
|
|
48
|
+
"""Collects common usage metrics."""
|
|
49
|
+
|
|
50
|
+
def __init__(self, hs: "HomeServer") -> None:
|
|
51
|
+
self.server_name = hs.hostname
|
|
52
|
+
self._store = hs.get_datastores().main
|
|
53
|
+
self._clock = hs.get_clock()
|
|
54
|
+
self._hs = hs
|
|
55
|
+
|
|
56
|
+
async def get_metrics(self) -> CommonUsageMetrics:
|
|
57
|
+
"""Get the CommonUsageMetrics object. If no collection has happened yet, do it
|
|
58
|
+
before returning the metrics.
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
The CommonUsageMetrics object to read common metrics from.
|
|
62
|
+
"""
|
|
63
|
+
return await self._collect()
|
|
64
|
+
|
|
65
|
+
def setup(self) -> None:
|
|
66
|
+
"""Keep the gauges for common usage metrics up to date."""
|
|
67
|
+
self._hs.run_as_background_process(
|
|
68
|
+
desc="common_usage_metrics_update_gauges",
|
|
69
|
+
func=self._update_gauges,
|
|
70
|
+
)
|
|
71
|
+
self._clock.looping_call(
|
|
72
|
+
self._hs.run_as_background_process,
|
|
73
|
+
5 * 60 * 1000,
|
|
74
|
+
desc="common_usage_metrics_update_gauges",
|
|
75
|
+
func=self._update_gauges,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
async def _collect(self) -> CommonUsageMetrics:
|
|
79
|
+
"""Collect the common metrics and either create the CommonUsageMetrics object to
|
|
80
|
+
use if it doesn't exist yet, or update it.
|
|
81
|
+
"""
|
|
82
|
+
dau_count = await self._store.count_daily_users()
|
|
83
|
+
|
|
84
|
+
return CommonUsageMetrics(
|
|
85
|
+
daily_active_users=dau_count,
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
async def _update_gauges(self) -> None:
|
|
89
|
+
"""Update the Prometheus gauges."""
|
|
90
|
+
metrics = await self._collect()
|
|
91
|
+
|
|
92
|
+
current_dau_gauge.labels(
|
|
93
|
+
**{SERVER_NAME_LABEL: self.server_name},
|
|
94
|
+
).set(float(metrics.daily_active_users))
|