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,754 @@
|
|
|
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 2015, 2016 OpenMarket Ltd
|
|
6
|
+
# Copyright (C) 2023 New Vector, Ltd
|
|
7
|
+
#
|
|
8
|
+
# This program is free software: you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of the GNU Affero General Public License as
|
|
10
|
+
# published by the Free Software Foundation, either version 3 of the
|
|
11
|
+
# License, or (at your option) any later version.
|
|
12
|
+
#
|
|
13
|
+
# See the GNU Affero General Public License for more details:
|
|
14
|
+
# <https://www.gnu.org/licenses/agpl-3.0.html>.
|
|
15
|
+
#
|
|
16
|
+
# Originally licensed under the Apache License, Version 2.0:
|
|
17
|
+
# <http://www.apache.org/licenses/LICENSE-2.0>.
|
|
18
|
+
#
|
|
19
|
+
# [This file includes modifications made by New Vector Limited]
|
|
20
|
+
#
|
|
21
|
+
#
|
|
22
|
+
|
|
23
|
+
import itertools
|
|
24
|
+
import logging
|
|
25
|
+
import os
|
|
26
|
+
import platform
|
|
27
|
+
import threading
|
|
28
|
+
from importlib import metadata
|
|
29
|
+
from typing import (
|
|
30
|
+
Callable,
|
|
31
|
+
Generic,
|
|
32
|
+
Iterable,
|
|
33
|
+
Mapping,
|
|
34
|
+
Optional,
|
|
35
|
+
Sequence,
|
|
36
|
+
TypeVar,
|
|
37
|
+
Union,
|
|
38
|
+
cast,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
import attr
|
|
42
|
+
from packaging.version import parse as parse_version
|
|
43
|
+
from prometheus_client import (
|
|
44
|
+
CollectorRegistry,
|
|
45
|
+
Counter,
|
|
46
|
+
Gauge,
|
|
47
|
+
Histogram,
|
|
48
|
+
Metric,
|
|
49
|
+
generate_latest,
|
|
50
|
+
)
|
|
51
|
+
from prometheus_client.core import (
|
|
52
|
+
REGISTRY,
|
|
53
|
+
GaugeHistogramMetricFamily,
|
|
54
|
+
GaugeMetricFamily,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
from twisted.python.threadpool import ThreadPool
|
|
58
|
+
from twisted.web.resource import Resource
|
|
59
|
+
from twisted.web.server import Request
|
|
60
|
+
|
|
61
|
+
# This module is imported for its side effects; flake8 needn't warn that it's unused.
|
|
62
|
+
import synapse.metrics._reactor_metrics # noqa: F401
|
|
63
|
+
from synapse.metrics._gc import MIN_TIME_BETWEEN_GCS, install_gc_manager
|
|
64
|
+
from synapse.metrics._types import Collector
|
|
65
|
+
from synapse.types import StrSequence
|
|
66
|
+
from synapse.util import SYNAPSE_VERSION
|
|
67
|
+
|
|
68
|
+
logger = logging.getLogger(__name__)
|
|
69
|
+
|
|
70
|
+
METRICS_PREFIX = "/_synapse/metrics"
|
|
71
|
+
|
|
72
|
+
HAVE_PROC_SELF_STAT = os.path.exists("/proc/self/stat")
|
|
73
|
+
|
|
74
|
+
SERVER_NAME_LABEL = "server_name"
|
|
75
|
+
"""
|
|
76
|
+
The `server_name` label is used to identify the homeserver that the metrics correspond
|
|
77
|
+
to. Because we support multiple instances of Synapse running in the same process and all
|
|
78
|
+
metrics are in a single global `REGISTRY`, we need to manually label any metrics.
|
|
79
|
+
|
|
80
|
+
In the case of a Synapse homeserver, this should be set to the homeserver name
|
|
81
|
+
(`hs.hostname`).
|
|
82
|
+
|
|
83
|
+
We're purposely not using the `instance` label for this purpose as that should be "The
|
|
84
|
+
<host>:<port> part of the target's URL that was scraped.". Also: "In Prometheus
|
|
85
|
+
terms, an endpoint you can scrape is called an *instance*, usually corresponding to a
|
|
86
|
+
single process." (source: https://prometheus.io/docs/concepts/jobs_instances/)
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
CONTENT_TYPE_LATEST = "text/plain; version=0.0.4; charset=utf-8"
|
|
91
|
+
"""
|
|
92
|
+
Content type of the latest text format for Prometheus metrics.
|
|
93
|
+
|
|
94
|
+
Pulled directly from the prometheus_client library.
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _set_prometheus_client_use_created_metrics(new_value: bool) -> None:
|
|
99
|
+
"""
|
|
100
|
+
Sets whether prometheus_client should expose `_created`-suffixed metrics for
|
|
101
|
+
all gauges, histograms and summaries.
|
|
102
|
+
|
|
103
|
+
There is no programmatic way in the old versions of `prometheus_client` to disable
|
|
104
|
+
this without poking at internals; the proper way in the old `prometheus_client`
|
|
105
|
+
versions (> `0.14.0` < `0.18.0`) is to use an environment variable which
|
|
106
|
+
prometheus_client loads at import time. For versions > `0.18.0`, we can use the
|
|
107
|
+
dedicated `disable_created_metrics()`/`enable_created_metrics()`.
|
|
108
|
+
|
|
109
|
+
The motivation for disabling these `_created` metrics is that they're a waste of
|
|
110
|
+
space as they're not useful but they take up space in Prometheus. It's not the end
|
|
111
|
+
of the world if this doesn't work.
|
|
112
|
+
"""
|
|
113
|
+
import prometheus_client.metrics
|
|
114
|
+
|
|
115
|
+
if hasattr(prometheus_client.metrics, "_use_created"):
|
|
116
|
+
prometheus_client.metrics._use_created = new_value
|
|
117
|
+
# Just log an error for old versions that don't support disabling the unecessary
|
|
118
|
+
# metrics. It's not the end of the world if this doesn't work as it just means extra
|
|
119
|
+
# wasted space taken up in Prometheus but things keep working.
|
|
120
|
+
elif parse_version(metadata.version("prometheus_client")) < parse_version("0.14.0"):
|
|
121
|
+
logger.error(
|
|
122
|
+
"Can't disable `_created` metrics in prometheus_client (unsupported `prometheus_client` version, too old)"
|
|
123
|
+
)
|
|
124
|
+
# If the attribute doesn't exist on a newer version, this is a sign that the brittle
|
|
125
|
+
# hack is broken. We should consider updating the minimum version of
|
|
126
|
+
# `prometheus_client` to a version (> `0.18.0`) where we can use dedicated
|
|
127
|
+
# `disable_created_metrics()`/`enable_created_metrics()` functions.
|
|
128
|
+
else:
|
|
129
|
+
raise Exception(
|
|
130
|
+
"Can't disable `_created` metrics in prometheus_client (brittle hack broken?)"
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
# Set this globally so it applies wherever we generate/collect metrics
|
|
135
|
+
_set_prometheus_client_use_created_metrics(False)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class _RegistryProxy:
|
|
139
|
+
@staticmethod
|
|
140
|
+
def collect() -> Iterable[Metric]:
|
|
141
|
+
for metric in REGISTRY.collect():
|
|
142
|
+
if not metric.name.startswith("__"):
|
|
143
|
+
yield metric
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
# A little bit nasty, but collect() above is static so a Protocol doesn't work.
|
|
147
|
+
# _RegistryProxy matches the signature of a CollectorRegistry instance enough
|
|
148
|
+
# for it to be usable in the contexts in which we use it.
|
|
149
|
+
# TODO Do something nicer about this.
|
|
150
|
+
RegistryProxy = cast(CollectorRegistry, _RegistryProxy)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
@attr.s(slots=True, hash=True, auto_attribs=True, kw_only=True)
|
|
154
|
+
class LaterGauge(Collector):
|
|
155
|
+
"""A Gauge which periodically calls a user-provided callback to produce metrics."""
|
|
156
|
+
|
|
157
|
+
name: str
|
|
158
|
+
desc: str
|
|
159
|
+
labelnames: Optional[StrSequence] = attr.ib(hash=False)
|
|
160
|
+
_instance_id_to_hook_map: dict[
|
|
161
|
+
Optional[str], # instance_id
|
|
162
|
+
Callable[
|
|
163
|
+
[], Union[Mapping[tuple[str, ...], Union[int, float]], Union[int, float]]
|
|
164
|
+
],
|
|
165
|
+
] = attr.ib(factory=dict, hash=False)
|
|
166
|
+
"""
|
|
167
|
+
Map from homeserver instance_id to a callback. Each callback should either return a
|
|
168
|
+
value (if there are no labels for this metric), or dict mapping from a label tuple
|
|
169
|
+
to a value.
|
|
170
|
+
|
|
171
|
+
We use `instance_id` instead of `server_name` because it's possible to have multiple
|
|
172
|
+
workers running in the same process with the same `server_name`.
|
|
173
|
+
"""
|
|
174
|
+
|
|
175
|
+
def collect(self) -> Iterable[Metric]:
|
|
176
|
+
# The decision to add `SERVER_NAME_LABEL` is from the `LaterGauge` usage itself
|
|
177
|
+
# (we don't enforce it here, one level up).
|
|
178
|
+
g = GaugeMetricFamily(self.name, self.desc, labels=self.labelnames) # type: ignore[missing-server-name-label]
|
|
179
|
+
|
|
180
|
+
for homeserver_instance_id, hook in self._instance_id_to_hook_map.items():
|
|
181
|
+
try:
|
|
182
|
+
hook_result = hook()
|
|
183
|
+
except Exception:
|
|
184
|
+
logger.exception(
|
|
185
|
+
"Exception running callback for LaterGauge(%s) for homeserver_instance_id=%s",
|
|
186
|
+
self.name,
|
|
187
|
+
homeserver_instance_id,
|
|
188
|
+
)
|
|
189
|
+
# Continue to return the rest of the metrics that aren't broken
|
|
190
|
+
continue
|
|
191
|
+
|
|
192
|
+
if isinstance(hook_result, (int, float)):
|
|
193
|
+
g.add_metric([], hook_result)
|
|
194
|
+
else:
|
|
195
|
+
for k, v in hook_result.items():
|
|
196
|
+
g.add_metric(k, v)
|
|
197
|
+
|
|
198
|
+
yield g
|
|
199
|
+
|
|
200
|
+
def register_hook(
|
|
201
|
+
self,
|
|
202
|
+
*,
|
|
203
|
+
homeserver_instance_id: Optional[str],
|
|
204
|
+
hook: Callable[
|
|
205
|
+
[], Union[Mapping[tuple[str, ...], Union[int, float]], Union[int, float]]
|
|
206
|
+
],
|
|
207
|
+
) -> None:
|
|
208
|
+
"""
|
|
209
|
+
Register a callback/hook that will be called to generate a metric samples for
|
|
210
|
+
the gauge.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
homeserver_instance_id: The unique ID for this Synapse process instance
|
|
214
|
+
(`hs.get_instance_id()`) that this hook is associated with. This can be used
|
|
215
|
+
later to lookup all hooks associated with a given server name in order to
|
|
216
|
+
unregister them. This should only be omitted for global hooks that work
|
|
217
|
+
across all homeservers.
|
|
218
|
+
hook: A callback that should either return a value (if there are no
|
|
219
|
+
labels for this metric), or dict mapping from a label tuple to a value
|
|
220
|
+
"""
|
|
221
|
+
# We shouldn't have multiple hooks registered for the same homeserver `instance_id`.
|
|
222
|
+
existing_hook = self._instance_id_to_hook_map.get(homeserver_instance_id)
|
|
223
|
+
assert existing_hook is None, (
|
|
224
|
+
f"LaterGauge(name={self.name}) hook already registered for homeserver_instance_id={homeserver_instance_id}. "
|
|
225
|
+
"This is likely a Synapse bug and you forgot to unregister the previous hooks for "
|
|
226
|
+
"the server (especially in tests)."
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
self._instance_id_to_hook_map[homeserver_instance_id] = hook
|
|
230
|
+
|
|
231
|
+
def unregister_hooks_for_homeserver_instance_id(
|
|
232
|
+
self, homeserver_instance_id: str
|
|
233
|
+
) -> None:
|
|
234
|
+
"""
|
|
235
|
+
Unregister all hooks associated with the given homeserver `instance_id`. This should be
|
|
236
|
+
called when a homeserver is shutdown to avoid extra hooks sitting around.
|
|
237
|
+
|
|
238
|
+
Args:
|
|
239
|
+
homeserver_instance_id: The unique ID for this Synapse process instance to
|
|
240
|
+
unregister hooks for (`hs.get_instance_id()`).
|
|
241
|
+
"""
|
|
242
|
+
self._instance_id_to_hook_map.pop(homeserver_instance_id, None)
|
|
243
|
+
|
|
244
|
+
def __attrs_post_init__(self) -> None:
|
|
245
|
+
REGISTRY.register(self)
|
|
246
|
+
|
|
247
|
+
# We shouldn't have multiple metrics with the same name. Typically, metrics
|
|
248
|
+
# should be created globally so you shouldn't be running into this and this will
|
|
249
|
+
# catch any stupid mistakes. The `REGISTRY.register(self)` call above will also
|
|
250
|
+
# raise an error if the metric already exists but to make things explicit, we'll
|
|
251
|
+
# also check here.
|
|
252
|
+
existing_gauge = all_later_gauges_to_clean_up_on_shutdown.get(self.name)
|
|
253
|
+
assert existing_gauge is None, f"LaterGauge(name={self.name}) already exists. "
|
|
254
|
+
|
|
255
|
+
# Keep track of the gauge so we can clean it up later.
|
|
256
|
+
all_later_gauges_to_clean_up_on_shutdown[self.name] = self
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
all_later_gauges_to_clean_up_on_shutdown: dict[str, LaterGauge] = {}
|
|
260
|
+
"""
|
|
261
|
+
Track all `LaterGauge` instances so we can remove any associated hooks during homeserver
|
|
262
|
+
shutdown.
|
|
263
|
+
"""
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
# `MetricsEntry` only makes sense when it is a `Protocol`,
|
|
267
|
+
# but `Protocol` can't be used as a `TypeVar` bound.
|
|
268
|
+
MetricsEntry = TypeVar("MetricsEntry")
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
class InFlightGauge(Generic[MetricsEntry], Collector):
|
|
272
|
+
"""Tracks number of things (e.g. requests, Measure blocks, etc) in flight
|
|
273
|
+
at any given time.
|
|
274
|
+
|
|
275
|
+
Each InFlightGauge will create a metric called `<name>_total` that counts
|
|
276
|
+
the number of in flight blocks, as well as a metrics for each item in the
|
|
277
|
+
given `sub_metrics` as `<name>_<sub_metric>` which will get updated by the
|
|
278
|
+
callbacks.
|
|
279
|
+
|
|
280
|
+
Args:
|
|
281
|
+
name
|
|
282
|
+
desc
|
|
283
|
+
labels
|
|
284
|
+
sub_metrics: A list of sub metrics that the callbacks will update.
|
|
285
|
+
"""
|
|
286
|
+
|
|
287
|
+
def __init__(
|
|
288
|
+
self,
|
|
289
|
+
name: str,
|
|
290
|
+
desc: str,
|
|
291
|
+
labels: StrSequence,
|
|
292
|
+
sub_metrics: StrSequence,
|
|
293
|
+
):
|
|
294
|
+
self.name = name
|
|
295
|
+
self.desc = desc
|
|
296
|
+
self.labels = labels
|
|
297
|
+
self.sub_metrics = sub_metrics
|
|
298
|
+
|
|
299
|
+
# Create a class which have the sub_metrics values as attributes, which
|
|
300
|
+
# default to 0 on initialization. Used to pass to registered callbacks.
|
|
301
|
+
self._metrics_class: type[MetricsEntry] = attr.make_class(
|
|
302
|
+
"_MetricsEntry",
|
|
303
|
+
attrs={x: attr.ib(default=0) for x in sub_metrics},
|
|
304
|
+
slots=True,
|
|
305
|
+
)
|
|
306
|
+
|
|
307
|
+
# Counts number of in flight blocks for a given set of label values
|
|
308
|
+
self._registrations: dict[
|
|
309
|
+
tuple[str, ...], set[Callable[[MetricsEntry], None]]
|
|
310
|
+
] = {}
|
|
311
|
+
|
|
312
|
+
# Protects access to _registrations
|
|
313
|
+
self._lock = threading.Lock()
|
|
314
|
+
|
|
315
|
+
REGISTRY.register(self)
|
|
316
|
+
|
|
317
|
+
def register(
|
|
318
|
+
self,
|
|
319
|
+
key: tuple[str, ...],
|
|
320
|
+
callback: Callable[[MetricsEntry], None],
|
|
321
|
+
) -> None:
|
|
322
|
+
"""Registers that we've entered a new block with labels `key`.
|
|
323
|
+
|
|
324
|
+
`callback` gets called each time the metrics are collected. The same
|
|
325
|
+
value must also be given to `unregister`.
|
|
326
|
+
|
|
327
|
+
`callback` gets called with an object that has an attribute per
|
|
328
|
+
sub_metric, which should be updated with the necessary values. Note that
|
|
329
|
+
the metrics object is shared between all callbacks registered with the
|
|
330
|
+
same key.
|
|
331
|
+
|
|
332
|
+
Note that `callback` may be called on a separate thread.
|
|
333
|
+
|
|
334
|
+
Args:
|
|
335
|
+
key: A tuple of label values, which must match the order of the
|
|
336
|
+
`labels` given to the constructor.
|
|
337
|
+
callback
|
|
338
|
+
"""
|
|
339
|
+
assert len(key) == len(self.labels), (
|
|
340
|
+
f"Expected {len(self.labels)} labels in `key`, got {len(key)}: {key}"
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
with self._lock:
|
|
344
|
+
self._registrations.setdefault(key, set()).add(callback)
|
|
345
|
+
|
|
346
|
+
def unregister(
|
|
347
|
+
self,
|
|
348
|
+
key: tuple[str, ...],
|
|
349
|
+
callback: Callable[[MetricsEntry], None],
|
|
350
|
+
) -> None:
|
|
351
|
+
"""
|
|
352
|
+
Registers that we've exited a block with labels `key`.
|
|
353
|
+
|
|
354
|
+
Args:
|
|
355
|
+
key: A tuple of label values, which must match the order of the
|
|
356
|
+
`labels` given to the constructor.
|
|
357
|
+
callback
|
|
358
|
+
"""
|
|
359
|
+
assert len(key) == len(self.labels), (
|
|
360
|
+
f"Expected {len(self.labels)} labels in `key`, got {len(key)}: {key}"
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
with self._lock:
|
|
364
|
+
self._registrations.setdefault(key, set()).discard(callback)
|
|
365
|
+
|
|
366
|
+
def collect(self) -> Iterable[Metric]:
|
|
367
|
+
"""Called by prometheus client when it reads metrics.
|
|
368
|
+
|
|
369
|
+
Note: may be called by a separate thread.
|
|
370
|
+
"""
|
|
371
|
+
# The decision to add `SERVER_NAME_LABEL` is from the `GaugeBucketCollector`
|
|
372
|
+
# usage itself (we don't enforce it here, one level up).
|
|
373
|
+
in_flight = GaugeMetricFamily( # type: ignore[missing-server-name-label]
|
|
374
|
+
self.name + "_total", self.desc, labels=self.labels
|
|
375
|
+
)
|
|
376
|
+
|
|
377
|
+
metrics_by_key = {}
|
|
378
|
+
|
|
379
|
+
# We copy so that we don't mutate the list while iterating
|
|
380
|
+
with self._lock:
|
|
381
|
+
keys = list(self._registrations)
|
|
382
|
+
|
|
383
|
+
for key in keys:
|
|
384
|
+
with self._lock:
|
|
385
|
+
callbacks = set(self._registrations[key])
|
|
386
|
+
|
|
387
|
+
in_flight.add_metric(labels=key, value=len(callbacks))
|
|
388
|
+
|
|
389
|
+
metrics = self._metrics_class()
|
|
390
|
+
metrics_by_key[key] = metrics
|
|
391
|
+
for callback in callbacks:
|
|
392
|
+
callback(metrics)
|
|
393
|
+
|
|
394
|
+
yield in_flight
|
|
395
|
+
|
|
396
|
+
for name in self.sub_metrics:
|
|
397
|
+
# The decision to add `SERVER_NAME_LABEL` is from the `InFlightGauge` usage
|
|
398
|
+
# itself (we don't enforce it here, one level up).
|
|
399
|
+
gauge = GaugeMetricFamily( # type: ignore[missing-server-name-label]
|
|
400
|
+
"_".join([self.name, name]), "", labels=self.labels
|
|
401
|
+
)
|
|
402
|
+
for key, metrics in metrics_by_key.items():
|
|
403
|
+
gauge.add_metric(labels=key, value=getattr(metrics, name))
|
|
404
|
+
yield gauge
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
class GaugeHistogramMetricFamilyWithLabels(GaugeHistogramMetricFamily):
|
|
408
|
+
"""
|
|
409
|
+
Custom version of `GaugeHistogramMetricFamily` from `prometheus_client` that allows
|
|
410
|
+
specifying labels and label values.
|
|
411
|
+
|
|
412
|
+
A single gauge histogram and its samples.
|
|
413
|
+
|
|
414
|
+
For use by custom collectors.
|
|
415
|
+
"""
|
|
416
|
+
|
|
417
|
+
def __init__(
|
|
418
|
+
self,
|
|
419
|
+
*,
|
|
420
|
+
name: str,
|
|
421
|
+
documentation: str,
|
|
422
|
+
gsum_value: float,
|
|
423
|
+
buckets: Optional[Sequence[tuple[str, float]]] = None,
|
|
424
|
+
labelnames: StrSequence = (),
|
|
425
|
+
labelvalues: StrSequence = (),
|
|
426
|
+
unit: str = "",
|
|
427
|
+
):
|
|
428
|
+
# Sanity check the number of label values matches the number of label names.
|
|
429
|
+
if len(labelvalues) != len(labelnames):
|
|
430
|
+
raise ValueError(
|
|
431
|
+
"The number of label values must match the number of label names"
|
|
432
|
+
)
|
|
433
|
+
|
|
434
|
+
# Call the super to validate and set the labelnames. We use this stable API
|
|
435
|
+
# instead of setting the internal `_labelnames` field directly.
|
|
436
|
+
super().__init__(
|
|
437
|
+
name=name,
|
|
438
|
+
documentation=documentation,
|
|
439
|
+
labels=labelnames,
|
|
440
|
+
# Since `GaugeHistogramMetricFamily` doesn't support supplying `labels` and
|
|
441
|
+
# `buckets` at the same time (artificial limitation), we will just set these
|
|
442
|
+
# as `None` and set up the buckets ourselves just below.
|
|
443
|
+
buckets=None,
|
|
444
|
+
gsum_value=None,
|
|
445
|
+
)
|
|
446
|
+
|
|
447
|
+
# Create a gauge for each bucket.
|
|
448
|
+
if buckets is not None:
|
|
449
|
+
self.add_metric(labels=labelvalues, buckets=buckets, gsum_value=gsum_value)
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
class GaugeBucketCollector(Collector):
|
|
453
|
+
"""Like a Histogram, but the buckets are Gauges which are updated atomically.
|
|
454
|
+
|
|
455
|
+
The data is updated by calling `update_data` with an iterable of measurements.
|
|
456
|
+
|
|
457
|
+
We assume that the data is updated less frequently than it is reported to
|
|
458
|
+
Prometheus, and optimise for that case.
|
|
459
|
+
"""
|
|
460
|
+
|
|
461
|
+
__slots__ = (
|
|
462
|
+
"_name",
|
|
463
|
+
"_documentation",
|
|
464
|
+
"_labelnames",
|
|
465
|
+
"_bucket_bounds",
|
|
466
|
+
"_metric",
|
|
467
|
+
)
|
|
468
|
+
|
|
469
|
+
def __init__(
|
|
470
|
+
self,
|
|
471
|
+
*,
|
|
472
|
+
name: str,
|
|
473
|
+
documentation: str,
|
|
474
|
+
labelnames: Optional[StrSequence],
|
|
475
|
+
buckets: Iterable[float],
|
|
476
|
+
registry: CollectorRegistry = REGISTRY,
|
|
477
|
+
):
|
|
478
|
+
"""
|
|
479
|
+
Args:
|
|
480
|
+
name: base name of metric to be exported to Prometheus. (a _bucket suffix
|
|
481
|
+
will be added.)
|
|
482
|
+
documentation: help text for the metric
|
|
483
|
+
buckets: The top bounds of the buckets to report
|
|
484
|
+
registry: metric registry to register with
|
|
485
|
+
"""
|
|
486
|
+
self._name = name
|
|
487
|
+
self._documentation = documentation
|
|
488
|
+
self._labelnames = labelnames if labelnames else ()
|
|
489
|
+
|
|
490
|
+
# the tops of the buckets
|
|
491
|
+
self._bucket_bounds = [float(b) for b in buckets]
|
|
492
|
+
if self._bucket_bounds != sorted(self._bucket_bounds):
|
|
493
|
+
raise ValueError("Buckets not in sorted order")
|
|
494
|
+
|
|
495
|
+
if self._bucket_bounds[-1] != float("inf"):
|
|
496
|
+
self._bucket_bounds.append(float("inf"))
|
|
497
|
+
|
|
498
|
+
# We initially set this to None. We won't report metrics until
|
|
499
|
+
# this has been initialised after a successful data update
|
|
500
|
+
self._metric: Optional[GaugeHistogramMetricFamilyWithLabels] = None
|
|
501
|
+
|
|
502
|
+
registry.register(self)
|
|
503
|
+
|
|
504
|
+
def collect(self) -> Iterable[Metric]:
|
|
505
|
+
# Don't report metrics unless we've already collected some data
|
|
506
|
+
if self._metric is not None:
|
|
507
|
+
yield self._metric
|
|
508
|
+
|
|
509
|
+
def update_data(self, values: Iterable[float], labels: StrSequence = ()) -> None:
|
|
510
|
+
"""Update the data to be reported by the metric
|
|
511
|
+
|
|
512
|
+
The existing data is cleared, and each measurement in the input is assigned
|
|
513
|
+
to the relevant bucket.
|
|
514
|
+
|
|
515
|
+
Args:
|
|
516
|
+
values
|
|
517
|
+
labels
|
|
518
|
+
"""
|
|
519
|
+
self._metric = self._values_to_metric(values, labels)
|
|
520
|
+
|
|
521
|
+
def _values_to_metric(
|
|
522
|
+
self, values: Iterable[float], labels: StrSequence = ()
|
|
523
|
+
) -> GaugeHistogramMetricFamilyWithLabels:
|
|
524
|
+
"""
|
|
525
|
+
Args:
|
|
526
|
+
values
|
|
527
|
+
labels
|
|
528
|
+
"""
|
|
529
|
+
total = 0.0
|
|
530
|
+
bucket_values = [0 for _ in self._bucket_bounds]
|
|
531
|
+
|
|
532
|
+
for v in values:
|
|
533
|
+
# assign each value to a bucket
|
|
534
|
+
for i, bound in enumerate(self._bucket_bounds):
|
|
535
|
+
if v <= bound:
|
|
536
|
+
bucket_values[i] += 1
|
|
537
|
+
break
|
|
538
|
+
|
|
539
|
+
# ... and increment the sum
|
|
540
|
+
total += v
|
|
541
|
+
|
|
542
|
+
# now, aggregate the bucket values so that they count the number of entries in
|
|
543
|
+
# that bucket or below.
|
|
544
|
+
accumulated_values = itertools.accumulate(bucket_values)
|
|
545
|
+
|
|
546
|
+
# The decision to add `SERVER_NAME_LABEL` is from the `GaugeBucketCollector`
|
|
547
|
+
# usage itself (we don't enforce it here, one level up).
|
|
548
|
+
return GaugeHistogramMetricFamilyWithLabels( # type: ignore[missing-server-name-label]
|
|
549
|
+
name=self._name,
|
|
550
|
+
documentation=self._documentation,
|
|
551
|
+
labelnames=self._labelnames,
|
|
552
|
+
labelvalues=labels,
|
|
553
|
+
buckets=list(
|
|
554
|
+
zip((str(b) for b in self._bucket_bounds), accumulated_values)
|
|
555
|
+
),
|
|
556
|
+
gsum_value=total,
|
|
557
|
+
)
|
|
558
|
+
|
|
559
|
+
|
|
560
|
+
#
|
|
561
|
+
# Detailed CPU metrics
|
|
562
|
+
#
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
class CPUMetrics(Collector):
|
|
566
|
+
def __init__(self) -> None:
|
|
567
|
+
ticks_per_sec = 100
|
|
568
|
+
try:
|
|
569
|
+
# Try and get the system config
|
|
570
|
+
ticks_per_sec = os.sysconf("SC_CLK_TCK")
|
|
571
|
+
except (ValueError, TypeError, AttributeError):
|
|
572
|
+
pass
|
|
573
|
+
|
|
574
|
+
self.ticks_per_sec = ticks_per_sec
|
|
575
|
+
|
|
576
|
+
def collect(self) -> Iterable[Metric]:
|
|
577
|
+
if not HAVE_PROC_SELF_STAT:
|
|
578
|
+
return
|
|
579
|
+
|
|
580
|
+
with open("/proc/self/stat") as s:
|
|
581
|
+
line = s.read()
|
|
582
|
+
raw_stats = line.split(") ", 1)[1].split(" ")
|
|
583
|
+
|
|
584
|
+
# This is a process-level metric, so it does not have the `SERVER_NAME_LABEL`.
|
|
585
|
+
user = GaugeMetricFamily("process_cpu_user_seconds_total", "") # type: ignore[missing-server-name-label]
|
|
586
|
+
user.add_metric([], float(raw_stats[11]) / self.ticks_per_sec)
|
|
587
|
+
yield user
|
|
588
|
+
|
|
589
|
+
# This is a process-level metric, so it does not have the `SERVER_NAME_LABEL`.
|
|
590
|
+
sys = GaugeMetricFamily("process_cpu_system_seconds_total", "") # type: ignore[missing-server-name-label]
|
|
591
|
+
sys.add_metric([], float(raw_stats[12]) / self.ticks_per_sec)
|
|
592
|
+
yield sys
|
|
593
|
+
|
|
594
|
+
|
|
595
|
+
# This is a process-level metric, so it does not have the `SERVER_NAME_LABEL`.
|
|
596
|
+
REGISTRY.register(CPUMetrics()) # type: ignore[missing-server-name-label]
|
|
597
|
+
|
|
598
|
+
|
|
599
|
+
#
|
|
600
|
+
# Federation Metrics
|
|
601
|
+
#
|
|
602
|
+
|
|
603
|
+
sent_transactions_counter = Counter(
|
|
604
|
+
"synapse_federation_client_sent_transactions", "", labelnames=[SERVER_NAME_LABEL]
|
|
605
|
+
)
|
|
606
|
+
|
|
607
|
+
events_processed_counter = Counter(
|
|
608
|
+
"synapse_federation_client_events_processed", "", labelnames=[SERVER_NAME_LABEL]
|
|
609
|
+
)
|
|
610
|
+
|
|
611
|
+
event_processing_loop_counter = Counter(
|
|
612
|
+
"synapse_event_processing_loop_count",
|
|
613
|
+
"Event processing loop iterations",
|
|
614
|
+
labelnames=["name", SERVER_NAME_LABEL],
|
|
615
|
+
)
|
|
616
|
+
|
|
617
|
+
event_processing_loop_room_count = Counter(
|
|
618
|
+
"synapse_event_processing_loop_room_count",
|
|
619
|
+
"Rooms seen per event processing loop iteration",
|
|
620
|
+
labelnames=["name", SERVER_NAME_LABEL],
|
|
621
|
+
)
|
|
622
|
+
|
|
623
|
+
|
|
624
|
+
# Used to track where various components have processed in the event stream,
|
|
625
|
+
# e.g. federation sending, appservice sending, etc.
|
|
626
|
+
event_processing_positions = Gauge(
|
|
627
|
+
"synapse_event_processing_positions", "", labelnames=["name", SERVER_NAME_LABEL]
|
|
628
|
+
)
|
|
629
|
+
|
|
630
|
+
# Used to track the current max events stream position
|
|
631
|
+
event_persisted_position = Gauge(
|
|
632
|
+
"synapse_event_persisted_position", "", labelnames=[SERVER_NAME_LABEL]
|
|
633
|
+
)
|
|
634
|
+
|
|
635
|
+
# Used to track the received_ts of the last event processed by various
|
|
636
|
+
# components
|
|
637
|
+
event_processing_last_ts = Gauge(
|
|
638
|
+
"synapse_event_processing_last_ts", "", labelnames=["name", SERVER_NAME_LABEL]
|
|
639
|
+
)
|
|
640
|
+
|
|
641
|
+
# Used to track the lag processing events. This is the time difference
|
|
642
|
+
# between the last processed event's received_ts and the time it was
|
|
643
|
+
# finished being processed.
|
|
644
|
+
event_processing_lag = Gauge(
|
|
645
|
+
"synapse_event_processing_lag", "", labelnames=["name", SERVER_NAME_LABEL]
|
|
646
|
+
)
|
|
647
|
+
|
|
648
|
+
event_processing_lag_by_event = Histogram(
|
|
649
|
+
"synapse_event_processing_lag_by_event",
|
|
650
|
+
"Time between an event being persisted and it being queued up to be sent to the relevant remote servers",
|
|
651
|
+
labelnames=["name", SERVER_NAME_LABEL],
|
|
652
|
+
)
|
|
653
|
+
|
|
654
|
+
# Build info of the running server.
|
|
655
|
+
#
|
|
656
|
+
# This is a process-level metric, so it does not have the `SERVER_NAME_LABEL`. We
|
|
657
|
+
# consider this process-level because all Synapse homeservers running in the process
|
|
658
|
+
# will use the same Synapse version.
|
|
659
|
+
build_info = Gauge( # type: ignore[missing-server-name-label]
|
|
660
|
+
"synapse_build_info", "Build information", ["pythonversion", "version", "osversion"]
|
|
661
|
+
)
|
|
662
|
+
build_info.labels(
|
|
663
|
+
" ".join([platform.python_implementation(), platform.python_version()]),
|
|
664
|
+
SYNAPSE_VERSION,
|
|
665
|
+
" ".join([platform.system(), platform.release()]),
|
|
666
|
+
).set(1)
|
|
667
|
+
|
|
668
|
+
# 3PID send info
|
|
669
|
+
threepid_send_requests = Histogram(
|
|
670
|
+
"synapse_threepid_send_requests_with_tries",
|
|
671
|
+
documentation="Number of requests for a 3pid token by try count. Note if"
|
|
672
|
+
" there is a request with try count of 4, then there would have been one"
|
|
673
|
+
" each for 1, 2 and 3",
|
|
674
|
+
buckets=(1, 2, 3, 4, 5, 10),
|
|
675
|
+
labelnames=("type", "reason", SERVER_NAME_LABEL),
|
|
676
|
+
)
|
|
677
|
+
|
|
678
|
+
threadpool_total_threads = Gauge(
|
|
679
|
+
"synapse_threadpool_total_threads",
|
|
680
|
+
"Total number of threads currently in the threadpool",
|
|
681
|
+
labelnames=["name", SERVER_NAME_LABEL],
|
|
682
|
+
)
|
|
683
|
+
|
|
684
|
+
threadpool_total_working_threads = Gauge(
|
|
685
|
+
"synapse_threadpool_working_threads",
|
|
686
|
+
"Number of threads currently working in the threadpool",
|
|
687
|
+
labelnames=["name", SERVER_NAME_LABEL],
|
|
688
|
+
)
|
|
689
|
+
|
|
690
|
+
threadpool_total_min_threads = Gauge(
|
|
691
|
+
"synapse_threadpool_min_threads",
|
|
692
|
+
"Minimum number of threads configured in the threadpool",
|
|
693
|
+
labelnames=["name", SERVER_NAME_LABEL],
|
|
694
|
+
)
|
|
695
|
+
|
|
696
|
+
threadpool_total_max_threads = Gauge(
|
|
697
|
+
"synapse_threadpool_max_threads",
|
|
698
|
+
"Maximum number of threads configured in the threadpool",
|
|
699
|
+
labelnames=["name", SERVER_NAME_LABEL],
|
|
700
|
+
)
|
|
701
|
+
|
|
702
|
+
|
|
703
|
+
def register_threadpool(*, name: str, server_name: str, threadpool: ThreadPool) -> None:
|
|
704
|
+
"""
|
|
705
|
+
Add metrics for the threadpool.
|
|
706
|
+
|
|
707
|
+
Args:
|
|
708
|
+
name: The name of the threadpool, used to identify it in the metrics.
|
|
709
|
+
server_name: The homeserver name (used to label metrics) (this should be `hs.hostname`).
|
|
710
|
+
threadpool: The threadpool to register metrics for.
|
|
711
|
+
"""
|
|
712
|
+
|
|
713
|
+
threadpool_total_min_threads.labels(
|
|
714
|
+
name=name, **{SERVER_NAME_LABEL: server_name}
|
|
715
|
+
).set(threadpool.min)
|
|
716
|
+
threadpool_total_max_threads.labels(
|
|
717
|
+
name=name, **{SERVER_NAME_LABEL: server_name}
|
|
718
|
+
).set(threadpool.max)
|
|
719
|
+
|
|
720
|
+
threadpool_total_threads.labels(
|
|
721
|
+
name=name, **{SERVER_NAME_LABEL: server_name}
|
|
722
|
+
).set_function(lambda: len(threadpool.threads))
|
|
723
|
+
threadpool_total_working_threads.labels(
|
|
724
|
+
name=name, **{SERVER_NAME_LABEL: server_name}
|
|
725
|
+
).set_function(lambda: len(threadpool.working))
|
|
726
|
+
|
|
727
|
+
|
|
728
|
+
class MetricsResource(Resource):
|
|
729
|
+
"""
|
|
730
|
+
Twisted ``Resource`` that serves prometheus metrics.
|
|
731
|
+
"""
|
|
732
|
+
|
|
733
|
+
isLeaf = True
|
|
734
|
+
|
|
735
|
+
def __init__(self, registry: CollectorRegistry = REGISTRY):
|
|
736
|
+
self.registry = registry
|
|
737
|
+
|
|
738
|
+
def render_GET(self, request: Request) -> bytes:
|
|
739
|
+
request.setHeader(b"Content-Type", CONTENT_TYPE_LATEST.encode("ascii"))
|
|
740
|
+
response = generate_latest(self.registry)
|
|
741
|
+
request.setHeader(b"Content-Length", str(len(response)))
|
|
742
|
+
return response
|
|
743
|
+
|
|
744
|
+
|
|
745
|
+
__all__ = [
|
|
746
|
+
"Collector",
|
|
747
|
+
"MetricsResource",
|
|
748
|
+
"generate_latest",
|
|
749
|
+
"LaterGauge",
|
|
750
|
+
"InFlightGauge",
|
|
751
|
+
"GaugeBucketCollector",
|
|
752
|
+
"MIN_TIME_BETWEEN_GCS",
|
|
753
|
+
"install_gc_manager",
|
|
754
|
+
]
|