Skip to content
Snippets Groups Projects
Commit 75daede9 authored by Erik Johnston's avatar Erik Johnston
Browse files

String intern

parent fbdeb177
No related branches found
No related tags found
No related merge requests found
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
from ._base import SQLBaseStore from ._base import SQLBaseStore
from synapse.util.caches.descriptors import cached, cachedList from synapse.util.caches.descriptors import cached, cachedList
from synapse.util.caches import intern_string
from twisted.internet import defer from twisted.internet import defer
...@@ -155,7 +156,9 @@ class StateStore(SQLBaseStore): ...@@ -155,7 +156,9 @@ class StateStore(SQLBaseStore):
@defer.inlineCallbacks @defer.inlineCallbacks
def get_current_state_for_key(self, room_id, event_type, state_key): def get_current_state_for_key(self, room_id, event_type, state_key):
event_ids = yield self._get_current_state_for_key(room_id, event_type, state_key) event_ids = yield self._get_current_state_for_key(
room_id, intern_string(event_type), intern_string(state_key)
)
events = yield self._get_events(event_ids, get_prev_content=False) events = yield self._get_events(event_ids, get_prev_content=False)
defer.returnValue(events) defer.returnValue(events)
...@@ -202,7 +205,7 @@ class StateStore(SQLBaseStore): ...@@ -202,7 +205,7 @@ class StateStore(SQLBaseStore):
results = {} results = {}
for row in rows: for row in rows:
key = (row["type"], row["state_key"]) key = (intern_string(row["type"]), intern_string(row["state_key"]))
results.setdefault(row["state_group"], {})[key] = row["event_id"] results.setdefault(row["state_group"], {})[key] = row["event_id"]
return results return results
...@@ -393,7 +396,10 @@ class StateStore(SQLBaseStore): ...@@ -393,7 +396,10 @@ class StateStore(SQLBaseStore):
# cache absence of the key, on the assumption that if we've # cache absence of the key, on the assumption that if we've
# explicitly asked for some types then we will probably ask # explicitly asked for some types then we will probably ask
# for them again. # for them again.
state_dict = {key: None for key in types} state_dict = {
(intern_string(etype), intern_string(state_key)): None
for (etype, state_key) in types
}
state_dict.update(results[group]) state_dict.update(results[group])
results[group] = state_dict results[group] = state_dict
else: else:
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
# limitations under the License. # limitations under the License.
import synapse.metrics import synapse.metrics
from lrucache import LruCache
DEBUG_CACHES = False DEBUG_CACHES = False
...@@ -25,3 +26,10 @@ cache_counter = metrics.register_cache( ...@@ -25,3 +26,10 @@ cache_counter = metrics.register_cache(
lambda: {(name,): len(caches_by_name[name]) for name in caches_by_name.keys()}, lambda: {(name,): len(caches_by_name[name]) for name in caches_by_name.keys()},
labels=["name"], labels=["name"],
) )
_string_cache = LruCache(5000)
caches_by_name["string_cache"] = _string_cache
def intern_string(string):
return _string_cache.setdefault(string, string)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment