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
:
66
BufferedFileWriter
(std::string
filename
,
size_t
buffer_size, std::string compression_algorithm =
"None"
,
bool
use_o_direct =
true
)
67
{
68
open
(
filename
, buffer_size, compression_algorithm, use_o_direct);
69
}
70
74
BufferedFileWriter
() {}
75
79
~BufferedFileWriter
()
80
{
81
if
(
m_is_open
)
82
close
();
83
}
84
85
BufferedFileWriter
(
const
BufferedFileWriter
&) =
delete
;
86
BufferedFileWriter
&
operator=
(
const
BufferedFileWriter
&) =
delete
;
87
BufferedFileWriter
(
BufferedFileWriter
&&) =
delete
;
88
BufferedFileWriter
&
operator=
(
BufferedFileWriter
&&) =
delete
;
89
101
void
open
(std::string
filename
,
102
size_t
buffer_size,
103
std::string compression_algorithm =
"None"
,
104
bool
use_o_direct =
true
)
105
{
106
m_use_o_direct
= use_o_direct;
107
if
(
m_is_open
) {
108
close
();
109
}
110
111
m_filename
=
filename
;
112
m_buffer_size
= buffer_size;
113
m_compression_algorithm
= compression_algorithm;
114
auto
oflag = O_CREAT | O_WRONLY;
115
if
(
m_use_o_direct
) {
116
oflag = oflag | O_DIRECT;
117
}
118
119
m_fd
=
::open
(
m_filename
.c_str(), oflag, 0644);
120
if
(
m_fd
== -1) {
121
throw
BufferedReaderWriterCannotOpenFile(
ERS_HERE
,
m_filename
);
122
}
123
124
m_sink
=
io_sink_t
(
m_fd
, boost::iostreams::file_descriptor_flags::close_handle);
125
if
(
m_compression_algorithm
==
"zstd"
) {
126
TLOG_DEBUG
(
TLVL_WORK_STEPS
) <<
"Using zstd compression"
<< std::endl;
127
m_output_stream
.push(boost::iostreams::zstd_compressor(boost::iostreams::zstd::best_speed));
128
}
else
if
(
m_compression_algorithm
==
"lzma"
) {
129
TLOG_DEBUG
(
TLVL_WORK_STEPS
) <<
"Using lzma compression"
<< std::endl;
130
m_output_stream
.push(boost::iostreams::lzma_compressor(boost::iostreams::lzma::best_speed));
131
}
else
if
(
m_compression_algorithm
==
"zlib"
) {
132
TLOG_DEBUG
(
TLVL_WORK_STEPS
) <<
"Using zlib compression"
<< std::endl;
133
m_output_stream
.push(boost::iostreams::zlib_compressor(boost::iostreams::zlib::best_speed));
134
}
else
if
(
m_compression_algorithm
==
"None"
) {
135
TLOG_DEBUG
(
TLVL_WORK_STEPS
) <<
"Running without compression"
<< std::endl;
136
}
else
{
137
throw
BufferedReaderWriterConfigurationError
(
ERS_HERE
,
138
"Non-recognized compression algorithm: "
+
m_compression_algorithm
);
139
}
140
141
m_output_stream
.push(
m_sink
,
m_buffer_size
);
142
m_is_open
=
true
;
143
}
144
149
bool
is_open
()
const
{
return
m_is_open
; }
150
156
bool
write
(
const
char
* memory,
const
size_t
size
)
157
{
158
if
(!
m_is_open
)
159
return
false
;
160
m_output_stream
.write(memory,
size
);
// NOLINT
161
return
!
m_output_stream
.bad();
162
}
163
167
void
close
()
168
{
169
// Set the file descriptor to not use O_DIRECT. This is necessary because the write size has to be aligned for
170
// O_DIRECT to succeed. This is not guaranteed for the data that remains in the buffer.
171
fcntl(
m_fd
, F_SETFL, O_CREAT | O_WRONLY);
172
m_output_stream
.reset();
173
m_is_open
=
false
;
174
}
175
180
void
flush
()
181
{
182
// Set the file descriptor to not use O_DIRECT. This is necessary because the write size has to be aligned for
183
// O_DIRECT to succeed. This is not guaranteed for the data that remains in the buffer.
184
fcntl(
m_fd
, F_SETFL, O_CREAT | O_WRONLY);
185
// This does not flush the compressor as it is not flushable
186
m_output_stream
.flush();
187
// Activate O_DIRECT again
188
auto
oflag = O_CREAT | O_WRONLY;
189
if
(
m_use_o_direct
) {
190
oflag = oflag | O_DIRECT;
191
}
192
fcntl(
m_fd
, F_SETFL, oflag);
193
}
194
195
private
:
196
// Config parameters
197
std::string
m_filename
;
198
size_t
m_buffer_size
;
199
std::string
m_compression_algorithm
;
200
201
// Internals
202
int
m_fd
;
203
io_sink_t
m_sink
;
204
filtering_ostream_t
m_output_stream
;
205
bool
m_is_open
=
false
;
206
bool
m_use_o_direct
=
true
;
207
};
208
209
}
// namespace datahandlinglibs
210
}
// namespace dunedaq
211
212
#endif
// DATAHANDLINGLIBS_INCLUDE_DATAHANDLINGLIBS_UTILS_BUFFEREDFILEWRITER_HPP_
DataHandlingIssues.hpp
TLVL_WORK_STEPS
@ TLVL_WORK_STEPS
Definition
IfaceWrapper.cpp:52
ERS_HERE
#define ERS_HERE
Definition
LocalContext.hpp:141
ReadoutLogging.hpp
dunedaq::datahandlinglibs::BufferedFileWriter::flush
void flush()
Definition
BufferedFileWriter.hpp:180
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:101
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:198
dunedaq::datahandlinglibs::BufferedFileWriter::m_use_o_direct
bool m_use_o_direct
Definition
BufferedFileWriter.hpp:206
dunedaq::datahandlinglibs::BufferedFileWriter::BufferedFileWriter
BufferedFileWriter()
Definition
BufferedFileWriter.hpp:74
dunedaq::datahandlinglibs::BufferedFileWriter::m_fd
int m_fd
Definition
BufferedFileWriter.hpp:202
dunedaq::datahandlinglibs::BufferedFileWriter::m_compression_algorithm
std::string m_compression_algorithm
Definition
BufferedFileWriter.hpp:199
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:79
dunedaq::datahandlinglibs::BufferedFileWriter::write
bool write(const char *memory, const size_t size)
Definition
BufferedFileWriter.hpp:156
dunedaq::datahandlinglibs::BufferedFileWriter::close
void close()
Definition
BufferedFileWriter.hpp:167
dunedaq::datahandlinglibs::BufferedFileWriter::m_filename
std::string m_filename
Definition
BufferedFileWriter.hpp:197
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:203
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:66
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:149
dunedaq::datahandlinglibs::BufferedFileWriter::m_is_open
bool m_is_open
Definition
BufferedFileWriter.hpp:205
dunedaq::datahandlinglibs::BufferedFileWriter::m_output_stream
filtering_ostream_t m_output_stream
Definition
BufferedFileWriter.hpp:204
Logging.hpp
TLOG_DEBUG
#define TLOG_DEBUG(lvl,...)
Definition
Logging.hpp:112
dunedaq::datahandlinglibs::logging::TLVL_WORK_STEPS
@ TLVL_WORK_STEPS
Definition
ReadoutLogging.hpp:23
dunedaq::datahandlinglibs
Definition
DataHandlingConcept.hpp:16
dunedaq
Including Qt Headers.
Definition
module.cpp:16
dunedaq::size
FELIX Initialization std::string initerror FELIX queue timed std::string queuename Unexpected chunk size
Definition
FelixIssues.hpp:28
dunedaq::BufferedReaderWriterConfigurationError
SourceID[" << sourceid << "] Command daqdataformats::SourceID Readout Initialization std::string initerror BufferedReaderWriterConfigurationError
Definition
DataHandlingIssues.hpp:41
tablepositions::filename
@ filename
Definition
ui_constants.hpp:11
Generated on
for DUNE-DAQ by
1.17.0