Skip to content
Draft
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
0e05001
Implemented two consistency check modes which can enabled with --chec…
nicolau-manubens Nov 5, 2024
26679af
wip
danovaro Jan 10, 2025
6a3e405
wip
danovaro Jan 13, 2025
91f076d
Merge branch 'develop' into remoteWipeIterator
danovaro Jan 15, 2025
4f48991
Merge branch 'develop' into remoteWipeIterator
danovaro Jan 24, 2025
e1db49e
wip
danovaro Jan 24, 2025
d792902
Merge branch 'develop' into remoteWipeIterator
danovaro Jan 24, 2025
0a7ac2f
Merge branch 'develop' into remoteWipeIterator
danovaro Feb 11, 2025
8496aa8
FDB-433 fdb-hammer modifications for ITT.
nicolau-manubens Apr 14, 2025
87d4689
Drafted barrier mechanism for writers.
nicolau-manubens May 3, 2025
0047c81
Fixes for fdb-hammer ITT mode.
nicolau-manubens May 3, 2025
cc37840
Merge latest develop.
nicolau-manubens May 3, 2025
5bdb2ca
Got internode barrier to work plus other fixes.
nicolau-manubens May 4, 2025
ec10a2d
Barrier working at scale.
nicolau-manubens May 4, 2025
a2e353d
Fixes for ITT read mode.
nicolau-manubens May 5, 2025
ec1f383
Fixes for ITT mode.
nicolau-manubens May 5, 2025
8c827ad
A few improvements.
nicolau-manubens May 5, 2025
8393aab
Randomising data in fdb-hammer writers.
nicolau-manubens May 12, 2025
b18250f
Merge branch 'develop' into remoteWipeIterator
danovaro May 28, 2025
a31be04
wip
danovaro Jun 11, 2025
5a031aa
Make MessageArchiver display bytes and time elapsed only if verbose i…
nicolau-manubens Jun 19, 2025
0ec4821
Merge branch 'develop' into remoteWipeIterator
danovaro Jun 25, 2025
7f8a896
Modified fdb-hammer to generate 32-bit instead of 64-bit random values.
nicolau-manubens Jun 29, 2025
2fca1ef
Merge branch 'develop' into remoteWipeIterator
danovaro Jun 30, 2025
70e4cda
fdb-hammer setting random values with codes_set_float_array.
nicolau-manubens Jul 1, 2025
cabb779
Fixes in fdb-hammer random value generation.
nicolau-manubens Jul 1, 2025
5b1e5d2
Fix in fdb-hammer random data generation.
nicolau-manubens Jul 2, 2025
32579fb
wip
danovaro Jul 9, 2025
494321d
wip
danovaro Jul 9, 2025
f90f3e0
Merge branch 'develop' into remoteWipeIterator
danovaro Jul 14, 2025
92ff46d
Make run_path configurable, fix missing mode on O_CREAT
ChrisspyB Aug 1, 2025
a00d02b
FDB-508 remote wipe
danovaro Aug 2, 2025
846f3ed
FDB-508 cleanup
danovaro Aug 2, 2025
def603e
FDB-508 committed missing test
danovaro Aug 3, 2025
6788d08
FDB-508 cleanup
danovaro Aug 3, 2025
49cb9bf
FDB-508 wipe: added checks for unexpected files
danovaro Aug 4, 2025
8cfe905
FDB-508 wipe: added checks for unexpected files
danovaro Aug 4, 2025
b3023d0
disabled DAOS tests
danovaro Aug 5, 2025
8103bcc
format
danovaro Aug 5, 2025
6b1bcea
missing include
danovaro Aug 5, 2025
e89e31c
version
danovaro Aug 5, 2025
7e92f92
FDB-508 fix wipe (map of stores & data files)
danovaro Aug 5, 2025
f737567
version
danovaro Aug 5, 2025
24d98b9
Merge branch 'fix-itt' into feature/fdb-hammer-consistency-checks
nicolau-manubens Aug 12, 2025
e3debd8
Small fix fdb-hammer's FDB_HAMMER_RUN_PATH.
nicolau-manubens Aug 12, 2025
8a7696c
Fix for fdb-hammer's FDB_HAMMER_RUN_PATH.
nicolau-manubens Aug 12, 2025
141facb
fdb-hammer allowing for large number of parameters with a CCSDS seed …
nicolau-manubens Aug 14, 2025
8a1de33
Fix race condition in barrier.
nicolau-manubens Aug 15, 2025
f6f2f53
Merge branch 'develop' into feature/fdb-hammer-consistency-checks
nicolau-manubens Aug 15, 2025
1da9aa2
Failing gracefully if barrier max. wait is exceeded.
nicolau-manubens Aug 20, 2025
402c4e6
Instrument barriers.
nicolau-manubens Aug 20, 2025
d2a83d7
Implemented sleep-until-step-due mechanism instead of step-end barriers.
nicolau-manubens Aug 21, 2025
a736b82
Adding random delay at the start of every writer process.
nicolau-manubens Aug 21, 2025
03bb1a0
Reduced per-step time to 25 seconds.
nicolau-manubens Aug 27, 2025
2ba5fdc
Merge branch 'hotfix/5.17.5'
danovaro Sep 11, 2025
dc94527
A few usability improvements in fdb-hammer ITT mode.
nicolau-manubens Sep 11, 2025
f1ddcc9
Improvements in fdb-hammer ITT mode.
nicolau-manubens Sep 12, 2025
0438e94
Merge branch 'develop' into remoteWipeIterator
danovaro Sep 15, 2025
55e8daa
fdb-hammer logging message rather than throwing if step window exceeded.
nicolau-manubens Sep 23, 2025
b3055b8
fdb-hammer: Instrument list and bulk data read.
nicolau-manubens Sep 23, 2025
cc3d948
Using FDB::read on previously listed URIs instead of ::list plus ::re…
nicolau-manubens Sep 24, 2025
76aff85
Update src/fdb5/api/helpers/WipeIterator.h
simondsmart Sep 24, 2025
a3d0af5
fdb-hammer ITT: add option to read fields from a list of provided URI…
nicolau-manubens Sep 24, 2025
a8073ef
fdb-hammer fixes in URI reading.
nicolau-manubens Sep 25, 2025
ce0ce86
fdb-hammer ITT mode fix pre-listing and read bandwidth.
nicolau-manubens Sep 26, 2025
9866dfe
Merge branch 'release/5.18.0'
danovaro Sep 27, 2025
8ac4d7d
Merge branch 'develop' into remoteWipeIterator
danovaro Sep 28, 2025
70635b5
fdb-hammer options to iterate only over a subset of the specified dom…
nicolau-manubens Oct 2, 2025
6cccc26
fdb-hammer support for subset iteration in reader mode.
nicolau-manubens Oct 2, 2025
155a89e
fdb-hammer fixes for subset iteration in itt reader mode.
nicolau-manubens Oct 3, 2025
6ba1aa3
fdb-hammer fix for ITT readers.
nicolau-manubens Oct 3, 2025
0c5b9ee
Merge branch 'develop' into feature/fdb-hammer-consistency-checks
nicolau-manubens Oct 13, 2025
714bdd6
fdb-hammer clang formatting.
nicolau-manubens Oct 13, 2025
aca2d88
fdb-hammer replace eckit::Optional by std::optional.
nicolau-manubens Oct 13, 2025
03e5a10
Fixes for consistency checks.
nicolau-manubens Oct 19, 2025
6afe3da
fdb-hammer fix in consistency checks.
nicolau-manubens Oct 19, 2025
2cb1578
Extract config & md checks
simondsmart Oct 22, 2025
1b725bf
Refactor verification checks, and enable simultaneous retrieve and ve…
simondsmart Oct 26, 2025
92c176e
Handle data randomisation, full check, and CCSDS causing data sizes t…
simondsmart Oct 26, 2025
10c64f3
Tidy up nodes parsing
simondsmart Oct 26, 2025
bd9df13
Skip field order checks for --X-check with prelisting (order not known)
simondsmart Oct 28, 2025
b98fa39
added check flag (md vs full) to the message body
danovaro Oct 29, 2025
eba4a21
Merge branch 'feature/refactor-benchmark' into hotfix/5.18.1
danovaro Oct 30, 2025
a86d2a8
format
danovaro Oct 30, 2025
188ce86
version bump (5.18.1)
danovaro Oct 30, 2025
1f1a8ad
Merge branch 'hotfix/5.18.1'
danovaro Oct 30, 2025
8b1c2cd
Merge branch 'master' into remoteWipeIterator
danovaro Nov 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
5.17.3
5.17.4-rc
120 changes: 120 additions & 0 deletions WipeIterator.cc
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I assume this file should be deleted? It is a (older/newer) copy of src/fdb5/api/helpers/WipeIterator.cc

Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
/*
* (C) Copyright 1996- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
* In applying this licence, ECMWF does not waive the privileges and immunities
* granted to it by virtue of its status as an intergovernmental organisation nor
* does it submit to any jurisdiction.
*/

#include "fdb5/api/helpers/WipeIterator.h"

#include "eckit/log/Log.h"
#include "eckit/serialisation/Stream.h"

#include "fdb5/LibFdb5.h"

using namespace eckit;
namespace fdb5 {

//----------------------------------------------------------------------------------------------------------------------

std::ostream& operator<<(std::ostream& s, const WipeElementType& t) {
switch (t) {
case WipeElementType::WIPE_CATALOGUE_INFO:
s << "WIPE_CATALOGUE_INFO";
break;
case WipeElementType::WIPE_CATALOGUE:
s << "WIPE_CATALOGUE";
break;
case WipeElementType::WIPE_CATALOGUE_SAFE:
s << "WIPE_CATALOGUE_SAFE";
break;
case WipeElementType::WIPE_CATALOGUE_AUX:
s << "WIPE_CATALOGUE_AUX";
break;
case WipeElementType::WIPE_STORE_INFO:
s << "WIPE_STORE_INFO";
break;
case WipeElementType::WIPE_STORE:
s << "WIPE_STORE";
break;
case WipeElementType::WIPE_STORE_URI:
s << "WIPE_STORE_URI";
break;
case WipeElementType::WIPE_STORE_AUX:
s << "WIPE_STORE_AUX";
break;
}
s << "(" << ((int)t) << ")";
return s;
}

WipeElement::WipeElement(WipeElementType type, const std::string& msg, eckit::URI uri) :
type_(type), msg_(msg), uris_({uri}) {}

WipeElement::WipeElement(WipeElementType type, const std::string& msg, const std::vector<eckit::URI>& uris) :
type_(type), msg_(msg), uris_(uris) {}

WipeElement::WipeElement(eckit::Stream& s) {
unsigned char t;
s >> t;
type_ = static_cast<WipeElementType>(t);
s >> msg_;
size_t numURIs;
s >> numURIs;
for (size_t i = 0; i < numURIs; i++) {
uris_.push_back(s);
}
}

void WipeElement::print(std::ostream& out) const {

LOG_DEBUG_LIB(LibFdb5) << "Wipe(type=" << type_ << ",msg=" << msg_ << ",uris=[";
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oof. This is unpleasant inside ::print(), as this method is typically called in the middle of ostream output. Which results in info/error/debug output becoming interleaved on the terminal. A but unpleasant.

std::string sep = "";
for (const auto& uri : uris_) {
LOG_DEBUG_LIB(LibFdb5) << sep << std::endl << " " << uri;
sep = ",";
}
LOG_DEBUG_LIB(LibFdb5) << "])" << std::endl;


out << msg_ << std::endl;
if (type_ != WIPE_CATALOGUE_INFO && type_ != WIPE_STORE_INFO) {
if (uris_.size() > 0) {
for (const auto& uri : uris_) {
out << " " << uri.asString() << std::endl;
}
out << std::endl;
}
else {
out << " - NONE -" << std::endl;
}
}
}

size_t encodeSizeString(const std::string& s) {
return (1 + 4 + s.size());
}

size_t WipeElement::encodeSize() const {
// size_t aux = 0;
// for (const auto& l : uris_) {
// aux += 256;
// }
return 1 + 4 + encodeSizeString(msg_) + 1 + 4 + (256 * uris_.size());
}

void WipeElement::encode(eckit::Stream& s) const {
s << static_cast<unsigned char>(type_);
s << msg_;
s << uris_.size();
for (const auto& uri : uris_) {
s << uri;
}
}

//----------------------------------------------------------------------------------------------------------------------

} // namespace fdb5
11 changes: 5 additions & 6 deletions src/fdb5/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ list( APPEND fdb5_srcs
api/helpers/LockIterator.h
api/helpers/MoveIterator.h
api/helpers/StatusIterator.h
api/helpers/WipeIterator.cc
api/helpers/WipeIterator.h
api/helpers/PurgeIterator.h
api/helpers/StatsIterator.cc
Expand Down Expand Up @@ -118,8 +119,8 @@ list( APPEND fdb5_srcs
database/Store.h
database/PurgeVisitor.cc
database/PurgeVisitor.h
database/WipeVisitor.cc
database/WipeVisitor.h
# database/WipeVisitor.cc
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove

# database/WipeVisitor.h
database/MoveVisitor.cc
database/MoveVisitor.h
database/IndexAxis.cc
Expand Down Expand Up @@ -318,8 +319,6 @@ if( HAVE_TOCFDB )
toc/TocPurgeVisitor.h
toc/TocSerialisationVersion.cc
toc/TocSerialisationVersion.h
toc/TocWipeVisitor.cc
toc/TocWipeVisitor.h
toc/TocMoveVisitor.cc
toc/TocMoveVisitor.h
toc/TocRecord.cc
Expand Down Expand Up @@ -389,8 +388,8 @@ if( HAVE_DAOSFDB )
daos/DaosIndexLocation.cc
daos/DaosCommon.h
daos/DaosCommon.cc
daos/DaosWipeVisitor.h
daos/DaosWipeVisitor.cc
# daos/DaosWipeVisitor.h
# daos/DaosWipeVisitor.cc
Comment on lines +393 to +394
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

del

daos/DaosArrayPartHandle.h
daos/DaosArrayPartHandle.cc
daos/DaosLazyFieldLocation.h
Expand Down
2 changes: 1 addition & 1 deletion src/fdb5/api/LocalFDB.cc
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ StatusIterator LocalFDB::status(const FDBToolRequest& request) {

WipeIterator LocalFDB::wipe(const FDBToolRequest& request, bool doit, bool porcelain, bool unsafeWipeAll) {
LOG_DEBUG_LIB(LibFdb5) << "LocalFDB::wipe() : " << request << std::endl;
return queryInternal<fdb5::api::local::WipeVisitor>(request, doit, porcelain, unsafeWipeAll);
return queryInternal<WipeVisitor>(request, doit, porcelain, unsafeWipeAll);
}

MoveIterator LocalFDB::move(const FDBToolRequest& request, const eckit::URI& dest) {
Expand Down
43 changes: 37 additions & 6 deletions src/fdb5/api/RemoteFDB.cc
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,11 @@ struct ListHelper : BaseAPIHelper<fdb5::ListElement, fdb5::remote::Message::List

if (elem.hasLocation()) {

eckit::Log::debug<fdb5::LibFdb5>() << "ListHelper::valueFromStream - original location: ";
elem.location().dump(eckit::Log::debug<fdb5::LibFdb5>());
eckit::Log::debug<fdb5::LibFdb5>() << std::endl;
if (fdb5::LibFdb5::instance().debug()) {
eckit::Log::debug<fdb5::LibFdb5>() << "ListHelper::valueFromStream - original location: ";
elem.location().dump(eckit::Log::debug<fdb5::LibFdb5>());
eckit::Log::debug<fdb5::LibFdb5>() << std::endl;
}

// TODO move the endpoint replacement to the server side ()
if (elem.location().uri().scheme() == "fdb") {
Expand Down Expand Up @@ -92,9 +94,11 @@ struct InspectHelper : BaseAPIHelper<fdb5::ListElement, fdb5::remote::Message::I
static fdb5::ListElement valueFromStream(eckit::Stream& s, fdb5::RemoteFDB* fdb) {
fdb5::ListElement elem(s);

eckit::Log::debug<fdb5::LibFdb5>() << "InspectHelper::valueFromStream - original location: ";
elem.location().dump(eckit::Log::debug<fdb5::LibFdb5>());
eckit::Log::debug<fdb5::LibFdb5>() << std::endl;
if (fdb5::LibFdb5::instance().debug()) {
eckit::Log::debug<fdb5::LibFdb5>() << "InspectHelper::valueFromStream - original location: ";
elem.location().dump(eckit::Log::debug<fdb5::LibFdb5>());
eckit::Log::debug<fdb5::LibFdb5>() << std::endl;
}

if (elem.location().uri().scheme() == "fdb") {
eckit::net::Endpoint fieldLocationEndpoint{elem.location().uri().host(), elem.location().uri().port()};
Expand All @@ -111,6 +115,29 @@ struct InspectHelper : BaseAPIHelper<fdb5::ListElement, fdb5::remote::Message::I
}
};

struct WipeHelper : BaseAPIHelper<fdb5::WipeElement, fdb5::remote::Message::Wipe> {

WipeHelper(bool doit, bool porcelain, bool unsafeWipeAll) :
doit_(doit), porcelain_(porcelain), unsafeWipeAll_(unsafeWipeAll) {}

void encodeExtra(eckit::Stream& s) const {
s << doit_;
s << porcelain_;
s << unsafeWipeAll_;
}

static fdb5::WipeElement valueFromStream(eckit::Stream& s, fdb5::RemoteFDB* fdb) {
fdb5::WipeElement elem{s};
return elem;
}

private:

bool doit_;
bool porcelain_;
bool unsafeWipeAll_;
};

} // namespace

namespace fdb5 {
Expand Down Expand Up @@ -281,6 +308,10 @@ StatsIterator RemoteFDB::stats(const FDBToolRequest& request) {
return forwardApiCall(StatsHelper(), request);
}

WipeIterator RemoteFDB::wipe(const FDBToolRequest& request, bool doit, bool porcelain, bool unsafeWipeAll) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My understanding of this is that it implies that wipe runs fully on the Catalogue (none of the communication is via the client).

What happens in the case that we have a remote Catalogue, but local stores (e.g. stores on Lustre). The Catalogue may not have the right filesystem permissions to wipe data which has been written by the user.

I'm not sure that this design is functionally correct.

return forwardApiCall(WipeHelper(doit, porcelain, unsafeWipeAll), request);
}

void RemoteFDB::print(std::ostream& s) const {
s << "RemoteFDB(...)";
}
Expand Down
2 changes: 1 addition & 1 deletion src/fdb5/api/RemoteFDB.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ class RemoteFDB : public LocalFDB, public remote::Client {

StatusIterator status(const FDBToolRequest& request) override { NOTIMP; }

WipeIterator wipe(const FDBToolRequest& request, bool doit, bool porcelain, bool unsafeWipeAll) override { NOTIMP; }
WipeIterator wipe(const FDBToolRequest& request, bool doit, bool porcelain, bool unsafeWipeAll) override;

PurgeIterator purge(const FDBToolRequest& request, bool doit, bool porcelain) override { NOTIMP; }

Expand Down
2 changes: 1 addition & 1 deletion src/fdb5/api/fdb_c.cc
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ struct fdb_wipe_element_t {

fdb_wipe_element_t(WipeElement&& e) : element_(std::move(e)) {}

const char* c_str() const { return element_.c_str(); }
const char* c_str() const { return element_.msg().c_str(); }

private:

Expand Down
1 change: 1 addition & 0 deletions src/fdb5/api/helpers/ListIterator.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#ifndef fdb5_ListIterator_H
#define fdb5_ListIterator_H

#include <unordered_map>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this need in this header?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed. I'm very surprised to see this being added to this header when the list functionality should be essentially untouched here...

#include <unordered_set>
#include <utility>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it'd be good to add #include <array> and <iosfwd>


Expand Down
84 changes: 84 additions & 0 deletions src/fdb5/api/helpers/WipeIterator.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/*
* (C) Copyright 1996- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
* In applying this licence, ECMWF does not waive the privileges and immunities
* granted to it by virtue of its status as an intergovernmental organisation nor
* does it submit to any jurisdiction.
*/

#include "fdb5/api/helpers/WipeIterator.h"

#include "eckit/serialisation/Stream.h"

namespace fdb5 {

//----------------------------------------------------------------------------------------------------------------------

WipeElement::WipeElement(WipeElementType type, const std::string& msg, eckit::URI uri) :
type_(type), msg_(msg), uris_({uri}) {}

WipeElement::WipeElement(WipeElementType type, const std::string& msg) : type_(type), msg_(msg), uris_({}) {}

WipeElement::WipeElement(WipeElementType type, const std::string& msg, std::set<eckit::URI>&& uris) :
type_(type), msg_(msg), uris_(std::move(uris)) {}

WipeElement::WipeElement(eckit::Stream& s) {
unsigned char t;
s >> t;
type_ = static_cast<WipeElementType>(t);
s >> msg_;
size_t numURIs;
s >> numURIs;
for (size_t i = 0; i < numURIs; i++) {
uris_.insert(eckit::URI{s});
}
}

void WipeElement::print(std::ostream& out) const {
// out << "Wipe(type=" << type_ << ",msg=" << msg_ << ",uris=[";
// std::string sep = "";
// for (const auto& uri : uris_) {
// out << sep << uri;
// sep = ",";
// }
// out << "])";
Comment on lines +40 to +46
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

del

out << msg_ << std::endl;
if (type_ != WIPE_CATALOGUE_INFO && type_ != WIPE_STORE_INFO) {
if (uris_.size() > 0) {
for (const auto& uri : uris_) {
out << " " << uri.asString() << std::endl;
}
out << std::endl;
}
else {
out << " - NONE -" << std::endl;
}
}
}

size_t encodeSizeString(const std::string& s) {
return (1 + 4 + s.size());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the 1 and the 4 for?

}

size_t WipeElement::encodeSize() const {
size_t aux = 0;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So... aux here is the estimated size of all the uris combined? Why is it called aux?

for (const auto& l : uris_) {
aux += 256;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

256? wot?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Surely this should add the length of the URI? Or something dependent on that.

}
return 1 + 4 + encodeSizeString(msg_) + 1 + 4 + aux;
}

void WipeElement::encode(eckit::Stream& s) const {
s << static_cast<unsigned char>(type_);
s << msg_;
s << uris_.size();
for (const auto& uri : uris_) {
s << uri;
}
}

//----------------------------------------------------------------------------------------------------------------------

} // namespace fdb5
Loading
Loading