DUNE-DAQ
DUNE Trigger and Data Acquisition software
Toggle main menu visibility
Loading...
Searching...
No Matches
dunedaq
sourcecode
datahandlinglibs
include
datahandlinglibs
utils
BufferedFileWriter.hpp
Go to the documentation of this file.
1
11
#ifndef DATAHANDLINGLIBS_INCLUDE_DATAHANDLINGLIBS_UTILS_BUFFEREDFILEWRITER_HPP_
12
#define DATAHANDLINGLIBS_INCLUDE_DATAHANDLINGLIBS_UTILS_BUFFEREDFILEWRITER_HPP_
13
14
#include "
datahandlinglibs/DataHandlingIssues.hpp
"
15
#include "
datahandlinglibs/ReadoutLogging.hpp
"
16
17
#include "
logging/Logging.hpp
"
18
19
#include <boost/align/aligned_allocator.hpp>
20
#include <boost/iostreams/device/file_descriptor.hpp>
21
#include <boost/iostreams/filter/lzma.hpp>
22
#include <boost/iostreams/filter/zlib.hpp>
23
#include <boost/iostreams/filter/zstd.hpp>
24
#include <boost/iostreams/filtering_stream.hpp>
25
#include <boost/iostreams/stream.hpp>
26
#include <boost/iostreams/stream_buffer.hpp>
27
28
#include <fcntl.h>
29
#include <fstream>
30
#include <iostream>
31
#include <limits>
32
#include <string>
33
#include <unistd.h>
34
35
using
dunedaq::datahandlinglibs::logging::TLVL_WORK_STEPS
;
36
37
namespace
dunedaq
{
38
namespace
datahandlinglibs
{
46
template
<
size_t
Alignment = 4096>
47
class
BufferedFileWriter
48
{
49
using
io_sink_t
= boost::iostreams::file_descriptor_sink;
50
using
aligned_allocator_t
= boost::alignment::aligned_allocator<io_sink_t::char_type, Alignment>;
51
using
filtering_ostream_t
=
52
boost::iostreams::filtering_stream<boost::iostreams::output, char, std::char_traits<char>,
aligned_allocator_t
>;
53
54
public
:
67
BufferedFileWriter
(std::string filename,
68
size_t
buffer_size,
69
std::string compression_algorithm =
"None"
,
70
bool
use_o_direct =
true
)
71
{
72
open
(
filename
, buffer_size, compression_algorithm, use_o_direct);
73
}
74
78
BufferedFileWriter
() {}
79
83
~BufferedFileWriter
()
84
{
85
if
(
m_is_open
)
86
close
();
87
}
88
89
BufferedFileWriter
(
const
BufferedFileWriter
&) =
delete
;
90
BufferedFileWriter
&
operator=
(
const
BufferedFileWriter
&) =
delete
;
91
BufferedFileWriter
(
BufferedFileWriter
&&) =
delete
;
92
BufferedFileWriter
&
operator=
(
BufferedFileWriter
&&) =
delete
;
93
106
void
open
(std::string filename,
107
size_t
buffer_size,
108
std::string compression_algorithm =
"None"
,
109
bool
use_o_direct =
true
)
110
{
111
m_use_o_direct
= use_o_direct;
112
if
(
m_is_open
) {
113
close
();
114
}
115
116
m_filename
=
filename
;
117
m_buffer_size
= buffer_size;
118
m_compression_algorithm
= compression_algorithm;
119
auto
oflag = O_CREAT | O_WRONLY;
120
if
(
m_use_o_direct
) {
121
oflag = oflag | O_DIRECT;
122
}
123
124
m_fd
=
::open
(
m_filename
.c_str(), oflag, 0644);
125
if
(
m_fd
== -1) {
126
throw
BufferedReaderWriterCannotOpenFile(
ERS_HERE
,
m_filename
);
127
}
128
129
m_sink
=
io_sink_t
(
m_fd
, boost::iostreams::file_descriptor_flags::close_handle);
130
if
(
m_compression_algorithm
==
"zstd"
) {
131
TLOG_DEBUG
(
TLVL_WORK_STEPS
) <<
"Using zstd compression"
<< std::endl;
132
m_output_stream
.push(boost::iostreams::zstd_compressor(boost::iostreams::zstd::best_speed));
133
}
else
if
(
m_compression_algorithm
==
"lzma"
) {
134
TLOG_DEBUG
(
TLVL_WORK_STEPS
) <<
"Using lzma compression"
<< std::endl;
135
m_output_stream
.push(boost::iostreams::lzma_compressor(boost::iostreams::lzma::best_speed));
136
}
else
if
(
m_compression_algorithm
==
"zlib"
) {
137
TLOG_DEBUG
(
TLVL_WORK_STEPS
) <<
"Using zlib compression"
<< std::endl;
138
m_output_stream
.push(boost::iostreams::zlib_compressor(boost::iostreams::zlib::best_speed));
139
}
else
if
(
m_compression_algorithm
==
"None"
) {
140
TLOG_DEBUG
(
TLVL_WORK_STEPS
) <<
"Running without compression"
<< std::endl;
141
}
else
{
142
throw
BufferedReaderWriterConfigurationError
(
ERS_HERE
,
143
"Non-recognized compression algorithm: "
+
m_compression_algorithm
);
144
}
145
146
m_output_stream
.push(
m_sink
,
m_buffer_size
);
147
m_is_open
=
true
;
148
}
149
154
bool
is_open
()
const
{
return
m_is_open
; }
155
161
bool
write
(
const
char
* memory,
const
size_t
size
)
162
{
163
if
(!
m_is_open
)
164
return
false
;
165
m_output_stream
.write(memory,
size
);
// NOLINT
166
return
!
m_output_stream
.bad();
167
}
168
172
void
close
()
173
{
174
// Set the file descriptor to not use O_DIRECT. This is necessary because the write size has to be aligned for
175
// O_DIRECT to succeed. This is not guaranteed for the data that remains in the buffer.
176
fcntl(
m_fd
, F_SETFL, O_CREAT | O_WRONLY);
177
m_output_stream
.reset();
178
m_is_open
=
false
;
179
}
180
185
void
flush
()
186
{
187
// Set the file descriptor to not use O_DIRECT. This is necessary because the write size has to be aligned for
188
// O_DIRECT to succeed. This is not guaranteed for the data that remains in the buffer.
189
fcntl(
m_fd
, F_SETFL, O_CREAT | O_WRONLY);
190
// This does not flush the compressor as it is not flushable
191
m_output_stream
.flush();
192
// Activate O_DIRECT again
193
auto
oflag = O_CREAT | O_WRONLY;
194
if
(
m_use_o_direct
) {
195
oflag = oflag | O_DIRECT;
196
}
197
fcntl(
m_fd
, F_SETFL, oflag);
198
}
199
200
private
:
201
// Config parameters
202
std::string
m_filename
;
203
size_t
m_buffer_size
;
204
std::string
m_compression_algorithm
;
205
206
// Internals
207
int
m_fd
;
208
io_sink_t
m_sink
;
209
filtering_ostream_t
m_output_stream
;
210
bool
m_is_open
=
false
;
211
bool
m_use_o_direct
=
true
;
212
};
213
214
}
// namespace datahandlinglibs
215
}
// namespace dunedaq
216
217
#endif
// DATAHANDLINGLIBS_INCLUDE_DATAHANDLINGLIBS_UTILS_BUFFEREDFILEWRITER_HPP_
TLVL_WORK_STEPS
@ TLVL_WORK_STEPS
Definition
CardControllerWrapper.cpp:33
DataHandlingIssues.hpp
ERS_HERE
#define ERS_HERE
Definition
LocalContext.hpp:127
ReadoutLogging.hpp
dunedaq::datahandlinglibs::BufferedFileWriter::flush
void flush()
Definition
BufferedFileWriter.hpp:185
dunedaq::datahandlinglibs::BufferedFileWriter::BufferedFileWriter
BufferedFileWriter(const BufferedFileWriter &)=delete
BufferedFileWriter is not copy-constructible.
dunedaq::datahandlinglibs::BufferedFileWriter::aligned_allocator_t
boost::alignment::aligned_allocator< io_sink_t::char_type, Alignment > aligned_allocator_t
Definition
BufferedFileWriter.hpp:50
dunedaq::datahandlinglibs::BufferedFileWriter::open
void open(std::string filename, size_t buffer_size, std::string compression_algorithm="None", bool use_o_direct=true)
Definition
BufferedFileWriter.hpp:106
dunedaq::datahandlinglibs::BufferedFileWriter::operator=
BufferedFileWriter & operator=(BufferedFileWriter &&)=delete
BufferedFileWriter is not move-assignable.
dunedaq::datahandlinglibs::BufferedFileWriter::m_buffer_size
size_t m_buffer_size
Definition
BufferedFileWriter.hpp:203
dunedaq::datahandlinglibs::BufferedFileWriter::m_use_o_direct
bool m_use_o_direct
Definition
BufferedFileWriter.hpp:211
dunedaq::datahandlinglibs::BufferedFileWriter::BufferedFileWriter
BufferedFileWriter()
Definition
BufferedFileWriter.hpp:78
dunedaq::datahandlinglibs::BufferedFileWriter::m_fd
int m_fd
Definition
BufferedFileWriter.hpp:207
dunedaq::datahandlinglibs::BufferedFileWriter::m_compression_algorithm
std::string m_compression_algorithm
Definition
BufferedFileWriter.hpp:204
dunedaq::datahandlinglibs::BufferedFileWriter::filtering_ostream_t
boost::iostreams::filtering_stream< boost::iostreams::output, char, std::char_traits< char >, aligned_allocator_t > filtering_ostream_t
Definition
BufferedFileWriter.hpp:51
dunedaq::datahandlinglibs::BufferedFileWriter::~BufferedFileWriter
~BufferedFileWriter()
Definition
BufferedFileWriter.hpp:83
dunedaq::datahandlinglibs::BufferedFileWriter::write
bool write(const char *memory, const size_t size)
Definition
BufferedFileWriter.hpp:161
dunedaq::datahandlinglibs::BufferedFileWriter::close
void close()
Definition
BufferedFileWriter.hpp:172
dunedaq::datahandlinglibs::BufferedFileWriter::m_filename
std::string m_filename
Definition
BufferedFileWriter.hpp:202
dunedaq::datahandlinglibs::BufferedFileWriter::io_sink_t
boost::iostreams::file_descriptor_sink io_sink_t
Definition
BufferedFileWriter.hpp:49
dunedaq::datahandlinglibs::BufferedFileWriter::m_sink
io_sink_t m_sink
Definition
BufferedFileWriter.hpp:208
dunedaq::datahandlinglibs::BufferedFileWriter::BufferedFileWriter
BufferedFileWriter(std::string filename, size_t buffer_size, std::string compression_algorithm="None", bool use_o_direct=true)
Definition
BufferedFileWriter.hpp:67
dunedaq::datahandlinglibs::BufferedFileWriter::BufferedFileWriter
BufferedFileWriter(BufferedFileWriter &&)=delete
BufferedFileWriter is not move-constructible.
dunedaq::datahandlinglibs::BufferedFileWriter::operator=
BufferedFileWriter & operator=(const BufferedFileWriter &)=delete
BufferedFileWriter is not copy-assginable.
dunedaq::datahandlinglibs::BufferedFileWriter::is_open
bool is_open() const
Definition
BufferedFileWriter.hpp:154
dunedaq::datahandlinglibs::BufferedFileWriter::m_is_open
bool m_is_open
Definition
BufferedFileWriter.hpp:210
dunedaq::datahandlinglibs::BufferedFileWriter::m_output_stream
filtering_ostream_t m_output_stream
Definition
BufferedFileWriter.hpp:209
Logging.hpp
TLOG_DEBUG
#define TLOG_DEBUG(lvl,...)
Definition
Logging.hpp:116
dunedaq::datahandlinglibs::logging::TLVL_WORK_STEPS
@ TLVL_WORK_STEPS
Definition
ReadoutLogging.hpp:23
dunedaq::datahandlinglibs
Definition
DataHandlingConcept.hpp:16
dunedaq
The DUNE-DAQ namespace.
Definition
cib_utilities.cpp:5
dunedaq::size
FELIX Initialization std::string initerror FELIX queue timed std::string queuename Unexpected chunk size
Definition
FelixIssues.hpp:30
dunedaq::BufferedReaderWriterConfigurationError
SourceID[" << sourceid << "] Command daqdataformats::SourceID Readout Initialization std::string initerror BufferedReaderWriterConfigurationError
Definition
DataHandlingIssues.hpp:41
tablepositions::filename
@ filename
Definition
ui_constants.hpp:13
Generated on
for DUNE-DAQ by
1.18.0