Commit | Line | Data |
---|---|---|
b0f2e8db JG |
1 | /* |
2 | * Copyright (C) 2022 Jérémie Galarneau <jeremie.galarneau@efficios.com> | |
3 | * | |
4 | * SPDX-License-Identifier: GPL-2.0-only | |
5 | * | |
6 | */ | |
7 | ||
8 | #ifndef LTTNG_UST_REGISTRY_SESSION_H | |
9 | #define LTTNG_UST_REGISTRY_SESSION_H | |
10 | ||
11 | #include "clock-class.hpp" | |
12 | #include "session.hpp" | |
13 | #include "trace-class.hpp" | |
14 | #include "ust-clock-class.hpp" | |
15 | #include "ust-registry-channel.hpp" | |
97f630d4 | 16 | #include "ust-registry.hpp" |
b0f2e8db JG |
17 | |
18 | #include <common/make-unique-wrapper.hpp> | |
19 | ||
20 | #include <cstdint> | |
21 | #include <ctime> | |
22 | #include <lttng/lttng.h> | |
23 | #include <string> | |
24 | #include <unistd.h> | |
25 | ||
26 | namespace lttng { | |
27 | namespace sessiond { | |
28 | namespace ust { | |
29 | ||
97f630d4 | 30 | class registry_enum; |
b0f2e8db JG |
31 | class registry_session; |
32 | ||
33 | namespace details { | |
34 | void locked_registry_session_release(registry_session *session); | |
35 | } /* namespace details */ | |
36 | ||
37 | class registry_session : public lttng::sessiond::trace::trace_class { | |
38 | public: | |
39 | using locked_ptr = std::unique_ptr<registry_session, | |
40 | lttng::details::create_unique_class<registry_session, | |
41 | details::locked_registry_session_release>:: | |
42 | deleter>; | |
43 | ||
4bcf2294 | 44 | virtual lttng_buffer_type buffering_scheme() const noexcept = 0; |
97f630d4 | 45 | locked_ptr lock() noexcept; |
b0f2e8db JG |
46 | |
47 | void add_channel(uint64_t channel_key); | |
97f630d4 JG |
48 | |
49 | /* A channel is protected by its parent registry session's lock. */ | |
4bcf2294 | 50 | lttng::sessiond::ust::registry_channel& channel(uint64_t channel_key) const; |
97f630d4 | 51 | |
b0f2e8db JG |
52 | void remove_channel(uint64_t channel_key, bool notify); |
53 | ||
97f630d4 JG |
54 | void create_or_find_enum(int session_objd, |
55 | const char *enum_name, | |
56 | struct lttng_ust_ctl_enum_entry *raw_entries, | |
57 | size_t nr_entries, | |
58 | uint64_t *enum_id); | |
4bcf2294 | 59 | registry_enum::const_rcu_protected_reference enumeration( |
97f630d4 JG |
60 | const char *enum_name, uint64_t enum_id) const; |
61 | ||
b0f2e8db | 62 | void regenerate_metadata(); |
9d89db29 | 63 | |
cd9adb8b | 64 | ~registry_session() override; |
9d89db29 JG |
65 | registry_session(const registry_session&) = delete; |
66 | registry_session(registry_session&&) = delete; | |
67 | registry_session& operator=(registry_session&&) = delete; | |
68 | registry_session& operator=(const registry_session&) = delete; | |
b0f2e8db | 69 | |
cd9adb8b | 70 | const lttng::sessiond::trace::type *packet_header() const noexcept override; |
24ed18f2 | 71 | |
b0f2e8db JG |
72 | /* |
73 | * With multiple writers and readers, use this lock to access | |
74 | * the registry. Can nest within the ust app session lock. | |
75 | * Also acts as a registry serialization lock. Used by registry | |
76 | * readers to serialize the registry information sent from the | |
77 | * sessiond to the consumerd. | |
97f630d4 | 78 | * |
b0f2e8db JG |
79 | * The consumer socket lock nests within this lock. |
80 | */ | |
81 | mutable pthread_mutex_t _lock; | |
97f630d4 JG |
82 | |
83 | /* Generated metadata, not null-terminated. */ | |
84 | char *_metadata = nullptr; /* */ | |
85 | size_t _metadata_len = 0; | |
86 | /* Length of bytes sent to the consumer. */ | |
87 | size_t _metadata_len_sent = 0; | |
88 | /* Current version of the metadata. */ | |
89 | uint64_t _metadata_version = 0; | |
90 | ||
91 | /* | |
92 | * Unique key to identify the metadata on the consumer side. | |
93 | */ | |
94 | uint64_t _metadata_key = 0; | |
95 | /* | |
96 | * Indicates if the metadata is closed on the consumer side. This is to | |
97 | * avoid double close of metadata when an application unregisters AND | |
98 | * deletes its sessions. | |
99 | */ | |
100 | bool _metadata_closed = false; | |
101 | ||
102 | protected: | |
103 | /* Prevent instanciation of this base class. */ | |
104 | registry_session(const struct lttng::sessiond::trace::abi& abi, | |
105 | unsigned int app_tracer_version_major, | |
106 | unsigned int app_tracer_version_minor, | |
107 | const char *root_shm_path, | |
108 | const char *shm_path, | |
109 | uid_t euid, | |
110 | gid_t egid, | |
111 | uint64_t tracing_id); | |
cd9adb8b | 112 | void accept( |
da9dd521 | 113 | trace::trace_class_environment_visitor& environment_visitor) const override; |
97f630d4 JG |
114 | void _generate_metadata(); |
115 | ||
116 | private: | |
117 | uint32_t _get_next_channel_id(); | |
118 | void _increase_metadata_size(size_t reservation_length); | |
119 | void _append_metadata_fragment(const std::string& fragment); | |
120 | void _reset_metadata(); | |
3691d312 | 121 | void _destroy_enum(registry_enum *reg_enum) noexcept; |
97f630d4 | 122 | registry_enum *_lookup_enum(const registry_enum *target_enum) const; |
0267b527 | 123 | lttng::sessiond::trace::type::cuptr _create_packet_header() const; |
97f630d4 | 124 | |
cd9adb8b | 125 | void _accept_on_clock_classes( |
97f630d4 | 126 | lttng::sessiond::trace::trace_class_visitor& trace_class_visitor) |
cd9adb8b JG |
127 | const final; |
128 | void _accept_on_stream_classes( | |
97f630d4 | 129 | lttng::sessiond::trace::trace_class_visitor& trace_class_visitor) |
cd9adb8b | 130 | const final; |
97f630d4 | 131 | |
b0f2e8db JG |
132 | /* Next channel ID available for a newly registered channel. */ |
133 | uint32_t _next_channel_id = 0; | |
97f630d4 | 134 | |
b0f2e8db JG |
135 | /* Once this value reaches UINT32_MAX, no more id can be allocated. */ |
136 | uint32_t _used_channel_id = 0; | |
97f630d4 | 137 | |
b0f2e8db JG |
138 | /* Next enumeration ID available. */ |
139 | uint64_t _next_enum_id = 0; | |
140 | ||
97f630d4 | 141 | size_t _metadata_alloc_len = 0; |
b0f2e8db JG |
142 | |
143 | /* | |
144 | * Those fields are only used when a session is created with | |
145 | * the --shm-path option. In this case, the metadata is output | |
146 | * twice: once to the consumer, as ususal, but a second time | |
147 | * also in the shm path directly. This is done so that a copy | |
148 | * of the metadata that is as fresh as possible is available | |
149 | * on the event of a crash. | |
150 | * | |
151 | * root_shm_path contains the shm-path provided by the user, along with | |
152 | * the session's name and timestamp: | |
153 | * e.g. /tmp/my_shm/my_session-20180612-135822 | |
154 | * | |
155 | * shm_path contains the full path of the memory buffers: | |
156 | * e.g. /tmp/my_shm/my_session-20180612-135822/ust/uid/1000/64-bit | |
157 | * | |
158 | * metadata_path contains the full path to the metadata file that | |
159 | * is kept for the "crash buffer" extraction: | |
160 | * e.g. | |
161 | * /tmp/my_shm/my_session-20180612-135822/ust/uid/1000/64-bit/metadata | |
162 | * | |
163 | * Note that this is not the trace's final metadata file. It is | |
164 | * only meant to be used to read the contents of the ring buffers | |
165 | * in the event of a crash. | |
166 | * | |
167 | * metadata_fd is a file descriptor that points to the file at | |
168 | * 'metadata_path'. | |
169 | */ | |
97f630d4 JG |
170 | const std::string _root_shm_path; |
171 | const std::string _shm_path; | |
172 | const std::string _metadata_path; | |
173 | ||
b0f2e8db JG |
174 | /* File-backed metadata FD */ |
175 | int _metadata_fd = -1; | |
176 | ||
177 | /* | |
178 | * Hash table containing channels sent by the UST tracer. MUST | |
179 | * be accessed with a RCU read side lock acquired. | |
180 | */ | |
181 | lttng_ht::uptr _channels; | |
182 | ||
b0f2e8db JG |
183 | /* Enumerations table. */ |
184 | lttng_ht::uptr _enums; | |
185 | ||
97f630d4 JG |
186 | /* User and group owning the session. */ |
187 | const uid_t _uid; | |
188 | const gid_t _gid; | |
189 | ||
b0f2e8db JG |
190 | /* |
191 | * Copy of the tracer version when the first app is registered. | |
192 | * It is used if we need to regenerate the metadata. | |
193 | */ | |
97f630d4 JG |
194 | const struct { |
195 | uint32_t major, minor; | |
196 | } _app_tracer_version; | |
b0f2e8db | 197 | |
97f630d4 JG |
198 | /* The id of the parent session. */ |
199 | const ltt_session::id_t _tracing_id; | |
b0f2e8db | 200 | |
042670db | 201 | lttng::sessiond::ust::clock_class::cuptr _clock; |
b0f2e8db | 202 | const lttng::sessiond::trace::trace_class_visitor::cuptr _metadata_generating_visitor; |
0267b527 | 203 | lttng::sessiond::trace::type::cuptr _packet_header; |
b0f2e8db JG |
204 | }; |
205 | ||
206 | } /* namespace ust */ | |
207 | } /* namespace sessiond */ | |
208 | } /* namespace lttng */ | |
209 | ||
210 | #endif /* LTTNG_UST_REGISTRY_SESSION_H */ |