Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Merge pull request #2688 from matrix-org/rav/unlock_more_upsert
Browse files Browse the repository at this point in the history
Avoid locking for upsert on pushers tables
  • Loading branch information
richvdh authored Nov 17, 2017
2 parents d8a0541 + 06e5bcf commit 59a7275
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 5 deletions.
21 changes: 16 additions & 5 deletions synapse/storage/pusher.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,11 +244,19 @@ def delete_pusher_txn(txn, stream_id):
"pushers",
{"app_id": app_id, "pushkey": pushkey, "user_name": user_id}
)
self._simple_upsert_txn(

# it's possible for us to end up with duplicate rows for
# (app_id, pushkey, user_id) at different stream_ids, but that
# doesn't really matter.
self._simple_insert_txn(
txn,
"deleted_pushers",
{"app_id": app_id, "pushkey": pushkey, "user_id": user_id},
{"stream_id": stream_id},
table="deleted_pushers",
values={
"stream_id": stream_id,
"app_id": app_id,
"pushkey": pushkey,
"user_id": user_id,
},
)

with self._pushers_id_gen.get_next() as stream_id:
Expand Down Expand Up @@ -311,9 +319,12 @@ def get_throttle_params_by_room(self, pusher_id):

@defer.inlineCallbacks
def set_throttle_params(self, pusher_id, room_id, params):
# no need to lock because `pusher_throttle` has a primary key on
# (pusher, room_id) so _simple_upsert will retry
yield self._simple_upsert(
"pusher_throttle",
{"pusher": pusher_id, "room_id": room_id},
params,
desc="set_throttle_params"
desc="set_throttle_params",
lock=False,
)
35 changes: 35 additions & 0 deletions synapse/storage/schema/delta/46/drop_unique_deleted_pushers.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/* Copyright 2017 New Vector Ltd
*
* 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.
*/

-- drop the unique constraint on deleted_pushers so that we can just insert
-- into it rather than upserting.

CREATE TABLE deleted_pushers2 (
stream_id BIGINT NOT NULL,
app_id TEXT NOT NULL,
pushkey TEXT NOT NULL,
user_id TEXT NOT NULL
);

INSERT INTO deleted_pushers2 (stream_id, app_id, pushkey, user_id)
SELECT stream_id, app_id, pushkey, user_id from deleted_pushers;

DROP TABLE deleted_pushers;
ALTER TABLE deleted_pushers2 RENAME TO deleted_pushers;

-- create the index after doing the inserts because that's more efficient.
-- it also means we can give it the same name as the old one without renaming.
CREATE INDEX deleted_pushers_stream_id ON deleted_pushers (stream_id);

0 comments on commit 59a7275

Please sign in to comment.