CAPIO-CL 1.4.1
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 <filesystem>
6#include <mutex>
7#include <set>
8#include <string>
9#include <thread>
10#include <unordered_map>
11#include <vector>
12
13#include "configuration.h"
14
15#ifndef PATH_MAX
16#define PATH_MAX 4096
17#endif
18
19#ifndef HOST_NAME_MAX
20#define HOST_NAME_MAX 1024
21#endif
22
25
27static const std::string NO_HOME_NODE = "<NONE>";
28
32class MonitorException final : public std::exception {
33 std::string message{};
34
35 public:
40 explicit MonitorException(const std::string &msg);
41
46 [[nodiscard]] const char *what() const noexcept override { return message.c_str(); }
47};
48
61 protected:
65 mutable std::mutex committed_lock;
66
70 mutable std::mutex home_node_lock;
71
75 mutable std::vector<std::string> _committed_files;
76
82 mutable std::unordered_map<std::string, std::string> _home_nodes;
83
87 mutable char _hostname[HOST_NAME_MAX] = {0};
88
89 public:
93 virtual ~MonitorInterface() = default;
94
101 virtual bool isCommitted(const std::filesystem::path &path) const;
102
108 virtual void setCommitted(const std::filesystem::path &path) const;
109
114 virtual void setHomeNode(const std::filesystem::path &path) const;
115
121 virtual const std::string &getHomeNode(const std::filesystem::path &path) const;
122};
123
134class MulticastMonitor final : public MonitorInterface {
135
136 static constexpr int MESSAGE_SIZE = (2 + PATH_MAX + PATH_MAX);
137
141 std::thread commit_thread, home_node_thread;
142
146 std::string MULTICAST_COMMIT_ADDR;
147
148 std::string MULTICAST_HOME_NODE_ADDR;
149
151 std::atomic<bool> terminate = false;
152
154 static constexpr int MULTICAST_THREAD_POLL_INTERVAL = 250;
155
159 int MULTICAST_COMMIT_PORT{};
160
161 int MULTICAST_HOME_NODE_PORT{};
162
164 int MULTICAST_DELAY_MILLIS{};
165
169 typedef enum { SET = '!', GET = '?' } MESSAGE_COMMANDS;
170
179 static void _send_message(const std::string &ip_addr, int ip_port, const std::string &path,
180 MESSAGE_COMMANDS action);
181
195 static void commit_listener(std::vector<std::string> &committed_files, std::mutex &lock,
196 const std::string &ip_addr, int ip_port,
197 const std::atomic<bool> *terminate);
198
212 static void home_node_listener(std::unordered_map<std::string, std::string> &home_nodes,
213 std::mutex &lock, const std::string &ip_addr, int ip_port,
214 const std::atomic<bool> *terminate);
215
216 public:
223
228
229 bool isCommitted(const std::filesystem::path &path) const override;
230 void setCommitted(const std::filesystem::path &path) const override;
231 void setHomeNode(const std::filesystem::path &path) const override;
232 const std::string &getHomeNode(const std::filesystem::path &path) const override;
233};
234
243
244 typedef enum { COMMIT, HOME_NODE } CAPIO_CL_COMMIT_TOKEN_TYPES;
245
253 static std::filesystem::path
254 compute_capiocl_token_name(const std::filesystem::path &path,
255 CAPIO_CL_COMMIT_TOKEN_TYPES type = COMMIT);
256
264 static void generate_commit_token(const std::filesystem::path &path);
265
274 static void generate_home_node_token(const std::filesystem::path &path,
275 const std::string &home_node);
276
277 public:
282
286 ~FileSystemMonitor() override = default;
287
288 bool isCommitted(const std::filesystem::path &path) const override;
289 void setCommitted(const std::filesystem::path &path) const override;
290 void setHomeNode(const std::filesystem::path &path) const override;
291 const std::string &getHomeNode(const std::filesystem::path &path) const override;
292};
293
298class Monitor {
299 friend class Engine;
300 friend class MonitorInterface;
301
302 std::vector<const MonitorInterface *> interfaces;
303
304 public:
313 [[nodiscard]] bool isCommitted(const std::filesystem::path &path) const;
314
321 void setCommitted(std::filesystem::path path) const;
322
327 void registerMonitorBackend(const MonitorInterface *interface);
328
334 void setHomeNode(const std::filesystem::path &path) const;
335
341 [[nodiscard]] std::set<std::string> getHomeNode(const std::filesystem::path &path) const;
342
343 ~Monitor();
344};
345} // namespace capiocl::monitor
346
347#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.
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.
const std::string & getHomeNode(const std::filesystem::path &path) const override
MonitorException(const std::string &msg)
Construct a new CAPIO-CL Exception.
Definition Monitor.cpp:5
const char * what() const noexcept override
Definition monitor.h:46
Abstract interface for monitoring the commit state of files in CAPIO-CL.
Definition monitor.h:60
virtual bool isCommitted(const std::filesystem::path &path) const
Check whether the given file has been committed.
std::vector< std::string > _committed_files
List of committed file paths stored as strings.
Definition monitor.h:75
virtual void setCommitted(const std::filesystem::path &path) const
Mark the given file as committed.
virtual void setHomeNode(const std::filesystem::path &path) const
std::mutex committed_lock
Mutex protecting access to the committed file list.
Definition monitor.h:65
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:82
virtual const std::string & getHomeNode(const std::filesystem::path &path) const
std::mutex home_node_lock
Mutex protecting access to the home nodes list.
Definition monitor.h:70
char _hostname[HOST_NAME_MAX]
hostname of the current instance
Definition monitor.h:87
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:298
void setHomeNode(const std::filesystem::path &path) const
Definition Monitor.cpp:22
bool isCommitted(const std::filesystem::path &path) const
Definition Monitor.cpp:9
std::set< std::string > getHomeNode(const std::filesystem::path &path) const
Definition Monitor.cpp:28
void setCommitted(std::filesystem::path path) const
Definition Monitor.cpp:14
void registerMonitorBackend(const MonitorInterface *interface)
Definition Monitor.cpp:19
const std::string & getHomeNode(const std::filesystem::path &path) const override
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.
Namespace containing the CAPIO-CL Monitor components.
Definition monitor.h:24