mirror of
https://git.anonymousland.org/anonymousland/synapse-product.git
synced 2024-10-01 08:25:44 -04:00
Merge pull request #1976 from matrix-org/erikj/device_delete_sync
Noop repated delete device inbox calls from /sync
This commit is contained in:
commit
3872c7a107
@ -609,14 +609,14 @@ class SyncHandler(object):
|
|||||||
deleted = yield self.store.delete_messages_for_device(
|
deleted = yield self.store.delete_messages_for_device(
|
||||||
user_id, device_id, since_stream_id
|
user_id, device_id, since_stream_id
|
||||||
)
|
)
|
||||||
logger.info("Deleted %d to-device messages up to %d",
|
logger.debug("Deleted %d to-device messages up to %d",
|
||||||
deleted, since_stream_id)
|
deleted, since_stream_id)
|
||||||
|
|
||||||
messages, stream_id = yield self.store.get_new_messages_for_device(
|
messages, stream_id = yield self.store.get_new_messages_for_device(
|
||||||
user_id, device_id, since_stream_id, now_token.to_device_key
|
user_id, device_id, since_stream_id, now_token.to_device_key
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info(
|
logger.debug(
|
||||||
"Returning %d to-device messages between %d and %d (current token: %d)",
|
"Returning %d to-device messages between %d and %d (current token: %d)",
|
||||||
len(messages), since_stream_id, stream_id, now_token.to_device_key
|
len(messages), since_stream_id, stream_id, now_token.to_device_key
|
||||||
)
|
)
|
||||||
|
@ -17,6 +17,7 @@ from ._base import BaseSlavedStore
|
|||||||
from ._slaved_id_tracker import SlavedIdTracker
|
from ._slaved_id_tracker import SlavedIdTracker
|
||||||
from synapse.storage import DataStore
|
from synapse.storage import DataStore
|
||||||
from synapse.util.caches.stream_change_cache import StreamChangeCache
|
from synapse.util.caches.stream_change_cache import StreamChangeCache
|
||||||
|
from synapse.util.caches.expiringcache import ExpiringCache
|
||||||
|
|
||||||
|
|
||||||
class SlavedDeviceInboxStore(BaseSlavedStore):
|
class SlavedDeviceInboxStore(BaseSlavedStore):
|
||||||
@ -34,6 +35,13 @@ class SlavedDeviceInboxStore(BaseSlavedStore):
|
|||||||
self._device_inbox_id_gen.get_current_token()
|
self._device_inbox_id_gen.get_current_token()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self._last_device_delete_cache = ExpiringCache(
|
||||||
|
cache_name="last_device_delete_cache",
|
||||||
|
clock=self._clock,
|
||||||
|
max_len=10000,
|
||||||
|
expiry_ms=30 * 60 * 1000,
|
||||||
|
)
|
||||||
|
|
||||||
get_to_device_stream_token = DataStore.get_to_device_stream_token.__func__
|
get_to_device_stream_token = DataStore.get_to_device_stream_token.__func__
|
||||||
get_new_messages_for_device = DataStore.get_new_messages_for_device.__func__
|
get_new_messages_for_device = DataStore.get_new_messages_for_device.__func__
|
||||||
get_new_device_msgs_for_remote = DataStore.get_new_device_msgs_for_remote.__func__
|
get_new_device_msgs_for_remote = DataStore.get_new_device_msgs_for_remote.__func__
|
||||||
|
@ -20,6 +20,8 @@ from twisted.internet import defer
|
|||||||
|
|
||||||
from .background_updates import BackgroundUpdateStore
|
from .background_updates import BackgroundUpdateStore
|
||||||
|
|
||||||
|
from synapse.util.caches.expiringcache import ExpiringCache
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -42,6 +44,15 @@ class DeviceInboxStore(BackgroundUpdateStore):
|
|||||||
self._background_drop_index_device_inbox,
|
self._background_drop_index_device_inbox,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Map of (user_id, device_id) to the last stream_id that has been
|
||||||
|
# deleted up to. This is so that we can no op deletions.
|
||||||
|
self._last_device_delete_cache = ExpiringCache(
|
||||||
|
cache_name="last_device_delete_cache",
|
||||||
|
clock=self._clock,
|
||||||
|
max_len=10000,
|
||||||
|
expiry_ms=30 * 60 * 1000,
|
||||||
|
)
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def add_messages_to_device_inbox(self, local_messages_by_user_then_device,
|
def add_messages_to_device_inbox(self, local_messages_by_user_then_device,
|
||||||
remote_messages_by_destination):
|
remote_messages_by_destination):
|
||||||
@ -251,6 +262,7 @@ class DeviceInboxStore(BackgroundUpdateStore):
|
|||||||
"get_new_messages_for_device", get_new_messages_for_device_txn,
|
"get_new_messages_for_device", get_new_messages_for_device_txn,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
def delete_messages_for_device(self, user_id, device_id, up_to_stream_id):
|
def delete_messages_for_device(self, user_id, device_id, up_to_stream_id):
|
||||||
"""
|
"""
|
||||||
Args:
|
Args:
|
||||||
@ -260,6 +272,18 @@ class DeviceInboxStore(BackgroundUpdateStore):
|
|||||||
Returns:
|
Returns:
|
||||||
A deferred that resolves to the number of messages deleted.
|
A deferred that resolves to the number of messages deleted.
|
||||||
"""
|
"""
|
||||||
|
# If we have cached the last stream id we've deleted up to, we can
|
||||||
|
# check if there is likely to be anything that needs deleting
|
||||||
|
last_deleted_stream_id = self._last_device_delete_cache.get(
|
||||||
|
(user_id, device_id), None
|
||||||
|
)
|
||||||
|
if last_deleted_stream_id:
|
||||||
|
has_changed = self._device_inbox_stream_cache.has_entity_changed(
|
||||||
|
user_id, last_deleted_stream_id
|
||||||
|
)
|
||||||
|
if not has_changed:
|
||||||
|
defer.returnValue(0)
|
||||||
|
|
||||||
def delete_messages_for_device_txn(txn):
|
def delete_messages_for_device_txn(txn):
|
||||||
sql = (
|
sql = (
|
||||||
"DELETE FROM device_inbox"
|
"DELETE FROM device_inbox"
|
||||||
@ -269,10 +293,20 @@ class DeviceInboxStore(BackgroundUpdateStore):
|
|||||||
txn.execute(sql, (user_id, device_id, up_to_stream_id))
|
txn.execute(sql, (user_id, device_id, up_to_stream_id))
|
||||||
return txn.rowcount
|
return txn.rowcount
|
||||||
|
|
||||||
return self.runInteraction(
|
count = yield self.runInteraction(
|
||||||
"delete_messages_for_device", delete_messages_for_device_txn
|
"delete_messages_for_device", delete_messages_for_device_txn
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Update the cache, ensuring that we only ever increase the value
|
||||||
|
last_deleted_stream_id = self._last_device_delete_cache.get(
|
||||||
|
(user_id, device_id), 0
|
||||||
|
)
|
||||||
|
self._last_device_delete_cache[(user_id, device_id)] = max(
|
||||||
|
last_deleted_stream_id, up_to_stream_id
|
||||||
|
)
|
||||||
|
|
||||||
|
defer.returnValue(count)
|
||||||
|
|
||||||
def get_all_new_device_messages(self, last_pos, current_pos, limit):
|
def get_all_new_device_messages(self, last_pos, current_pos, limit):
|
||||||
"""
|
"""
|
||||||
Args:
|
Args:
|
||||||
|
Loading…
Reference in New Issue
Block a user