This repository has been archived by the owner on Apr 26, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add some background update admin APIs (#11263)
Fixes #11259
- Loading branch information
1 parent
0c82d4a
commit 4ee71b9
Showing
8 changed files
with
468 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Add some background update admin APIs. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
# Background Updates API | ||
|
||
This API allows a server administrator to manage the background updates being | ||
run against the database. | ||
|
||
## Status | ||
|
||
This API gets the current status of the background updates. | ||
|
||
|
||
The API is: | ||
|
||
``` | ||
GET /_synapse/admin/v1/background_updates/status | ||
``` | ||
|
||
Returning: | ||
|
||
```json | ||
{ | ||
"enabled": true, | ||
"current_updates": { | ||
"<db_name>": { | ||
"name": "<background_update_name>", | ||
"total_item_count": 50, | ||
"total_duration_ms": 10000.0, | ||
"average_items_per_ms": 2.2, | ||
}, | ||
} | ||
} | ||
``` | ||
|
||
`enabled` whether the background updates are enabled or disabled. | ||
|
||
`db_name` the database name (usually Synapse is configured with a single database named 'master'). | ||
|
||
For each update: | ||
|
||
`name` the name of the update. | ||
`total_item_count` total number of "items" processed (the meaning of 'items' depends on the update in question). | ||
`total_duration_ms` how long the background process has been running, not including time spent sleeping. | ||
`average_items_per_ms` how many items are processed per millisecond based on an exponential average. | ||
|
||
|
||
|
||
## Enabled | ||
|
||
This API allow pausing background updates. | ||
|
||
Background updates should *not* be paused for significant periods of time, as | ||
this can affect the performance of Synapse. | ||
|
||
*Note*: This won't persist over restarts. | ||
|
||
*Note*: This won't cancel any update query that is currently running. This is | ||
usually fine since most queries are short lived, except for `CREATE INDEX` | ||
background updates which won't be cancelled once started. | ||
|
||
|
||
The API is: | ||
|
||
``` | ||
POST /_synapse/admin/v1/background_updates/enabled | ||
``` | ||
|
||
with the following body: | ||
|
||
```json | ||
{ | ||
"enabled": false | ||
} | ||
``` | ||
|
||
`enabled` sets whether the background updates are enabled or disabled. | ||
|
||
The API returns the `enabled` param. | ||
|
||
```json | ||
{ | ||
"enabled": false | ||
} | ||
``` | ||
|
||
There is also a `GET` version which returns the `enabled` state. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
# Copyright 2021 The Matrix.org Foundation C.I.C. | ||
# | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
import logging | ||
from typing import TYPE_CHECKING, Tuple | ||
|
||
from synapse.api.errors import SynapseError | ||
from synapse.http.servlet import RestServlet, parse_json_object_from_request | ||
from synapse.http.site import SynapseRequest | ||
from synapse.rest.admin._base import admin_patterns, assert_user_is_admin | ||
from synapse.types import JsonDict | ||
|
||
if TYPE_CHECKING: | ||
from synapse.server import HomeServer | ||
|
||
logger = logging.getLogger(__name__) | ||
|
||
|
||
class BackgroundUpdateEnabledRestServlet(RestServlet): | ||
"""Allows temporarily disabling background updates""" | ||
|
||
PATTERNS = admin_patterns("/background_updates/enabled") | ||
|
||
def __init__(self, hs: "HomeServer"): | ||
self.group_server = hs.get_groups_server_handler() | ||
self.is_mine_id = hs.is_mine_id | ||
self.auth = hs.get_auth() | ||
|
||
self.data_stores = hs.get_datastores() | ||
|
||
async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]: | ||
requester = await self.auth.get_user_by_req(request) | ||
await assert_user_is_admin(self.auth, requester.user) | ||
|
||
# We need to check that all configured databases have updates enabled. | ||
# (They *should* all be in sync.) | ||
enabled = all(db.updates.enabled for db in self.data_stores.databases) | ||
|
||
return 200, {"enabled": enabled} | ||
|
||
async def on_POST(self, request: SynapseRequest) -> Tuple[int, JsonDict]: | ||
requester = await self.auth.get_user_by_req(request) | ||
await assert_user_is_admin(self.auth, requester.user) | ||
|
||
body = parse_json_object_from_request(request) | ||
|
||
enabled = body.get("enabled", True) | ||
|
||
if not isinstance(enabled, bool): | ||
raise SynapseError(400, "'enabled' parameter must be a boolean") | ||
|
||
for db in self.data_stores.databases: | ||
db.updates.enabled = enabled | ||
|
||
# If we're re-enabling them ensure that we start the background | ||
# process again. | ||
if enabled: | ||
db.updates.start_doing_background_updates() | ||
|
||
return 200, {"enabled": enabled} | ||
|
||
|
||
class BackgroundUpdateRestServlet(RestServlet): | ||
"""Fetch information about background updates""" | ||
|
||
PATTERNS = admin_patterns("/background_updates/status") | ||
|
||
def __init__(self, hs: "HomeServer"): | ||
self.group_server = hs.get_groups_server_handler() | ||
self.is_mine_id = hs.is_mine_id | ||
self.auth = hs.get_auth() | ||
|
||
self.data_stores = hs.get_datastores() | ||
|
||
async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]: | ||
requester = await self.auth.get_user_by_req(request) | ||
await assert_user_is_admin(self.auth, requester.user) | ||
|
||
# We need to check that all configured databases have updates enabled. | ||
# (They *should* all be in sync.) | ||
enabled = all(db.updates.enabled for db in self.data_stores.databases) | ||
|
||
current_updates = {} | ||
|
||
for db in self.data_stores.databases: | ||
update = db.updates.get_current_update() | ||
if not update: | ||
continue | ||
|
||
current_updates[db.name()] = { | ||
"name": update.name, | ||
"total_item_count": update.total_item_count, | ||
"total_duration_ms": update.total_duration_ms, | ||
"average_items_per_ms": update.average_items_per_ms(), | ||
} | ||
|
||
return 200, {"enabled": enabled, "current_updates": current_updates} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.