mirror of
https://github.com/element-hq/synapse
synced 2024-09-01 07:30:21 +00:00
purge_history: handle sqlite asshattery
apparently creating a temporary table commits the transaction. because that's a useful thing.
This commit is contained in:
parent
278d21b5e4
commit
ac27f6a35e
1 changed files with 27 additions and 19 deletions
|
@ -2093,6 +2093,27 @@ class EventsStore(SQLBaseStore):
|
||||||
# state_groups
|
# state_groups
|
||||||
# state_groups_state
|
# state_groups_state
|
||||||
|
|
||||||
|
# we will build a temporary table listing the events so that we don't
|
||||||
|
# have to keep shovelling the list back and forth across the
|
||||||
|
# connection. Annoyingly the python sqlite driver commits the
|
||||||
|
# transaction on CREATE, so let's do this first.
|
||||||
|
#
|
||||||
|
# furthermore, we might already have the table from a previous (failed)
|
||||||
|
# purge attempt, so let's drop the table first.
|
||||||
|
|
||||||
|
txn.execute("DROP TABLE IF EXISTS events_to_purge")
|
||||||
|
|
||||||
|
txn.execute(
|
||||||
|
"CREATE TEMPORARY TABLE events_to_purge ("
|
||||||
|
" event_id TEXT NOT NULL,"
|
||||||
|
" should_delete BOOLEAN NOT NULL"
|
||||||
|
")"
|
||||||
|
)
|
||||||
|
|
||||||
|
# create an index on should_delete because later we'll be looking for
|
||||||
|
# the should_delete / shouldn't_delete subsets
|
||||||
|
txn.execute("CREATE INDEX ON events_to_purge(should_delete)")
|
||||||
|
|
||||||
# First ensure that we're not about to delete all the forward extremeties
|
# First ensure that we're not about to delete all the forward extremeties
|
||||||
txn.execute(
|
txn.execute(
|
||||||
"SELECT e.event_id, e.depth FROM events as e "
|
"SELECT e.event_id, e.depth FROM events as e "
|
||||||
|
@ -2115,20 +2136,6 @@ class EventsStore(SQLBaseStore):
|
||||||
|
|
||||||
logger.info("[purge] looking for events to delete")
|
logger.info("[purge] looking for events to delete")
|
||||||
|
|
||||||
# we build a temporary table listing the events so that we don't have
|
|
||||||
# to keep shovelling the list back and forth across the connection.
|
|
||||||
|
|
||||||
txn.execute(
|
|
||||||
"CREATE TEMPORARY TABLE events_to_purge ("
|
|
||||||
" event_id TEXT NOT NULL,"
|
|
||||||
" should_delete BOOLEAN NOT NULL"
|
|
||||||
")"
|
|
||||||
)
|
|
||||||
|
|
||||||
# create an index on should_delete because later we'll be looking for
|
|
||||||
# the should_delete / shouldn't_delete subsets
|
|
||||||
txn.execute("CREATE INDEX ON events_to_purge(should_delete)")
|
|
||||||
|
|
||||||
should_delete_expr = "state_key IS NULL"
|
should_delete_expr = "state_key IS NULL"
|
||||||
should_delete_params = ()
|
should_delete_params = ()
|
||||||
if not delete_local_events:
|
if not delete_local_events:
|
||||||
|
@ -2339,11 +2346,6 @@ class EventsStore(SQLBaseStore):
|
||||||
(True,),
|
(True,),
|
||||||
)
|
)
|
||||||
|
|
||||||
# we're now done with the temporary table
|
|
||||||
txn.execute(
|
|
||||||
"DROP TABLE events_to_purge"
|
|
||||||
)
|
|
||||||
|
|
||||||
# synapse tries to take out an exclusive lock on room_depth whenever it
|
# synapse tries to take out an exclusive lock on room_depth whenever it
|
||||||
# persists events (because upsert), and once we run this update, we
|
# persists events (because upsert), and once we run this update, we
|
||||||
# will block that for the rest of our transaction.
|
# will block that for the rest of our transaction.
|
||||||
|
@ -2356,6 +2358,12 @@ class EventsStore(SQLBaseStore):
|
||||||
(topological_ordering, room_id,)
|
(topological_ordering, room_id,)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# finally, drop the temp table. this will commit the txn in sqlite,
|
||||||
|
# so make sure to keep this actually last.
|
||||||
|
txn.execute(
|
||||||
|
"DROP TABLE events_to_purge"
|
||||||
|
)
|
||||||
|
|
||||||
logger.info("[purge] done")
|
logger.info("[purge] done")
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
|
|
Loading…
Reference in a new issue