Add a worker store for search insertion. (#7516)
This is required as both event persistence and the background update needs access to this function. It should be perfectly safe for two workers to write to that table at the same time.
This commit is contained in:
parent
16090a077f
commit
03aff4c75e
|
@ -0,0 +1 @@
|
||||||
|
Add a worker store for search insertion, required for moving event persistence off master.
|
|
@ -122,6 +122,7 @@ from synapse.storage.data_stores.main.monthly_active_users import (
|
||||||
MonthlyActiveUsersWorkerStore,
|
MonthlyActiveUsersWorkerStore,
|
||||||
)
|
)
|
||||||
from synapse.storage.data_stores.main.presence import UserPresenceState
|
from synapse.storage.data_stores.main.presence import UserPresenceState
|
||||||
|
from synapse.storage.data_stores.main.search import SearchWorkerStore
|
||||||
from synapse.storage.data_stores.main.ui_auth import UIAuthWorkerStore
|
from synapse.storage.data_stores.main.ui_auth import UIAuthWorkerStore
|
||||||
from synapse.storage.data_stores.main.user_directory import UserDirectoryStore
|
from synapse.storage.data_stores.main.user_directory import UserDirectoryStore
|
||||||
from synapse.types import ReadReceipt
|
from synapse.types import ReadReceipt
|
||||||
|
@ -451,6 +452,7 @@ class GenericWorkerSlavedStore(
|
||||||
SlavedFilteringStore,
|
SlavedFilteringStore,
|
||||||
MonthlyActiveUsersWorkerStore,
|
MonthlyActiveUsersWorkerStore,
|
||||||
MediaRepositoryStore,
|
MediaRepositoryStore,
|
||||||
|
SearchWorkerStore,
|
||||||
BaseSlavedStore,
|
BaseSlavedStore,
|
||||||
):
|
):
|
||||||
def __init__(self, database, db_conn, hs):
|
def __init__(self, database, db_conn, hs):
|
||||||
|
|
|
@ -37,7 +37,55 @@ SearchEntry = namedtuple(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class SearchBackgroundUpdateStore(SQLBaseStore):
|
class SearchWorkerStore(SQLBaseStore):
|
||||||
|
def store_search_entries_txn(self, txn, entries):
|
||||||
|
"""Add entries to the search table
|
||||||
|
|
||||||
|
Args:
|
||||||
|
txn (cursor):
|
||||||
|
entries (iterable[SearchEntry]):
|
||||||
|
entries to be added to the table
|
||||||
|
"""
|
||||||
|
if not self.hs.config.enable_search:
|
||||||
|
return
|
||||||
|
if isinstance(self.database_engine, PostgresEngine):
|
||||||
|
sql = (
|
||||||
|
"INSERT INTO event_search"
|
||||||
|
" (event_id, room_id, key, vector, stream_ordering, origin_server_ts)"
|
||||||
|
" VALUES (?,?,?,to_tsvector('english', ?),?,?)"
|
||||||
|
)
|
||||||
|
|
||||||
|
args = (
|
||||||
|
(
|
||||||
|
entry.event_id,
|
||||||
|
entry.room_id,
|
||||||
|
entry.key,
|
||||||
|
entry.value,
|
||||||
|
entry.stream_ordering,
|
||||||
|
entry.origin_server_ts,
|
||||||
|
)
|
||||||
|
for entry in entries
|
||||||
|
)
|
||||||
|
|
||||||
|
txn.executemany(sql, args)
|
||||||
|
|
||||||
|
elif isinstance(self.database_engine, Sqlite3Engine):
|
||||||
|
sql = (
|
||||||
|
"INSERT INTO event_search (event_id, room_id, key, value)"
|
||||||
|
" VALUES (?,?,?,?)"
|
||||||
|
)
|
||||||
|
args = (
|
||||||
|
(entry.event_id, entry.room_id, entry.key, entry.value)
|
||||||
|
for entry in entries
|
||||||
|
)
|
||||||
|
|
||||||
|
txn.executemany(sql, args)
|
||||||
|
else:
|
||||||
|
# This should be unreachable.
|
||||||
|
raise Exception("Unrecognized database engine")
|
||||||
|
|
||||||
|
|
||||||
|
class SearchBackgroundUpdateStore(SearchWorkerStore):
|
||||||
|
|
||||||
EVENT_SEARCH_UPDATE_NAME = "event_search"
|
EVENT_SEARCH_UPDATE_NAME = "event_search"
|
||||||
EVENT_SEARCH_ORDER_UPDATE_NAME = "event_search_order"
|
EVENT_SEARCH_ORDER_UPDATE_NAME = "event_search_order"
|
||||||
|
@ -296,52 +344,6 @@ class SearchBackgroundUpdateStore(SQLBaseStore):
|
||||||
|
|
||||||
return num_rows
|
return num_rows
|
||||||
|
|
||||||
def store_search_entries_txn(self, txn, entries):
|
|
||||||
"""Add entries to the search table
|
|
||||||
|
|
||||||
Args:
|
|
||||||
txn (cursor):
|
|
||||||
entries (iterable[SearchEntry]):
|
|
||||||
entries to be added to the table
|
|
||||||
"""
|
|
||||||
if not self.hs.config.enable_search:
|
|
||||||
return
|
|
||||||
if isinstance(self.database_engine, PostgresEngine):
|
|
||||||
sql = (
|
|
||||||
"INSERT INTO event_search"
|
|
||||||
" (event_id, room_id, key, vector, stream_ordering, origin_server_ts)"
|
|
||||||
" VALUES (?,?,?,to_tsvector('english', ?),?,?)"
|
|
||||||
)
|
|
||||||
|
|
||||||
args = (
|
|
||||||
(
|
|
||||||
entry.event_id,
|
|
||||||
entry.room_id,
|
|
||||||
entry.key,
|
|
||||||
entry.value,
|
|
||||||
entry.stream_ordering,
|
|
||||||
entry.origin_server_ts,
|
|
||||||
)
|
|
||||||
for entry in entries
|
|
||||||
)
|
|
||||||
|
|
||||||
txn.executemany(sql, args)
|
|
||||||
|
|
||||||
elif isinstance(self.database_engine, Sqlite3Engine):
|
|
||||||
sql = (
|
|
||||||
"INSERT INTO event_search (event_id, room_id, key, value)"
|
|
||||||
" VALUES (?,?,?,?)"
|
|
||||||
)
|
|
||||||
args = (
|
|
||||||
(entry.event_id, entry.room_id, entry.key, entry.value)
|
|
||||||
for entry in entries
|
|
||||||
)
|
|
||||||
|
|
||||||
txn.executemany(sql, args)
|
|
||||||
else:
|
|
||||||
# This should be unreachable.
|
|
||||||
raise Exception("Unrecognized database engine")
|
|
||||||
|
|
||||||
|
|
||||||
class SearchStore(SearchBackgroundUpdateStore):
|
class SearchStore(SearchBackgroundUpdateStore):
|
||||||
def __init__(self, database: Database, db_conn, hs):
|
def __init__(self, database: Database, db_conn, hs):
|
||||||
|
|
Loading…
Reference in New Issue