Fix /purge_history bug

This was caused by trying to insert duplicate backward extremeties
This commit is contained in:
Erik Johnston 2016-07-15 14:23:15 +01:00
parent 978fa53cc2
commit f52565de50

View File

@ -1343,7 +1343,7 @@ class EventsStore(SQLBaseStore):
# We calculate the new entries for the backward extremeties by finding # We calculate the new entries for the backward extremeties by finding
# all events that point to events that are to be purged # all events that point to events that are to be purged
txn.execute( txn.execute(
"SELECT e.event_id FROM events as e" "SELECT DISTINCT e.event_id FROM events as e"
" INNER JOIN event_edges as ed ON e.event_id = ed.prev_event_id" " INNER JOIN event_edges as ed ON e.event_id = ed.prev_event_id"
" INNER JOIN events as e2 ON e2.event_id = ed.event_id" " INNER JOIN events as e2 ON e2.event_id = ed.event_id"
" WHERE e.room_id = ? AND e.topological_ordering < ?" " WHERE e.room_id = ? AND e.topological_ordering < ?"
@ -1352,6 +1352,20 @@ class EventsStore(SQLBaseStore):
) )
new_backwards_extrems = txn.fetchall() new_backwards_extrems = txn.fetchall()
txn.execute(
"DELETE FROM event_backward_extremities WHERE room_id = ?",
(room_id,)
)
# Update backward extremeties
txn.executemany(
"INSERT INTO event_backward_extremities (room_id, event_id)"
" VALUES (?, ?)",
[
(room_id, event_id) for event_id, in new_backwards_extrems
]
)
# Get all state groups that are only referenced by events that are # Get all state groups that are only referenced by events that are
# to be deleted. # to be deleted.
txn.execute( txn.execute(
@ -1404,30 +1418,12 @@ class EventsStore(SQLBaseStore):
"event_search", "event_search",
"event_signatures", "event_signatures",
"rejections", "rejections",
"event_backward_extremities",
): ):
txn.executemany( txn.executemany(
"DELETE FROM %s WHERE event_id = ?" % (table,), "DELETE FROM %s WHERE event_id = ?" % (table,),
to_delete to_delete
) )
txn.execute(
"SELECT event_id FROM event_backward_extremities WHERE room_id = ?",
(room_id,)
)
cur_back_event_ids = [event_id for event_id, in txn.fetchall()]
# Update backward extremeties
txn.executemany(
"INSERT INTO event_backward_extremities (room_id, event_id)"
" VALUES (?, ?)",
[
(room_id, event_id) for event_id, in new_backwards_extrems
if event_id not in cur_back_event_ids
]
)
txn.executemany( txn.executemany(
"DELETE FROM events WHERE event_id = ?", "DELETE FROM events WHERE event_id = ?",
to_delete to_delete