Cache check to see if device exists

This commit is contained in:
Erik Johnston 2017-05-08 15:32:18 +01:00
parent dcabef952c
commit 738ccf61c0
1 changed files with 12 additions and 1 deletions

View File

@ -18,7 +18,7 @@ import ujson as json
from twisted.internet import defer from twisted.internet import defer
from synapse.api.errors import StoreError from synapse.api.errors import StoreError
from ._base import SQLBaseStore from ._base import SQLBaseStore, Cache
from synapse.util.caches.descriptors import cached, cachedList, cachedInlineCallbacks from synapse.util.caches.descriptors import cached, cachedList, cachedInlineCallbacks
@ -29,6 +29,12 @@ class DeviceStore(SQLBaseStore):
def __init__(self, hs): def __init__(self, hs):
super(DeviceStore, self).__init__(hs) super(DeviceStore, self).__init__(hs)
self.device_id_exists_cache = Cache(
name="device_id_exists",
keylen=2,
max_entries=10000,
)
self._clock.looping_call( self._clock.looping_call(
self._prune_old_outbound_device_pokes, 60 * 60 * 1000 self._prune_old_outbound_device_pokes, 60 * 60 * 1000
) )
@ -54,6 +60,10 @@ class DeviceStore(SQLBaseStore):
defer.Deferred: boolean whether the device was inserted or an defer.Deferred: boolean whether the device was inserted or an
existing device existed with that ID. existing device existed with that ID.
""" """
key = (user_id, device_id)
if self.device_id_exists_cache.get(key, None):
defer.returnValue(False)
try: try:
inserted = yield self._simple_insert( inserted = yield self._simple_insert(
"devices", "devices",
@ -65,6 +75,7 @@ class DeviceStore(SQLBaseStore):
desc="store_device", desc="store_device",
or_ignore=True, or_ignore=True,
) )
self.device_id_exists_cache.prefill(key, True)
defer.returnValue(inserted) defer.returnValue(inserted)
except Exception as e: except Exception as e:
logger.error("store_device with device_id=%s(%r) user_id=%s(%r)" logger.error("store_device with device_id=%s(%r) user_id=%s(%r)"