diff options
author | ruben <code@rbn.im> | 2019-05-21 22:56:55 +0200 |
---|---|---|
committer | Brendan Abolivier <babolivier@matrix.org> | 2019-05-21 21:56:55 +0100 |
commit | 74827428bd3e11faab65f12204449c1b9469b0ae (patch) | |
tree | 0decafa542436a0667ed2d3e3cfd4df0f03de1e5 /roomserver/README.md | |
parent | 4d588f7008afe5600219ac0930c2eee2de5c447b (diff) |
use go module for dependencies (#594)
Diffstat (limited to 'roomserver/README.md')
-rw-r--r-- | roomserver/README.md | 59 |
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 | + +---------------+-------------------+------------------+----------+ |