diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py
index a86908695d..96969974c8 100644
--- a/synapse/handlers/room.py
+++ b/synapse/handlers/room.py
@@ -255,17 +255,8 @@ class RoomMemberHandler(BaseHandler):
self.distributor.declare("user_joined_room")
self.distributor.declare("user_left_room")
- @defer.inlineCallbacks
def get_room_members(self, room_id):
- users = yield self.store.get_users_in_room(room_id)
-
- start = time.time()
- users = [UserID.from_string(u) for u in users]
- end = time.time()
-
- RoomMemberHandler.total_time += end-start
-
- defer.returnValue(users)
+ return self.store.get_user_objs_in_room(room_id)
@defer.inlineCallbacks
def fetch_room_distributions_into(self, room_id, localusers=None,
diff --git a/synapse/storage/events.py b/synapse/storage/events.py
index 20a8d81794..79cb52beb0 100644
--- a/synapse/storage/events.py
+++ b/synapse/storage/events.py
@@ -128,6 +128,7 @@ class EventsStore(SQLBaseStore):
txn.call_after(self.get_current_state_for_key.invalidate_all)
txn.call_after(self.get_rooms_for_user.invalidate_all)
txn.call_after(self.get_users_in_room.invalidate, event.room_id)
+ txn.call_after(self.get_user_objs_in_room.invalidate, event.room_id)
txn.call_after(self.get_joined_hosts_for_room.invalidate, event.room_id)
txn.call_after(self.get_room_name_and_aliases, event.room_id)
diff --git a/synapse/storage/roommember.py b/synapse/storage/roommember.py
index d36a6c18a8..2c879d56d6 100644
--- a/synapse/storage/roommember.py
+++ b/synapse/storage/roommember.py
@@ -67,6 +67,7 @@ class RoomMemberStore(SQLBaseStore):
txn.call_after(self.get_rooms_for_user.invalidate, target_user_id)
txn.call_after(self.get_joined_hosts_for_room.invalidate, event.room_id)
txn.call_after(self.get_users_in_room.invalidate, event.room_id)
+ txn.call_after(self.get_user_objs_in_room.invalidate, event.room_id)
def get_room_member(self, user_id, room_id):
"""Retrieve the current state of a room member.
@@ -101,6 +102,12 @@ class RoomMemberStore(SQLBaseStore):
return [r["user_id"] for r in rows]
return self.runInteraction("get_users_in_room", f)
+ @cached()
+ def get_user_objs_in_room(self, room_id):
+ return self.get_users_in_room(room_id).addCallback(
+ lambda users: [UserID.from_string(u) for u in users]
+ )
+
def get_room_members(self, room_id, membership=None):
"""Retrieve the current room member list for a room.
|