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

View File

@ -157,28 +157,42 @@ class SearchStore(BackgroundUpdateStore):
@defer.inlineCallbacks @defer.inlineCallbacks
def _background_reindex_gin_search(self, progress, batch_size): 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. converting them back to be GIN as per the actual schema.
''' """
def create_index(conn): def create_index(conn):
conn.rollback()
# we have to set autocommit, because postgres refuses to
# CREATE INDEX CONCURRENTLY without it.
conn.set_session(autocommit=True)
try: try:
conn.rollback()
conn.set_session(autocommit=True)
c = conn.cursor() 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)"
)
except psycopg2.ProgrammingError as e:
logger.warn(
"Ignoring error %r when trying to switch from GIST to GIN",
e
)
# we should now be able to delete the GIST index.
c.execute( c.execute(
"CREATE INDEX CONCURRENTLY event_search_fts_idx" "DROP INDEX IF EXISTS event_search_fts_idx_gist"
" ON event_search USING GIN (vector)"
) )
finally:
c.execute("DROP INDEX event_search_fts_idx_gist")
conn.set_session(autocommit=False) conn.set_session(autocommit=False)
except e:
logger.warn(
"Ignoring error %s when trying to switch from GIST to GIN" % (e,)
)
if isinstance(self.database_engine, PostgresEngine): if isinstance(self.database_engine, PostgresEngine):
yield self.runWithConnection(create_index) yield self.runWithConnection(create_index)