GIN reindex: Fix syntax errors, improve exception handling

This commit is contained in:
Richard van der Hoff 2018-02-02 15:25:27 +00:00
parent 6b02fc80d1
commit 4a6d551704
1 changed files with 27 additions and 13 deletions

View File

@ -157,29 +157,43 @@ class SearchStore(BackgroundUpdateStore):
@defer.inlineCallbacks
def _background_reindex_gin_search(self, progress, batch_size):
'''This handles old synapses which used GIST indexes, if any;
"""This handles old synapses which used GIST indexes, if any;
converting them back to be GIN as per the actual schema.
'''
"""
def create_index(conn):
try:
conn.rollback()
# we have to set autocommit, because postgres refuses to
# CREATE INDEX CONCURRENTLY without it.
conn.set_session(autocommit=True)
try:
c = conn.cursor()
# if we skipped the conversion to GIST, we may already/still
# have an event_search_fts_idx; unfortunately postgres 9.4
# doesn't support CREATE INDEX IF EXISTS so we just catch the
# exception and ignore it.
import psycopg2
try:
c.execute(
"CREATE INDEX CONCURRENTLY event_search_fts_idx"
" ON event_search USING GIN (vector)"
)
c.execute("DROP INDEX event_search_fts_idx_gist")
conn.set_session(autocommit=False)
except e:
except psycopg2.ProgrammingError as e:
logger.warn(
"Ignoring error %s when trying to switch from GIST to GIN" % (e,)
"Ignoring error %r when trying to switch from GIST to GIN",
e
)
# we should now be able to delete the GIST index.
c.execute(
"DROP INDEX IF EXISTS event_search_fts_idx_gist"
)
finally:
conn.set_session(autocommit=False)
if isinstance(self.database_engine, PostgresEngine):
yield self.runWithConnection(create_index)