Use compiler-agnostic defines to silence warning
[lttng-tools.git] / doc / relayd-architecture.txt
CommitLineData
7591bab1
MD
1LTTng Relay Daemon Architecture
2Mathieu Desnoyers, August 2015
3
4This document describes the object model and architecture of the relay
5daemon, after the refactoring done within the commit "Fix: Relay daemon
6ownership and reference counting".
7
8We have the following object composition hierarchy:
9
1bd87328 10relay connection (main.cpp, for sessiond/consumer)
7591bab1 11 |
1bd87328 12 \-> 0 or 1 per-consumer relay session
7591bab1
MD
13 |
14 \-> 0 or many ctf-trace
15 |
16 \-> 0 or many stream
17 | |
18 | \-> 0 or many index
19 |
20 \-------> 0 or 1 viewer stream
21
1bd87328 22live connection (live.cpp, for client)
7591bab1
MD
23 |
24 \-> 1 viewer session
98b82dfa
KS
25 | |
26 | \-> (transient ref) 0 or many unannounced relay streams
7591bab1 27 |
1bd87328
KS
28 \-> 0 or many per-consumer relay sessions (actually a reference to a
29 | per-consumer relay session as created by the relay connection)
7591bab1
MD
30 |
31 \-> ..... (ctf-trace, stream, index, viewer stream)
32
1bd87328 33There are global tables declared in lttng-relayd.h for per-consumer relay sessions
7591bab1 34(sessions_ht, indexed by session id), streams (relay_streams_ht, indexed
98b82dfa
KS
35by stream handle), viewer sessions (viewer_sessions_ht, indexed by
36connection sock fd), and viewer streams (viewer_streams_ht, indexed
37by stream handle). The purpose of those tables is to allow fast lookup of
7591bab1
MD
38those objects using the IDs received in the communication protocols.
39
40There is also one connection hash table per worker thread. There is one
41worker thread to receive data (main.c), and one worker thread to
42interact with viewer clients (live.c). Those tables are indexed by
43socket file descriptor.
44
45A RCU lookup+refcounting scheme has been introduced for all objects
46(except viewer session which is still an exception at the moment). This
47scheme allows looking up the objects or doing a traversal on the RCU
48linked list or hash table in combination with a getter on the object.
49This getter validates that there is still at least one reference to the
ce4d4083 50object, else the lookup acts just as if the object does not exist.
7591bab1
MD
51
52The relay_connection (connection between the sessiond/consumer and the
53relayd) is the outermost object of its hierarchy.
54
55The live connection (connection between a live client and the relayd)
56is the outermost object of its hierarchy.
57
58There is also a "lock" mutex in each object. Those are used to
59synchronize between threads (currently the main.c relay thread and
60live.c client thread) when objects are shared. Locks can be nested from
61the outermost object to the innermost object. IOW, the ctf-trace lock can
1bd87328
KS
62nest within the per-consumer relay session lock. The unannounced stream list
63lock in viewer sessions is an exception to the default locking order: it may
64be nested inside the following locks (in order): relay session, ctf_trace,
65and relay stream.
7591bab1 66
7591bab1
MD
67RCU linked lists are used to iterate using RCU, and are protected by
68their own mutex for modifications. Iterations should be confirmed using
69the object "getter" to ensure its refcount is not 0 (except in cases
70where the caller actually owns the objects and therefore can assume its
71refcount is not 0).
72
73RCU hash tables are used to iterate using RCU. Iteration should be
74confirmed using the object "getter" to ensure its refcount is not 0
75(except again if we have ownership and can assume the object refcount is
76not 0).
77
78Object creation has a refcount of 1. Each getter increments the
79refcount, and needs to be paired with a "put" to decrement it. A final
80put on "self" (ownership) will allow refcount to reach 0, therefore
81triggering release, and thus free through call_rcu.
82
83In the composition scheme, we find back references from each composite
84to its container. Therefore, each composite holds a reference (refcount)
85on its container. This allows following pointers from e.g. viewer stream
1bd87328
KS
86to stream to ctf-trace to per-consumer relay session without performing
87any validation, due to transitive refcounting of those back-references.
7591bab1
MD
88
89In addition to those back references, there are a few key ownership
90references held. The connection in the relay worker thread (main.c)
1bd87328
KS
91holds ownership on the per-consumer relay session, and on each stream it
92contains. The connection in the live worker thread (live.c) holds ownership on
93each viewer stream it creates. The rest is ensured by back references from
7591bab1
MD
94composite to container objects. When a connection is closed, it puts all
95the ownership references it is holding. This will then eventually
1bd87328
KS
96trigger destruction of the per-consumer relay session, streams, and
97viewer streams associated with the connection when all the back references
98reach 0.
7591bab1
MD
99
100RCU read-side locks are now only held during iteration on RCU lists and
101hash tables, and within the internals of the get (lookup) and put
102functions. Those functions then use refcounting to ensure existence of
103the object when returned to their caller.
1bd87328
KS
104
105In the current implementation, while a live viewer may attach to
106multiple per-consumer relay sessions, they are meant to belong to
107only a single lttng-sessiond session.
This page took 0.058719 seconds and 5 git commands to generate.