summary refs log tree commit diff
path: root/docs/user_directory.md
diff options
context:
space:
mode:
authorDavid Robertson <davidr@element.io>2021-09-10 10:54:38 +0100
committerGitHub <noreply@github.com>2021-09-10 10:54:38 +0100
commit318162f5debc595d3381337fe363fa7936cc7843 (patch)
tree2a6451443ea2e9ecd6fe8ff973ab202abe48b42e /docs/user_directory.md
parentRemove fixed and flakey tests from the sytest blacklist (#10788) (diff)
downloadsynapse-318162f5debc595d3381337fe363fa7936cc7843.tar.xz
Easy refactors of the user directory (#10789)
No functional changes here. This came out as I was working to tackle #5677 
Diffstat (limited to 'docs/user_directory.md')
-rw-r--r--docs/user_directory.md37
1 files changed, 37 insertions, 0 deletions
diff --git a/docs/user_directory.md b/docs/user_directory.md
index d4f38d2cf1..07fe954891 100644
--- a/docs/user_directory.md
+++ b/docs/user_directory.md
@@ -10,3 +10,40 @@ DB corruption) get stale or out of sync.  If this happens, for now the
 solution to fix it is to execute the SQL [here](https://github.com/matrix-org/synapse/blob/master/synapse/storage/schema/main/delta/53/user_dir_populate.sql)
 and then restart synapse. This should then start a background task to
 flush the current tables and regenerate the directory.
+
+Data model
+----------
+
+There are five relevant tables that collectively form the "user directory".
+Three of them track a master list of all the users we could search for.
+The last two (collectively called the "search tables") track who can
+see who.
+
+From all of these tables we exclude three types of local user:
+  - support users
+  - appservice users
+  - deactivated users
+
+* `user_directory`. This contains the user_id, display name and avatar we'll
+  return when you search the directory.
+  - Because there's only one directory entry per user, it's important that we only
+    ever put publicly visible names here. Otherwise we might leak a private
+    nickname or avatar used in a private room.
+  - Indexed on rooms. Indexed on users.
+
+* `user_directory_search`. To be joined to `user_directory`. It contains an extra
+  column that enables full text search based on user ids and display names.
+  Different schemas for SQLite and Postgres with different code paths to match.
+  - Indexed on the full text search data. Indexed on users.
+
+* `user_directory_stream_pos`. When the initial background update to populate
+  the directory is complete, we record a stream position here. This indicates
+  that synapse should now listen for room changes and incrementally update
+  the directory where necessary.
+
+* `users_in_public_rooms`. Contains associations between users and the public rooms they're in.
+  Used to determine which users are in public rooms and should be publicly visible in the directory.
+
+* `users_who_share_private_rooms`. Rows are triples `(L, M, room id)` where `L`
+   is a local user and `M` is a local or remote user. `L` and `M` should be
+   different, but this isn't enforced by a constraint.