mirror of
https://github.com/element-hq/synapse
synced 2024-09-04 06:40:06 +00:00
Add stream change caches for device messages
This commit is contained in:
parent
7d893beebe
commit
31a07d2335
3 changed files with 53 additions and 1 deletions
|
@ -81,6 +81,8 @@ class TransactionQueue(object):
|
||||||
# destination -> list of tuple(failure, deferred)
|
# destination -> list of tuple(failure, deferred)
|
||||||
self.pending_failures_by_dest = {}
|
self.pending_failures_by_dest = {}
|
||||||
|
|
||||||
|
self.last_device_stream_id_by_dest = {}
|
||||||
|
|
||||||
# HACK to get unique tx id
|
# HACK to get unique tx id
|
||||||
self._next_txn_id = int(self.clock.time_msec())
|
self._next_txn_id = int(self.clock.time_msec())
|
||||||
|
|
||||||
|
@ -189,7 +191,7 @@ class TransactionQueue(object):
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def _get_new_device_messages(self, destination):
|
def _get_new_device_messages(self, destination):
|
||||||
last_device_stream_id = 0
|
last_device_stream_id = self.last_device_stream_id_by_dest.get(destination, 0)
|
||||||
to_device_stream_id = self.store.get_to_device_stream_token()
|
to_device_stream_id = self.store.get_to_device_stream_token()
|
||||||
contents, stream_id = yield self.store.get_new_device_msgs_for_remote(
|
contents, stream_id = yield self.store.get_new_device_msgs_for_remote(
|
||||||
destination, last_device_stream_id, to_device_stream_id
|
destination, last_device_stream_id, to_device_stream_id
|
||||||
|
@ -328,6 +330,7 @@ class TransactionQueue(object):
|
||||||
yield self.store.delete_device_msgs_for_remote(
|
yield self.store.delete_device_msgs_for_remote(
|
||||||
destination, device_stream_id
|
destination, device_stream_id
|
||||||
)
|
)
|
||||||
|
self.last_device_stream_id_by_dest[destination] = device_stream_id
|
||||||
except NotRetryingDestination:
|
except NotRetryingDestination:
|
||||||
logger.info(
|
logger.info(
|
||||||
"TX [%s] not ready for retry yet - "
|
"TX [%s] not ready for retry yet - "
|
||||||
|
|
|
@ -182,6 +182,30 @@ class DataStore(RoomMemberStore, RoomStore,
|
||||||
prefilled_cache=push_rules_prefill,
|
prefilled_cache=push_rules_prefill,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
max_device_inbox_id = self._device_inbox_id_gen.get_current_token()
|
||||||
|
device_inbox_prefill, min_device_inbox_id = self._get_cache_dict(
|
||||||
|
db_conn, "device_inbox",
|
||||||
|
entity_column="user_id",
|
||||||
|
stream_column="stream_id",
|
||||||
|
max_value=max_device_inbox_id
|
||||||
|
)
|
||||||
|
self._device_inbox_stream_cache = StreamChangeCache(
|
||||||
|
"DeviceInboxStreamChangeCache", min_device_inbox_id,
|
||||||
|
prefilled_cache=device_inbox_prefill,
|
||||||
|
)
|
||||||
|
# The federation outbox and the local device inbox uses the same
|
||||||
|
# stream_id generator.
|
||||||
|
device_outbox_prefill, min_device_outbox_id = self._get_cache_dict(
|
||||||
|
db_conn, "device_federation_outbox",
|
||||||
|
entity_column="destination",
|
||||||
|
stream_column="stream_id",
|
||||||
|
max_value=max_device_inbox_id,
|
||||||
|
)
|
||||||
|
self._device_federation_outbox_stream_cache = StreamChangeCache(
|
||||||
|
"DeviceInboxStreamChangeCache", min_device_outbox_id,
|
||||||
|
prefilled_cache=device_outbox_prefill,
|
||||||
|
)
|
||||||
|
|
||||||
cur = LoggingTransaction(
|
cur = LoggingTransaction(
|
||||||
db_conn.cursor(),
|
db_conn.cursor(),
|
||||||
name="_find_stream_orderings_for_times_txn",
|
name="_find_stream_orderings_for_times_txn",
|
||||||
|
|
|
@ -70,6 +70,14 @@ class DeviceInboxStore(SQLBaseStore):
|
||||||
now_ms,
|
now_ms,
|
||||||
stream_id,
|
stream_id,
|
||||||
)
|
)
|
||||||
|
for user_id in local_messages_by_user_then_device.keys():
|
||||||
|
self._device_inbox_stream_cache.entity_has_changed(
|
||||||
|
user_id, stream_id
|
||||||
|
)
|
||||||
|
for destination in remote_messages_by_destination.keys():
|
||||||
|
self._device_federation_outbox_stream_cache.entity_has_changed(
|
||||||
|
destination, stream_id
|
||||||
|
)
|
||||||
|
|
||||||
defer.returnValue(self._device_inbox_id_gen.get_current_token())
|
defer.returnValue(self._device_inbox_id_gen.get_current_token())
|
||||||
|
|
||||||
|
@ -115,6 +123,10 @@ class DeviceInboxStore(SQLBaseStore):
|
||||||
now_ms,
|
now_ms,
|
||||||
stream_id,
|
stream_id,
|
||||||
)
|
)
|
||||||
|
for user_id in local_messages_by_user_then_device.keys():
|
||||||
|
self._device_inbox_stream_cache.entity_has_changed(
|
||||||
|
user_id, stream_id
|
||||||
|
)
|
||||||
|
|
||||||
def _add_messages_to_local_device_inbox_txn(self, txn, stream_id,
|
def _add_messages_to_local_device_inbox_txn(self, txn, stream_id,
|
||||||
messages_by_user_then_device):
|
messages_by_user_then_device):
|
||||||
|
@ -161,6 +173,12 @@ class DeviceInboxStore(SQLBaseStore):
|
||||||
Deferred ([dict], int): List of messages for the device and where
|
Deferred ([dict], int): List of messages for the device and where
|
||||||
in the stream the messages got to.
|
in the stream the messages got to.
|
||||||
"""
|
"""
|
||||||
|
has_changed = self._device_inbox_stream_cache.has_entity_changed(
|
||||||
|
user_id, last_stream_id
|
||||||
|
)
|
||||||
|
if not has_changed:
|
||||||
|
return defer.succeed(([], current_stream_id))
|
||||||
|
|
||||||
def get_new_messages_for_device_txn(txn):
|
def get_new_messages_for_device_txn(txn):
|
||||||
sql = (
|
sql = (
|
||||||
"SELECT stream_id, message_json FROM device_inbox"
|
"SELECT stream_id, message_json FROM device_inbox"
|
||||||
|
@ -261,6 +279,13 @@ class DeviceInboxStore(SQLBaseStore):
|
||||||
Deferred ([dict], int): List of messages for the device and where
|
Deferred ([dict], int): List of messages for the device and where
|
||||||
in the stream the messages got to.
|
in the stream the messages got to.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
has_changed = self._device_federation_outbox_stream_cache.has_entity_changed(
|
||||||
|
destination, last_stream_id
|
||||||
|
)
|
||||||
|
if not has_changed:
|
||||||
|
return defer.succeed(([], current_stream_id))
|
||||||
|
|
||||||
def get_new_messages_for_remote_destination_txn(txn):
|
def get_new_messages_for_remote_destination_txn(txn):
|
||||||
sql = (
|
sql = (
|
||||||
"SELECT stream_id, messages_json FROM device_federation_outbox"
|
"SELECT stream_id, messages_json FROM device_federation_outbox"
|
||||||
|
|
Loading…
Reference in a new issue