31
31
#include < folly/system/ThreadName.h>
32
32
33
33
#include " dwarfs/block_compressor.h"
34
+ #include " dwarfs/checksum.h"
34
35
#include " dwarfs/filesystem_writer.h"
35
36
#include " dwarfs/fstypes.h"
36
37
#include " dwarfs/logger.h"
@@ -155,7 +156,6 @@ class filesystem_writer_ : public filesystem_writer::impl {
155
156
template <typename T>
156
157
void write (const T& obj);
157
158
void write (const std::vector<uint8_t >& data);
158
- void write_file_header ();
159
159
void writer_thread ();
160
160
size_t mem_used () const ;
161
161
@@ -172,6 +172,7 @@ class filesystem_writer_ : public filesystem_writer::impl {
172
172
std::condition_variable cond_;
173
173
volatile bool flush_;
174
174
std::thread writer_thread_;
175
+ uint32_t section_number_{0 };
175
176
};
176
177
177
178
template <typename LoggerPolicy>
@@ -188,9 +189,7 @@ filesystem_writer_<LoggerPolicy>::filesystem_writer_(
188
189
, max_queue_size_(max_queue_size)
189
190
, log_(lgr)
190
191
, flush_(false )
191
- , writer_thread_(&filesystem_writer_::writer_thread, this ) {
192
- write_file_header ();
193
- }
192
+ , writer_thread_(&filesystem_writer_::writer_thread, this ) {}
194
193
195
194
template <typename LoggerPolicy>
196
195
filesystem_writer_<LoggerPolicy>::~filesystem_writer_ () noexcept {
@@ -268,24 +267,31 @@ void filesystem_writer_<LoggerPolicy>::write(const std::vector<uint8_t>& data) {
268
267
write (reinterpret_cast <const char *>(&data[0 ]), data.size ());
269
268
}
270
269
271
- template <typename LoggerPolicy>
272
- void filesystem_writer_<LoggerPolicy>::write_file_header() {
273
- file_header hdr;
274
- ::memcpy (&hdr.magic[0 ], " DWARFS" , 6 );
275
- hdr.major = MAJOR_VERSION;
276
- hdr.minor = MINOR_VERSION;
277
- write (hdr);
278
- }
279
-
280
270
template <typename LoggerPolicy>
281
271
void filesystem_writer_<LoggerPolicy>::write(section_type type,
282
272
compression_type compression,
283
273
const std::vector<uint8_t >& data) {
284
- section_header sh;
285
- sh.type = type;
286
- sh.compression = compression;
287
- sh.unused = 0 ;
274
+ section_header_v2 sh;
275
+ ::memcpy (&sh.magic[0 ], " DWARFS" , 6 );
276
+ sh.major = MAJOR_VERSION;
277
+ sh.minor = MINOR_VERSION;
278
+ sh.number = section_number_++;
279
+ sh.type = static_cast <uint16_t >(type);
280
+ sh.compression = static_cast <uint16_t >(compression);
288
281
sh.length = data.size ();
282
+
283
+ checksum xxh (checksum::algorithm::XXH3_64);
284
+ xxh.update (&sh.number ,
285
+ sizeof (section_header_v2) - offsetof (section_header_v2, number));
286
+ xxh.update (data.data (), data.size ());
287
+ DWARFS_CHECK (xxh.finalize (&sh.xxh3_64 ), " XXH3-64 checksum failed" );
288
+
289
+ checksum sha (checksum::algorithm::SHA2_512_256);
290
+ sha.update (&sh.xxh3_64 ,
291
+ sizeof (section_header_v2) - offsetof (section_header_v2, xxh3_64));
292
+ sha.update (data.data (), data.size ());
293
+ DWARFS_CHECK (sha.finalize (&sh.sha2_512_256 ), " SHA512/256 checksum failed" );
294
+
289
295
write (sh);
290
296
write (data);
291
297
0 commit comments