summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthew Hodgson <matthew@matrix.org>2017-11-30 01:17:15 +0000
committerMatthew Hodgson <matthew@matrix.org>2017-11-30 01:17:15 +0000
commita4bb133b6880c6adffce5feef3681504730cd484 (patch)
tree501acc1ed6ada420470ef2bf2452aaecb659ab4e
parentkick the user_directory index when new users register (diff)
downloadsynapse-a4bb133b6880c6adffce5feef3681504730cd484.tar.xz
fix thinkos galore
-rw-r--r--synapse/handlers/user_directory.py10
-rw-r--r--synapse/storage/profile.py31
-rw-r--r--synapse/storage/user_directory.py20
3 files changed, 41 insertions, 20 deletions
diff --git a/synapse/handlers/user_directory.py b/synapse/handlers/user_directory.py
index 1769e84698..b902f5d4e6 100644
--- a/synapse/handlers/user_directory.py
+++ b/synapse/handlers/user_directory.py
@@ -20,6 +20,7 @@ from synapse.api.constants import EventTypes, JoinRules, Membership
 from synapse.storage.roommember import ProfileInfo
 from synapse.util.metrics import Measure
 from synapse.util.async import sleep
+from synapse.types import get_localpart_from_id
 
 
 logger = logging.getLogger(__name__)
@@ -53,6 +54,7 @@ class UserDirectoryHandler(object):
         self.notifier = hs.get_notifier()
         self.is_mine_id = hs.is_mine_id
         self.update_user_directory = hs.config.update_user_directory
+        self.include_pattern = hs.config.user_directory_include_pattern
 
         # When start up for the first time we need to populate the user_directory.
         # This is a set of user_id's we've inserted already
@@ -116,7 +118,7 @@ class UserDirectoryHandler(object):
         irrespective of any rooms the user may be in.
         """
         yield self.store.update_profile_in_user_dir(
-            user_id, profile.display_name, profile.avatar_url,
+            user_id, profile.display_name, profile.avatar_url, None,
         )
 
     @defer.inlineCallbacks
@@ -167,10 +169,10 @@ class UserDirectoryHandler(object):
 
         logger.info("Processed all rooms.")
 
-        if self.hs.config.user_directory_include_pattern:
-            logger.info("Doing initial update of user directory. %d users", len(user_ids))
+        if self.include_pattern:
             num_processed_users = 0
             user_ids = yield self.store.get_all_local_users()
+            logger.info("Doing initial update of user directory. %d users", len(user_ids))
             for user_id in user_ids:
                 # We add profiles for all users even if they don't match the
                 # include pattern, just in case we want to change it in future
@@ -415,7 +417,7 @@ class UserDirectoryHandler(object):
         """
         logger.debug("Adding new local user to dir, %r", user_id)
 
-        profile = yield self.store.get_profileinfo(user_id)
+        profile = yield self.store.get_profileinfo(get_localpart_from_id(user_id))
 
         row = yield self.store.get_user_in_directory(user_id)
         if not row:
diff --git a/synapse/storage/profile.py b/synapse/storage/profile.py
index 484ad59b62..4e7b7c253b 100644
--- a/synapse/storage/profile.py
+++ b/synapse/storage/profile.py
@@ -16,6 +16,7 @@
 from twisted.internet import defer
 
 from synapse.storage.roommember import ProfileInfo
+from synapse.api.errors import StoreError
 
 from ._base import SQLBaseStore
 
@@ -28,16 +29,28 @@ class ProfileStore(SQLBaseStore):
             desc="create_profile",
         )
 
+    @defer.inlineCallbacks
     def get_profileinfo(self, user_localpart):
-        profile = self._simple_select_one(
-            table="profiles",
-            keyvalues={"user_id": user_localpart},
-            retcols=("displayname", "avatar_url"),
-            desc="get_profileinfo",
-        )
-        return ProfileInfo(
-            avatar_url=profile.avatar_url,
-            displayname=profile.displayname,
+        try:
+            profile = yield self._simple_select_one(
+                table="profiles",
+                keyvalues={"user_id": user_localpart},
+                retcols=("displayname", "avatar_url"),
+                desc="get_profileinfo",
+            )
+        except StoreError, e:
+            if e.code == 404:
+                # no match
+                defer.returnValue(ProfileInfo(None, None))
+                return
+            else:
+                raise
+
+        defer.returnValue(
+            ProfileInfo(
+                avatar_url=profile['avatar_url'],
+                display_name=profile['displayname'],
+            )
         )
 
     def get_profile_displayname(self, user_localpart):
diff --git a/synapse/storage/user_directory.py b/synapse/storage/user_directory.py
index 1cc73e3878..d8c9657125 100644
--- a/synapse/storage/user_directory.py
+++ b/synapse/storage/user_directory.py
@@ -640,13 +640,17 @@ class UserDirectoryStore(SQLBaseStore):
                 }
         """
 
-        include_pattern_clause = ""
+        include_pattern_join = ""
+        include_pattern_where_clause = ""
         if self.hs.config.user_directory_include_pattern:
-            include_pattern_clause = "OR d.user_id LIKE '%s'" % (
-                self.hs.config.user_directory_include_pattern
-            )
+            include_pattern_join = """
+                LEFT JOIN (
+                    SELECT user_id FROM user_directory
+                    WHERE user_id LIKE '%s'
+                ) AS ld USING (user_id)
+            """ % ( self.hs.config.user_directory_include_pattern )
 
-        logger.error("include pattern is %s" % (include_pattern))
+            include_pattern_where_clause = "OR ld.user_id IS NOT NULL"
 
         if isinstance(self.database_engine, PostgresEngine):
             full_query, exact_query, prefix_query = _parse_query_postgres(search_term)
@@ -665,6 +669,7 @@ class UserDirectoryStore(SQLBaseStore):
                     SELECT other_user_id AS user_id FROM users_who_share_rooms
                     WHERE user_id = ? AND share_private
                 ) AS s USING (user_id)
+                %s
                 WHERE
                     (s.user_id IS NOT NULL OR p.user_id IS NOT NULL %s)
                     AND vector @@ to_tsquery('english', ?)
@@ -690,7 +695,7 @@ class UserDirectoryStore(SQLBaseStore):
                     display_name IS NULL,
                     avatar_url IS NULL
                 LIMIT ?
-            """ % ( include_pattern_clause )
+            """ % ( include_pattern_join, include_pattern_where_clause )
             args = (user_id, full_query, exact_query, prefix_query, limit + 1,)
         elif isinstance(self.database_engine, Sqlite3Engine):
             search_query = _parse_query_sqlite(search_term)
@@ -704,6 +709,7 @@ class UserDirectoryStore(SQLBaseStore):
                     SELECT other_user_id AS user_id FROM users_who_share_rooms
                     WHERE user_id = ? AND share_private
                 ) AS s USING (user_id)
+                %s
                 WHERE
                     (s.user_id IS NOT NULL OR p.user_id IS NOT NULL %s)
                     AND value MATCH ?
@@ -712,7 +718,7 @@ class UserDirectoryStore(SQLBaseStore):
                     display_name IS NULL,
                     avatar_url IS NULL
                 LIMIT ?
-            """ % ( include_pattern_clause )
+            """ % ( include_pattern_join, include_pattern_where_clause )
             args = (user_id, search_query, limit + 1)
         else:
             # This should be unreachable.