DUNE-DAQ
DUNE Trigger and Data Acquisition software
Toggle main menu visibility
Loading...
Searching...
No Matches
dunedaq
sourcecode
snbmodules
src
common
group_metadata.cpp
Go to the documentation of this file.
1
9
10
#include "
snbmodules/group_metadata.hpp
"
11
12
#include <filesystem>
13
#include <iostream>
14
#include <stdexcept>
15
#include <string>
16
#include <utility>
17
#include <vector>
18
19
namespace
dunedaq::snbmodules
{
20
21
const
std::string
GroupMetadata::m_file_extension
=
".gmetadata"
;
// NOLINT
22
23
TransferMetadata
&
24
GroupMetadata::get_transfer_meta_from_file_path
(
const
std::string& file_path)
25
{
26
for
(std::shared_ptr<TransferMetadata> meta :
get_transfers_meta
()) {
27
if
(meta->get_file_path() == file_path) {
28
return
*meta;
29
}
30
}
31
ers::fatal
(MetadataNotFoundInGroupError(
ERS_HERE
,
m_group_id
, file_path));
32
return
*
m_transfers_meta
[0];
// To avoid warning
33
}
34
35
TransferMetadata
&
36
GroupMetadata::add_file
(std::shared_ptr<TransferMetadata> meta)
37
{
38
if
(
m_expected_files
.find(meta->get_file_path()) !=
m_expected_files
.end()) {
39
m_expected_files
.erase(meta->get_file_path());
40
meta->set_group_id(
m_group_id
);
41
42
return
*
m_transfers_meta
.emplace_back(meta);
43
}
else
if
(meta->get_group_id() ==
m_group_id
) {
44
int
pos = -1;
45
int
i = 0;
46
for
(
const
auto
& m :
m_transfers_meta
) {
47
if
(m == meta) {
48
// Already inserted, update the transfer
49
pos = i;
50
break
;
51
}
52
i++;
53
}
54
if
(pos != -1) {
55
m_transfers_meta
.erase(
m_transfers_meta
.begin() + pos);
56
}
57
return
*
m_transfers_meta
.emplace_back(std::move(meta));
58
}
else
{
59
ers::fatal
(MetadataNotExpectedInGroupError(
ERS_HERE
,
m_group_id
, meta->get_file_name()));
60
return
*
m_transfers_meta
[0];
// To avoid warning
61
}
62
}
63
64
std::string
65
GroupMetadata::export_to_string
()
66
{
67
nlohmann::json j;
68
j[
"transfer_id"
] =
get_group_id
();
69
j[
"source_id"
] =
get_source_id
();
70
j[
"source_ip"
] =
get_source_ip
().
get_ip_port
();
71
j[
"protocol"
] =
protocol_type::protocols_to_string
(
get_protocol
());
72
j[
"protocol_options"
] =
get_protocol_options
().dump();
73
74
std::vector<std::string> files;
75
for
(
const
auto
& file :
get_transfers_meta
()) {
76
files.push_back(file->get_file_path().string());
77
}
78
j[
"files"
] = files;
79
80
return
j.dump();
81
}
82
83
void
84
GroupMetadata::from_string
(
const
std::string& str)
85
{
86
nlohmann::json j = nlohmann::json::parse(str);
87
88
TLOG
() <<
"debug : Loading metadata from string "
<< str;
89
90
if
(j.contains(
"transfer_id"
)) {
91
set_group_id
(j[
"transfer_id"
].get<std::string>());
92
}
93
if
(j.contains(
"source_id"
)) {
94
set_source_id
(j[
"source_id"
].get<std::string>());
95
}
96
if
(j.contains(
"source_ip"
)) {
97
m_source_ip
=
IPFormat
(j[
"source_ip"
].get<std::string>());
98
}
99
if
(j.contains(
"protocol"
)) {
100
set_protocol
(
protocol_type::string_to_protocols
(j[
"protocol"
].get<std::string>()).value());
101
}
102
if
(j.contains(
"protocol_options"
)) {
103
set_protocol_options
(nlohmann::json::parse(j[
"protocol_options"
].get<std::string>()));
104
}
105
if
(j.contains(
"files"
)) {
106
auto
files = j[
"files"
].get<std::vector<std::filesystem::path>>();
107
108
for
(
const
auto
& file : files) {
109
add_expected_file
(file);
110
}
111
}
112
}
113
114
void
115
GroupMetadata::generate_metadata_file
(std::filesystem::path dest)
116
{
117
std::ofstream metadata_file;
118
metadata_file.open(dest.append(
get_group_id
()).
string
() +
m_file_extension
);
119
120
metadata_file <<
export_to_string
();
121
122
metadata_file.close();
123
}
124
125
void
126
GroupMetadata::load_metadata_from_meta_file
(std::filesystem::path src)
127
{
128
std::ifstream metadata_file;
129
try
{
130
metadata_file.open(src.string());
131
}
catch
(
const
std::exception& e) {
132
ers::error
(MetadataFileNotFoundError(
ERS_HERE
, e.what()));
133
return
;
134
}
135
136
std::stringstream buffer;
137
buffer << metadata_file.rdbuf();
138
139
from_string
(buffer.str());
140
141
metadata_file.close();
142
}
143
144
std::string
145
GroupMetadata::to_string
()
const
146
{
147
std::string str;
148
str +=
"transfer_id "
+
get_group_id
() +
" "
;
149
str +=
"protocol "
+
protocol_type::protocols_to_string
(
get_protocol
()) +
"\n"
;
150
151
for
(
const
auto
& file :
get_transfers_meta
()) {
152
str +=
"*file "
+ file->get_file_name() +
"\n"
;
153
}
154
for
(
const
auto
& file :
get_expected_files
()) {
155
str +=
"*expectedfile "
+ file +
"\n"
;
156
}
157
return
str;
158
}
159
}
// namespace dunedaq::snbmodules
ERS_HERE
#define ERS_HERE
Definition
LocalContext.hpp:141
dunedaq::snbmodules::GroupMetadata::load_metadata_from_meta_file
void load_metadata_from_meta_file(std::filesystem::path src) override
Load metadata file from src.
Definition
group_metadata.cpp:126
dunedaq::snbmodules::GroupMetadata::get_source_id
std::string get_source_id() const
Definition
group_metadata.hpp:143
dunedaq::snbmodules::GroupMetadata::m_source_ip
IPFormat m_source_ip
Get source ip.
Definition
group_metadata.hpp:167
dunedaq::snbmodules::GroupMetadata::m_group_id
std::string m_group_id
Unique identifier for the transfer.
Definition
group_metadata.hpp:149
dunedaq::snbmodules::GroupMetadata::get_protocol
protocol_type::e_protocol_type get_protocol() const
Definition
group_metadata.hpp:137
dunedaq::snbmodules::GroupMetadata::to_string
std::string to_string() const
Definition
group_metadata.cpp:145
dunedaq::snbmodules::GroupMetadata::export_to_string
std::string export_to_string() override
Export metadata to string (json format).
Definition
group_metadata.cpp:65
dunedaq::snbmodules::GroupMetadata::m_expected_files
std::set< std::string > m_expected_files
Set of expected files metadata to add later.
Definition
group_metadata.hpp:161
dunedaq::snbmodules::GroupMetadata::generate_metadata_file
void generate_metadata_file(std::filesystem::path dest) override
Generaete metadata file to dest.
Definition
group_metadata.cpp:115
dunedaq::snbmodules::GroupMetadata::add_expected_file
void add_expected_file(const std::filesystem::path &file)
Definition
group_metadata.hpp:116
dunedaq::snbmodules::GroupMetadata::add_file
TransferMetadata & add_file(std::shared_ptr< TransferMetadata > meta)
Definition
group_metadata.cpp:36
dunedaq::snbmodules::GroupMetadata::set_protocol
void set_protocol(protocol_type::e_protocol_type protocol)
Definition
group_metadata.hpp:104
dunedaq::snbmodules::GroupMetadata::get_expected_files
const std::set< std::string > & get_expected_files() const
Definition
group_metadata.hpp:141
dunedaq::snbmodules::GroupMetadata::get_transfer_meta_from_file_path
TransferMetadata & get_transfer_meta_from_file_path(const std::string &file_path)
Definition
group_metadata.cpp:24
dunedaq::snbmodules::GroupMetadata::m_transfers_meta
std::vector< std::shared_ptr< TransferMetadata > > m_transfers_meta
Set of files to transfer.
Definition
group_metadata.hpp:158
dunedaq::snbmodules::GroupMetadata::get_transfers_meta
std::vector< std::shared_ptr< TransferMetadata > > & get_transfers_meta()
Definition
group_metadata.hpp:138
dunedaq::snbmodules::GroupMetadata::set_source_id
void set_source_id(std::string source_id)
Definition
group_metadata.hpp:113
dunedaq::snbmodules::GroupMetadata::get_protocol_options
nlohmann::json get_protocol_options() const
Definition
group_metadata.hpp:142
dunedaq::snbmodules::GroupMetadata::m_file_extension
static const std::string m_file_extension
Definition
group_metadata.hpp:29
dunedaq::snbmodules::GroupMetadata::set_protocol_options
void set_protocol_options(nlohmann::json protocol_options)
Definition
group_metadata.hpp:109
dunedaq::snbmodules::GroupMetadata::get_group_id
std::string get_group_id() const
Definition
group_metadata.hpp:136
dunedaq::snbmodules::GroupMetadata::set_group_id
void set_group_id(std::string transfer_id)
Definition
group_metadata.hpp:103
dunedaq::snbmodules::GroupMetadata::get_source_ip
IPFormat get_source_ip() const
Definition
group_metadata.hpp:144
dunedaq::snbmodules::GroupMetadata::from_string
void from_string(const std::string &) override
Import metadata from string (json format).
Definition
group_metadata.cpp:84
dunedaq::snbmodules::IPFormat
Class that represents an IP address and a port TODO: should be replaced by something better ?
Definition
ip_format.hpp:26
dunedaq::snbmodules::IPFormat::get_ip_port
std::string get_ip_port() const
Get the IP address and the port in the format "ip:port".
Definition
ip_format.hpp:57
dunedaq::snbmodules::TransferMetadata
Definition
transfer_metadata.hpp:29
group_metadata.hpp
TLOG
#define TLOG(...)
Definition
macro.hpp:22
dunedaq::snbmodules
Definition
bookkeeper.hpp:30
ers::fatal
void fatal(const Issue &issue)
Definition
ers.hpp:99
ers::error
void error(const Issue &issue)
Definition
ers.hpp:92
dunedaq::snbmodules::protocol_type::string_to_protocols
static std::optional< e_protocol_type > string_to_protocols(std::string s)
Definition
protocols_enum.hpp:37
dunedaq::snbmodules::protocol_type::protocols_to_string
static std::string protocols_to_string(e_protocol_type e)
Definition
protocols_enum.hpp:28
Generated on
for DUNE-DAQ by
1.17.0