CAPIO-CL 1.5.2
CAPIO-CL: Cross Application Programmable I/O - Coordination Language
Loading...
Searching...
No Matches
monitor.h
1#ifndef CAPIO_CL_MONITOR_H
2#define CAPIO_CL_MONITOR_H
3
4#include <atomic>
5#include <cstddef>
6#include <filesystem>
7#include <mutex>
8#include <set>
9#include <string>
10#include <thread>
11#include <unordered_map>
12#include <vector>
13
14#include "configuration.h"
15
18
20inline constexpr std::size_t HOSTNAME_BUFFER_SIZE = 1024;
21
23inline constexpr std::size_t PATH_BUFFER_SIZE = 4096;
24
26static const std::string NO_HOME_NODE = "<NONE>";
27
31class MonitorException final : public std::exception {
32 std::string message{};
33
34 public:
39 explicit MonitorException(const std::string &msg);
40
45 [[nodiscard]] const char *what() const noexcept override { return message.c_str(); }
46};
47
60 protected:
64 mutable std::mutex committed_lock;
65
69 mutable std::mutex home_node_lock;
70
74 mutable std::vector<std::string> _committed_files;
75
81 mutable std::unordered_map<std::string, std::string> _home_nodes;
82
86 mutable char _hostname[HOSTNAME_BUFFER_SIZE] = {0};
87
88 public:
92 virtual ~MonitorInterface() = default;
93
100 virtual bool isCommitted(const std::filesystem::path &path) const;
101
107 virtual void setCommitted(const std::filesystem::path &path) const;
108
113 virtual void setHomeNode(const std::filesystem::path &path) const;
114
120 virtual std::string getHomeNode(const std::filesystem::path &path) const;
121};
122
133class MulticastMonitor final : public MonitorInterface {
134
135 static constexpr int MESSAGE_SIZE = 2 + (2 * PATH_BUFFER_SIZE);
136
140 std::thread commit_thread, home_node_thread;
141
145 std::string MULTICAST_COMMIT_ADDR;
146
147 std::string MULTICAST_HOME_NODE_ADDR;
148
150 std::atomic<bool> terminate = false;
151
153 static constexpr int MULTICAST_THREAD_POLL_INTERVAL = 250;
154
158 int MULTICAST_COMMIT_PORT{};
159
160 int MULTICAST_HOME_NODE_PORT{};
161
163 int MULTICAST_DELAY_MILLIS{};
164
168 typedef enum { SET = '!', GET = '?' } MESSAGE_COMMANDS;
169
178 static void _send_message(const std::string &ip_addr, int ip_port, const std::string &path,
179 MESSAGE_COMMANDS action);
180
194 static void commit_listener(std::vector<std::string> &committed_files, std::mutex &lock,
195 const std::string &ip_addr, int ip_port,
196 const std::atomic<bool> *terminate);
197
211 static void home_node_listener(std::unordered_map<std::string, std::string> &home_nodes,
212 std::mutex &lock, const std::string &ip_addr, int ip_port,
213 const std::atomic<bool> *terminate);
214
215 public:
222
227
228 bool isCommitted(const std::filesystem::path &path) const override;
229 void setCommitted(const std::filesystem::path &path) const override;
230 void setHomeNode(const std::filesystem::path &path) const override;
231 std::string getHomeNode(const std::filesystem::path &path) const override;
232};
233
242
243 typedef enum { COMMIT, HOME_NODE } CAPIO_CL_COMMIT_TOKEN_TYPES;
244
252 static std::filesystem::path
253 compute_capiocl_token_name(const std::filesystem::path &path,
254 CAPIO_CL_COMMIT_TOKEN_TYPES type = COMMIT);
255
263 static void generate_commit_token(const std::filesystem::path &path);
264
273 static void generate_home_node_token(const std::filesystem::path &path,
274 const std::string &home_node);
275
276 public:
281
285 ~FileSystemMonitor() override = default;
286
287 bool isCommitted(const std::filesystem::path &path) const override;
288 void setCommitted(const std::filesystem::path &path) const override;
289 void setHomeNode(const std::filesystem::path &path) const override;
290 std::string getHomeNode(const std::filesystem::path &path) const override;
291};
292
297class Monitor {
298 friend class Engine;
299 friend class MonitorInterface;
300
301 std::vector<const MonitorInterface *> interfaces;
302
303 public:
312 [[nodiscard]] bool isCommitted(const std::filesystem::path &path) const;
313
320 void setCommitted(std::filesystem::path path) const;
321
326 void registerMonitorBackend(const MonitorInterface *interface);
327
333 void setHomeNode(const std::filesystem::path &path) const;
334
340 [[nodiscard]] std::set<std::string> getHomeNode(const std::filesystem::path &path) const;
341
342 ~Monitor();
343};
344} // namespace capiocl::monitor
345
346#endif // CAPIO_CL_MONITOR_H
Load configuration and store it from a CAPIO-CL TOML configuration file.
Definition configuration.h:39
bool isCommitted(const std::filesystem::path &path) const override
Check whether the given file has been committed.
std::string getHomeNode(const std::filesystem::path &path) const override
FileSystemMonitor()
Construct a filesystem-based commit monitor.
~FileSystemMonitor() override=default
Destructor for FileSystemMonitor.
void setHomeNode(const std::filesystem::path &path) const override
void setCommitted(const std::filesystem::path &path) const override
Mark the given file as committed.
MonitorException(const std::string &msg)
Construct a new CAPIO-CL Exception.
Definition Monitor.cpp:5
const char * what() const noexcept override
Definition monitor.h:45
Abstract interface for monitoring the commit state of files in CAPIO-CL.
Definition monitor.h:59
virtual bool isCommitted(const std::filesystem::path &path) const
Check whether the given file has been committed.
char _hostname[HOSTNAME_BUFFER_SIZE]
hostname of the current instance
Definition monitor.h:86
std::vector< std::string > _committed_files
List of committed file paths stored as strings.
Definition monitor.h:74
virtual void setCommitted(const std::filesystem::path &path) const
Mark the given file as committed.
virtual void setHomeNode(const std::filesystem::path &path) const
virtual std::string getHomeNode(const std::filesystem::path &path) const
std::mutex committed_lock
Mutex protecting access to the committed file list.
Definition monitor.h:64
std::unordered_map< std::string, std::string > _home_nodes
Lookup table to get home node staring from path. Key = file path; Value = hostname of home node.
Definition monitor.h:81
std::mutex home_node_lock
Mutex protecting access to the home nodes list.
Definition monitor.h:69
virtual ~MonitorInterface()=default
Virtual destructor for safe polymorphic deletion.
Class to monitor runtime dependent information on CAPIO-CL related paths, such as commitment status a...
Definition monitor.h:297
void setHomeNode(const std::filesystem::path &path) const
Definition Monitor.cpp:30
bool isCommitted(const std::filesystem::path &path) const
Definition Monitor.cpp:11
std::set< std::string > getHomeNode(const std::filesystem::path &path) const
Definition Monitor.cpp:38
void setCommitted(std::filesystem::path path) const
Definition Monitor.cpp:17
void registerMonitorBackend(const MonitorInterface *interface)
Definition Monitor.cpp:24
MulticastMonitor(const capiocl::configuration::CapioClConfiguration &config)
Construct a multicast-based monitor.
void setCommitted(const std::filesystem::path &path) const override
Mark the given file as committed.
void setHomeNode(const std::filesystem::path &path) const override
~MulticastMonitor() override
Destructor; stops listener thread and cleans resources.
bool isCommitted(const std::filesystem::path &path) const override
Check whether the given file has been committed.
std::string getHomeNode(const std::filesystem::path &path) const override
Namespace containing the CAPIO-CL Monitor components.
Definition monitor.h:17
constexpr std::size_t PATH_BUFFER_SIZE
Maximum path storage used in multicast monitor messages.
Definition monitor.h:23
constexpr std::size_t HOSTNAME_BUFFER_SIZE
Buffer size used to store a null-terminated host name.
Definition monitor.h:20