mirror of https://github.com/watcha-fr/synapse
Allow moving account data and receipts streams off master (#9104)
parent
f08ef64926
commit
6633a4015a
@ -0,0 +1 @@ |
||||
Add experimental support for moving off receipts and account data persistence off master. |
@ -0,0 +1,187 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# 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 synapse.http.servlet import parse_json_object_from_request |
||||
from synapse.replication.http._base import ReplicationEndpoint |
||||
|
||||
logger = logging.getLogger(__name__) |
||||
|
||||
|
||||
class ReplicationUserAccountDataRestServlet(ReplicationEndpoint): |
||||
"""Add user account data on the appropriate account data worker. |
||||
|
||||
Request format: |
||||
|
||||
POST /_synapse/replication/add_user_account_data/:user_id/:type |
||||
|
||||
{ |
||||
"content": { ... }, |
||||
} |
||||
|
||||
""" |
||||
|
||||
NAME = "add_user_account_data" |
||||
PATH_ARGS = ("user_id", "account_data_type") |
||||
CACHE = False |
||||
|
||||
def __init__(self, hs): |
||||
super().__init__(hs) |
||||
|
||||
self.handler = hs.get_account_data_handler() |
||||
self.clock = hs.get_clock() |
||||
|
||||
@staticmethod |
||||
async def _serialize_payload(user_id, account_data_type, content): |
||||
payload = { |
||||
"content": content, |
||||
} |
||||
|
||||
return payload |
||||
|
||||
async def _handle_request(self, request, user_id, account_data_type): |
||||
content = parse_json_object_from_request(request) |
||||
|
||||
max_stream_id = await self.handler.add_account_data_for_user( |
||||
user_id, account_data_type, content["content"] |
||||
) |
||||
|
||||
return 200, {"max_stream_id": max_stream_id} |
||||
|
||||
|
||||
class ReplicationRoomAccountDataRestServlet(ReplicationEndpoint): |
||||
"""Add room account data on the appropriate account data worker. |
||||
|
||||
Request format: |
||||
|
||||
POST /_synapse/replication/add_room_account_data/:user_id/:room_id/:account_data_type |
||||
|
||||
{ |
||||
"content": { ... }, |
||||
} |
||||
|
||||
""" |
||||
|
||||
NAME = "add_room_account_data" |
||||
PATH_ARGS = ("user_id", "room_id", "account_data_type") |
||||
CACHE = False |
||||
|
||||
def __init__(self, hs): |
||||
super().__init__(hs) |
||||
|
||||
self.handler = hs.get_account_data_handler() |
||||
self.clock = hs.get_clock() |
||||
|
||||
@staticmethod |
||||
async def _serialize_payload(user_id, room_id, account_data_type, content): |
||||
payload = { |
||||
"content": content, |
||||
} |
||||
|
||||
return payload |
||||
|
||||
async def _handle_request(self, request, user_id, room_id, account_data_type): |
||||
content = parse_json_object_from_request(request) |
||||
|
||||
max_stream_id = await self.handler.add_account_data_to_room( |
||||
user_id, room_id, account_data_type, content["content"] |
||||
) |
||||
|
||||
return 200, {"max_stream_id": max_stream_id} |
||||
|
||||
|
||||
class ReplicationAddTagRestServlet(ReplicationEndpoint): |
||||
"""Add tag on the appropriate account data worker. |
||||
|
||||
Request format: |
||||
|
||||
POST /_synapse/replication/add_tag/:user_id/:room_id/:tag |
||||
|
||||
{ |
||||
"content": { ... }, |
||||
} |
||||
|
||||
""" |
||||
|
||||
NAME = "add_tag" |
||||
PATH_ARGS = ("user_id", "room_id", "tag") |
||||
CACHE = False |
||||
|
||||
def __init__(self, hs): |
||||
super().__init__(hs) |
||||
|
||||
self.handler = hs.get_account_data_handler() |
||||
self.clock = hs.get_clock() |
||||
|
||||
@staticmethod |
||||
async def _serialize_payload(user_id, room_id, tag, content): |
||||
payload = { |
||||
"content": content, |
||||
} |
||||
|
||||
return payload |
||||
|
||||
async def _handle_request(self, request, user_id, room_id, tag): |
||||
content = parse_json_object_from_request(request) |
||||
|
||||
max_stream_id = await self.handler.add_tag_to_room( |
||||
user_id, room_id, tag, content["content"] |
||||
) |
||||
|
||||
return 200, {"max_stream_id": max_stream_id} |
||||
|
||||
|
||||
class ReplicationRemoveTagRestServlet(ReplicationEndpoint): |
||||
"""Remove tag on the appropriate account data worker. |
||||
|
||||
Request format: |
||||
|
||||
POST /_synapse/replication/remove_tag/:user_id/:room_id/:tag |
||||
|
||||
{} |
||||
|
||||
""" |
||||
|
||||
NAME = "remove_tag" |
||||
PATH_ARGS = ( |
||||
"user_id", |
||||
"room_id", |
||||
"tag", |
||||
) |
||||
CACHE = False |
||||
|
||||
def __init__(self, hs): |
||||
super().__init__(hs) |
||||
|
||||
self.handler = hs.get_account_data_handler() |
||||
self.clock = hs.get_clock() |
||||
|
||||
@staticmethod |
||||
async def _serialize_payload(user_id, room_id, tag): |
||||
|
||||
return {} |
||||
|
||||
async def _handle_request(self, request, user_id, room_id, tag): |
||||
max_stream_id = await self.handler.remove_tag_from_room(user_id, room_id, tag,) |
||||
|
||||
return 200, {"max_stream_id": max_stream_id} |
||||
|
||||
|
||||
def register_servlets(hs, http_server): |
||||
ReplicationUserAccountDataRestServlet(hs).register(http_server) |
||||
ReplicationRoomAccountDataRestServlet(hs).register(http_server) |
||||
ReplicationAddTagRestServlet(hs).register(http_server) |
||||
ReplicationRemoveTagRestServlet(hs).register(http_server) |
@ -0,0 +1,20 @@ |
||||
/* 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. |
||||
*/ |
||||
|
||||
ALTER TABLE room_account_data ADD COLUMN instance_name TEXT; |
||||
ALTER TABLE room_tags_revisions ADD COLUMN instance_name TEXT; |
||||
ALTER TABLE account_data ADD COLUMN instance_name TEXT; |
||||
|
||||
ALTER TABLE receipts_linearized ADD COLUMN instance_name TEXT; |
@ -0,0 +1,32 @@ |
||||
/* 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. |
||||
*/ |
||||
|
||||
CREATE SEQUENCE IF NOT EXISTS account_data_sequence; |
||||
|
||||
-- We need to take the max across all the account_data tables as they share the |
||||
-- ID generator |
||||
SELECT setval('account_data_sequence', ( |
||||
SELECT GREATEST( |
||||
(SELECT COALESCE(MAX(stream_id), 1) FROM room_account_data), |
||||
(SELECT COALESCE(MAX(stream_id), 1) FROM room_tags_revisions), |
||||
(SELECT COALESCE(MAX(stream_id), 1) FROM account_data) |
||||
) |
||||
)); |
||||
|
||||
CREATE SEQUENCE IF NOT EXISTS receipts_sequence; |
||||
|
||||
SELECT setval('receipts_sequence', ( |
||||
SELECT COALESCE(MAX(stream_id), 1) FROM receipts_linearized |
||||
)); |
Loading…
Reference in new issue