aboutsummaryrefslogtreecommitdiff
path: root/roomserver/README.md
diff options
context:
space:
mode:
authorruben <code@rbn.im>2019-05-21 22:56:55 +0200
committerBrendan Abolivier <babolivier@matrix.org>2019-05-21 21:56:55 +0100
commit74827428bd3e11faab65f12204449c1b9469b0ae (patch)
tree0decafa542436a0667ed2d3e3cfd4df0f03de1e5 /roomserver/README.md
parent4d588f7008afe5600219ac0930c2eee2de5c447b (diff)
use go module for dependencies (#594)
Diffstat (limited to 'roomserver/README.md')
-rw-r--r--roomserver/README.md59
1 files changed, 59 insertions, 0 deletions
diff --git a/roomserver/README.md b/roomserver/README.md
new file mode 100644
index 00000000..5a275760
--- /dev/null
+++ b/roomserver/README.md
@@ -0,0 +1,59 @@
+# RoomServer
+
+
+## RoomServer Internals
+
+### Numeric IDs
+
+To save space matrix string identifiers are mapped to local numeric IDs.
+The numeric IDs are more efficient to manipulate and use less space to store.
+The numeric IDs are never exposed in the API the room server exposes.
+The numeric IDs are converted to string IDs before they leave the room server.
+The numeric ID for a string ID is never 0 to avoid being confused with go's
+default zero value.
+Zero is used to indicate that there was no corresponding string ID.
+Well-known event types and event state keys are preassigned numeric IDs.
+
+### State Snapshot Storage
+
+The room server stores the state of the matrix room at each event.
+For efficiency the state is stored as blocks of 3-tuples of numeric IDs for the
+event type, event state key and event ID. For further efficiency the state
+snapshots are stored as the combination of up to 64 these blocks. This allows
+blocks of the room state to be reused in multiple snapshots.
+
+The resulting database tables look something like this:
+
+ +-------------------------------------------------------------------+
+ | Events |
+ +---------+-------------------+------------------+------------------+
+ | EventNID| EventTypeNID | EventStateKeyNID | StateSnapshotNID |
+ +---------+-------------------+------------------+------------------+
+ | 1 | m.room.create 1 | "" 1 | <nil> 0 |
+ | 2 | m.room.member 2 | "@user:foo" 2 | <nil> 0 |
+ | 3 | m.room.member 2 | "@user:bar" 3 | {1,2} 1 |
+ | 4 | m.room.message 3 | <nil> 0 | {1,2,3} 2 |
+ | 5 | m.room.member 2 | "@user:foo" 2 | {1,2,3} 2 |
+ | 6 | m.room.message 3 | <nil> 0 | {1,3,6} 3 |
+ +---------+-------------------+------------------+------------------+
+
+ +----------------------------------------+
+ | State Snapshots |
+ +-----------------------+----------------+
+ | EventStateSnapshotNID | StateBlockNIDs |
+ +-----------------------+----------------|
+ | 1 | {1} |
+ | 2 | {1,2} |
+ | 3 | {1,2,3} |
+ +-----------------------+----------------+
+
+ +-----------------------------------------------------------------+
+ | State Blocks |
+ +---------------+-------------------+------------------+----------+
+ | StateBlockNID | EventTypeNID | EventStateKeyNID | EventNID |
+ +---------------+-------------------+------------------+----------+
+ | 1 | m.room.create 1 | "" 1 | 1 |
+ | 1 | m.room.member 2 | "@user:foo" 2 | 2 |
+ | 2 | m.room.member 2 | "@user:bar" 3 | 3 |
+ | 3 | m.room.member 2 | "@user:foo" 2 | 6 |
+ +---------------+-------------------+------------------+----------+