Currently, ceph-dencoder lacks certain mds types, preventing us from accurately checking the ceph corpus for encode-decode mismatches.
This pull request aims to address this issue by adding the missing types to ceph-dencoder.
To successfully incorporate these types into ceph-dencoder, we need to introduce the necessary `dump` and `generate_test_instances`
functions that was missing in some types. These functions are essential for proper encode and decode of the added types.
This PR will enhance the functionality of ceph-dencoder by including the missing types, enabling a comprehensive analysis of encode-decode consistency.
With the addition of these types, we can ensure the robustness and correctness of the ceph corpus.
This update will significantly contribute to improving the overall reliability and accuracy of ceph-dencoder.
It allows for a more comprehensive assessment of the encode-decode behavior, leading to enhanced data integrity and stability within the ceph ecosystem.
Fixes: https://tracker.ceph.com/issues/61788
Signed-off-by: Nitzan Mordechai <nmordech@redhat.com>
apply_visitor(DumpPayloadVisitor(f), payload);
}
+ static void generate_test_instances(std::list<ClientMetricMessage*>& ls) {
+ ls.push_back(new ClientMetricMessage(CapInfoPayload(1, 2, 3)));
+ }
+
void print(std::ostream *out) const {
apply_visitor(PrintPayloadVisitor(out), payload);
}
ls.push_back(new vinodeno_t);
ls.push_back(new vinodeno_t(1, 2));
}
-
inodeno_t ino;
snapid_t snapid;
};
void decode(ceph::buffer::list::const_iterator& bl);
void dump(ceph::Formatter *f) const;
static void generate_test_instances(std::list<inline_data_t*>& ls);
-
version_t version = 1;
private:
void Capability::Export::generate_test_instances(std::list<Capability::Export*>& ls)
{
- ls.push_back(new Export);
- ls.push_back(new Export);
- ls.back()->wanted = 1;
- ls.back()->issued = 2;
- ls.back()->pending = 3;
- ls.back()->client_follows = 4;
- ls.back()->mseq = 5;
- ls.back()->last_issue_stamp = utime_t(6, 7);
+ ls.push_back(new Export());
+ ls.push_back(new Export(1, 2, 3, 4, 5, 6, 7, utime_t(8, 9), 10));
}
void Capability::Import::encode(ceph::buffer::list &bl) const
f->dump_unsigned("migrate_seq", mseq);
}
+void Capability::Import::generate_test_instances(std::list<Capability::Import*>& ls)
+{
+ ls.push_back(new Import());
+ ls.push_back(new Import(1, 2, 3));
+}
/*
* Capability::revoke_info
*/
void encode(ceph::buffer::list &bl) const;
void decode(ceph::buffer::list::const_iterator &p);
void dump(ceph::Formatter *f) const;
+ static void generate_test_instances(std::list<Import*>& ls);
int64_t cap_id = 0;
ceph_seq_t issue_seq = 0;
f->close_section(); // peers
}
+void MirrorInfo::generate_test_instances(std::list<MirrorInfo*>& ls) {
+ ls.push_back(new MirrorInfo());
+ ls.push_back(new MirrorInfo());
+ ls.back()->mirrored = true;
+ ls.back()->peers.insert(Peer());
+ ls.back()->peers.insert(Peer());
+}
+
void MirrorInfo::print(std::ostream& out) const {
out << "[peers=" << peers << "]" << std::endl;
}
Peers peers;
void dump(ceph::Formatter *f) const;
+ static void generate_test_instances(std::list<MirrorInfo*>& ls);
void print(std::ostream& out) const;
void encode(ceph::buffer::list &bl) const;
DECODE_FINISH(p);
}
+void PurgeItem::generate_test_instances(std::list<PurgeItem*>& ls) {
+ ls.push_back(new PurgeItem());
+ ls.push_back(new PurgeItem());
+ ls.back()->action = PurgeItem::PURGE_FILE;
+ ls.back()->ino = 1;
+ ls.back()->size = 2;
+ ls.back()->layout = file_layout_t();
+ ls.back()->old_pools = {1, 2};
+ ls.back()->snapc = SnapContext();
+ ls.back()->stamp = utime_t(3, 4);
+}
// if Objecter has any slow requests, take that as a hint and
// slow down our rate of purging
PurgeQueue::PurgeQueue(
fragtree.dump(f);
f->close_section();
}
+ static void generate_test_instances(std::list<PurgeItem*>& ls);
std::string_view get_type_str() const;
}
static void generate_test_instances(std::list<SessionMapStore*>& ls);
-
void reset_state()
{
session_map.clear();
f->close_section();
}
+void SimpleLock::generate_test_instances(std::list<SimpleLock*>& ls) {
+ ls.push_back(new SimpleLock);
+ ls.push_back(new SimpleLock);
+ ls.back()->set_state(LOCK_SYNC);
+}
+
+
int SimpleLock::get_wait_shift() const {
switch (get_type()) {
case CEPH_LOCK_DN: return 0;
}
}
+ //for dencoder only
+ SimpleLock() :
+ type(nullptr),
+ parent(nullptr)
+ {}
+
SimpleLock(MDSCacheObject *o, const LockType *lt) :
type(lt),
parent(o)
// parent
MDSCacheObject *get_parent() { return parent; }
- int get_type() const { return type->type; }
- const sm_t* get_sm() const { return type->sm; }
+ int get_type() const { return (type != nullptr) ? type->type : 0; }
+ const sm_t* get_sm() const { return (type != nullptr) ? type->sm : nullptr; }
int get_cap_shift() const;
int get_cap_mask() const;
encode(empty_gather_set, bl);
ENCODE_FINISH(bl);
}
+
void decode(ceph::buffer::list::const_iterator& p) {
DECODE_START(2, p);
decode(state, p);
* to formatter, or nothing if is_sync_and_unlocked.
*/
void dump(ceph::Formatter *f) const;
+ static void generate_test_instances(std::list<SimpleLock*>& ls);
virtual void print(std::ostream& out) const {
out << "(";
}
}
+void ceph_lock_state_t::dump(ceph::Formatter *f) const {
+ f->dump_int("type", type);
+ f->dump_int("held_locks", held_locks.size());
+ for (auto &p : held_locks) {
+ f->open_object_section("lock");
+ f->dump_int("start", p.second.start);
+ f->dump_int("length", p.second.length);
+ f->dump_int("client", p.second.client);
+ f->dump_int("owner", p.second.owner);
+ f->dump_int("pid", p.second.pid);
+ f->dump_int("type", p.second.type);
+ f->close_section();
+ }
+ f->dump_int("waiting_locks", waiting_locks.size());
+ for (auto &p : waiting_locks) {
+ f->open_object_section("lock");
+ f->dump_int("start", p.second.start);
+ f->dump_int("length", p.second.length);
+ f->dump_int("client", p.second.client);
+ f->dump_int("owner", p.second.owner);
+ f->dump_int("pid", p.second.pid);
+ f->dump_int("type", p.second.type);
+ f->close_section();
+ }
+ f->dump_int("client_held_lock_counts", client_held_lock_counts.size());
+ for (auto &p : client_held_lock_counts) {
+ f->open_object_section("client");
+ f->dump_int("client_id", p.first.v);
+ f->dump_int("count", p.second);
+ f->close_section();
+ }
+ f->dump_int("client_waiting_lock_counts", client_waiting_lock_counts.size());
+}
+
+
+void ceph_lock_state_t::generate_test_instances(std::list<ceph_lock_state_t*>& ls) {
+ ls.push_back(new ceph_lock_state_t(NULL, 0));
+ ls.push_back(new ceph_lock_state_t(NULL, 1));
+ ls.back()->held_locks.insert(std::make_pair(1, ceph_filelock()));
+ ls.back()->waiting_locks.insert(std::make_pair(1, ceph_filelock()));
+ ls.back()->client_held_lock_counts.insert(std::make_pair(1, 1));
+ ls.back()->client_waiting_lock_counts.insert(std::make_pair(1, 1));
+}
+
bool ceph_lock_state_t::is_waiting(const ceph_filelock &fl) const
{
auto p = waiting_locks.find(fl.start);
class ceph_lock_state_t {
public:
explicit ceph_lock_state_t(CephContext *cct_, int type_) : cct(cct_), type(type_) {}
+ ceph_lock_state_t() : cct(NULL), type(0) {}
~ceph_lock_state_t();
/**
* Check if a lock is on the waiting_locks list.
decode(held_locks, bl);
decode(client_held_lock_counts, bl);
}
+ void dump(ceph::Formatter *f) const;
+ static void generate_test_instances(std::list<ceph_lock_state_t*>& ls);
bool empty() const {
return held_locks.empty() && waiting_locks.empty() &&
client_held_lock_counts.empty() &&
f->dump_string("feature_bits", css->strv());
}
+void feature_bitset_t::generate_test_instances(std::list<feature_bitset_t*>& ls)
+{
+ ls.push_back(new feature_bitset_t());
+ ls.push_back(new feature_bitset_t());
+ ls.back()->_vec.push_back(1);
+ ls.back()->_vec.push_back(2);
+ ls.back()->_vec.push_back(3);
+}
+
void feature_bitset_t::print(ostream& out) const
{
std::ios_base::fmtflags f(out.flags());
f->dump_object("metric_flags", metric_flags);
}
+void metric_spec_t::generate_test_instances(std::list<metric_spec_t*>& ls)
+{
+ ls.push_back(new metric_spec_t());
+ ls.push_back(new metric_spec_t());
+ ls.back()->metric_flags = 1;
+}
+
void metric_spec_t::print(ostream& out) const
{
out << "{metric_flags: '" << metric_flags << "'}";
f->dump_string(name.c_str(), val);
}
+void client_metadata_t::generate_test_instances(std::list<client_metadata_t*>& ls)
+{
+ ls.push_back(new client_metadata_t());
+ ls.push_back(new client_metadata_t());
+ ls.back()->kv_map["key1"] = "val1";
+ ls.back()->kv_map["key2"] = "val2";
+ ls.back()->features = 0x12345678;
+ ls.back()->metric_spec.metric_flags = 0x12345678;
+}
+
/*
* session_info_t
*/
void decode(ceph::buffer::list::const_iterator &p);
void dump(ceph::Formatter *f) const;
void print(std::ostream& out) const;
+ static void generate_test_instances(std::list<feature_bitset_t*>& ls);
private:
std::vector<block_type> _vec;
};
void encode(ceph::buffer::list& bl) const;
void decode(ceph::buffer::list::const_iterator& p);
void dump(ceph::Formatter *f) const;
+ static void generate_test_instances(std::list<metric_spec_t*>& ls);
void print(std::ostream& out) const;
// set of metrics that a client is capable of forwarding
void encode(ceph::buffer::list& bl) const;
void decode(ceph::buffer::list::const_iterator& p);
void dump(ceph::Formatter *f) const;
+ static void generate_test_instances(std::list<client_metadata_t*>& ls);
kv_map_t kv_map;
feature_bitset_t features;
void print(std::ostream& out) const {
out << name << ":" << tid;
}
-
+ static void generate_test_instances(std::list<metareqid_t*>& ls) {
+ ls.push_back(new metareqid_t);
+ ls.push_back(new metareqid_t(entity_name_t::CLIENT(123), 456));
+ }
entity_name_t name;
uint64_t tid = 0;
};
decode(ino, bl);
decode(frag, bl);
}
+ void dump(ceph::Formatter *f) const {
+ f->dump_unsigned("ino", ino);
+ f->dump_unsigned("frag", frag);
+ }
+ static void generate_test_instances(std::list<dirfrag_t*>& ls) {
+ ls.push_back(new dirfrag_t);
+ ls.push_back(new dirfrag_t(1, frag_t()));
+ ls.push_back(new dirfrag_t(2, frag_t(3)));
+ }
inodeno_t ino = 0;
frag_t frag;
DECODE_FINISH(bl);
}
+ void dump(ceph::Formatter *f) const {
+ f->dump_string("type", mds_metric_name(type));
+ f->dump_stream("sev") << sev;
+ f->dump_string("message", message);
+ f->open_object_section("metadata");
+ for (auto& i : metadata) {
+ f->dump_string(i.first.c_str(), i.second);
+ }
+ f->close_section();
+ }
+
+ static void generate_test_instances(std::list<MDSHealthMetric*>& ls) {
+ ls.push_back(new MDSHealthMetric());
+ ls.back()->type = MDS_HEALTH_CACHE_OVERSIZED;
+ ls.push_back(new MDSHealthMetric(MDS_HEALTH_TRIM, HEALTH_WARN, "MDS is behind on trimming"));
+ ls.back()->metadata["mds"] = "a";
+ ls.back()->metadata["num"] = "1";
+ }
+
bool operator==(MDSHealthMetric const &other) const
{
return (type == other.type && sev == other.sev && message == other.message);
DECODE_FINISH(bl);
}
+ void dump(ceph::Formatter *f) const {
+ f->open_array_section("metrics");
+ for (auto& i : metrics) {
+ f->open_object_section("metric");
+ i.dump(f);
+ f->close_section();
+ }
+ f->close_section();
+ }
+
+ static void generate_test_instances(std::list<MDSHealth*>& ls) {
+ ls.push_back(new MDSHealth);
+ ls.push_back(new MDSHealth);
+ ls.back()->metrics.push_back(MDSHealthMetric(MDS_HEALTH_TRIM, HEALTH_WARN,
+ "MDS is behind on trimming"));
+ }
+
bool operator==(MDSHealth const &other) const
{
return metrics == other.metrics;
#include <ostream>
#include "common/Formatter.h"
#include "include/denc.h"
+#include "common/Formatter.h"
enum class daemon_metric : uint8_t {
SLOW_OPS,
#include "include/denc.h"
#include "include/stringify.h"
+#include "common/Formatter.h"
#include "mds/mdstypes.h"
#include "mgr/Types.h"
MDSPerfMetricSubKeyDescriptor() {
}
MDSPerfMetricSubKeyDescriptor(MDSPerfMetricSubKeyType type, const std::string ®ex_str)
- : type(type), regex_str(regex_str) {
+ : type(type), regex_str(regex_str) {
}
bool operator<(const MDSPerfMetricSubKeyDescriptor &other) const {
denc(v.regex_str, p);
DENC_FINISH(p);
}
+ void dump(ceph::Formatter *f) const {
+ f->dump_unsigned("type", static_cast<uint8_t>(type));
+ f->dump_string("regex_str", regex_str);
+ }
};
WRITE_CLASS_DENC(MDSPerfMetricSubKeyDescriptor)
if (size) {
size_t per = 0;
denc(v.front(), per);
- p += per * size;
+ p += per * size;
}
}
static void encode(const MDSPerfMetricKeyDescriptor& v,
denc(v.type, p);
DENC_FINISH(p);
}
+ void dump(ceph::Formatter *f) const {
+ f->dump_unsigned("type", static_cast<uint8_t>(type));
+ }
void pack_counter(const PerformanceCounter &c, ceph::buffer::list *bl) const;
void unpack_counter(ceph::buffer::list::const_iterator& bl, PerformanceCounter *c) const;
if (size) {
size_t per = 0;
denc(v.front(), per);
- p += per * size;
+ p += per * size;
}
}
static void encode(const MDSPerformanceCounterDescriptors& v,
MDSPerfMetricLimit() {
}
MDSPerfMetricLimit(const MDSPerformanceCounterDescriptor &order_by, uint64_t max_count)
- : order_by(order_by), max_count(max_count) {
+ : order_by(order_by), max_count(max_count) {
}
bool operator<(const MDSPerfMetricLimit &other) const {
denc(v.max_count, p);
DENC_FINISH(p);
}
+ void dump(ceph::Formatter *f) const {
+ f->dump_object("order_by", order_by);
+ f->dump_unsigned("max_count", max_count);
+ }
};
WRITE_CLASS_DENC(MDSPerfMetricLimit)
}
MDSPerfMetricQuery(const MDSPerfMetricKeyDescriptor &key_descriptor,
const MDSPerformanceCounterDescriptors &performance_counter_descriptors)
- : key_descriptor(key_descriptor),
+ : key_descriptor(key_descriptor),
performance_counter_descriptors(performance_counter_descriptors)
{
}
DENC_FINISH(p);
}
+ void dump(ceph::Formatter *f) const {
+ f->dump_stream("key_descriptor") << key_descriptor;
+ f->dump_stream("performance_counter_descriptors") << performance_counter_descriptors;
+ }
+
void pack_counters(const PerformanceCounters &counters, ceph::buffer::list *bl) const;
};
WRITE_CLASS_DENC(MDSPerfMetricQuery)
utime_t last_updated_mono;
MDSPerfCollector(MetricQueryID query_id)
- : PerfCollector(query_id) {
+ : PerfCollector(query_id) {
}
};
denc(v.group_packed_performance_counters, p);
DENC_FINISH(p);
}
+ void dump(ceph::Formatter *f) const {
+ f->dump_stream("performance_counter_descriptors") << performance_counter_descriptors;
+ f->open_array_section("group_packed_performance_counters");
+ for (auto &i : group_packed_performance_counters) {
+ f->dump_stream("key") << i.first;
+ f->dump_stream("value") << i.second;
+ }
+ f->close_section();
+ }
};
struct MDSPerfMetricReport {
denc(v.rank_metrics_delayed, p);
DENC_FINISH(p);
}
+ void dump(ceph::Formatter *f) const {
+ f->open_array_section("reports");
+ for (auto &i : reports) {
+ f->open_object_section("query");
+ f->dump_object("query",i.first);
+ f->close_section();
+ f->open_object_section("metrics");
+ f->dump_object("metrics",i.second);
+ f->close_section();
+ }
+ f->close_section();
+ }
+ static void generate_test_instances(std::list<MDSPerfMetricReport *> &o) {
+ o.push_back(new MDSPerfMetricReport);
+ o.push_back(new MDSPerfMetricReport);
+ o.back()->reports.emplace(MDSPerfMetricQuery(), MDSPerfMetrics());
+ o.back()->rank_metrics_delayed.insert(1);
+ }
};
WRITE_CLASS_DENC(MDSPerfMetrics)
}
void dump(ceph::Formatter *f) const {
- encode_json("report", report, f);
+ f->open_array_section("report");
+ for (auto& i : report) {
+ f->open_object_section("query");
+ i.first.dump(f);
+ f->close_section();
+ f->open_object_section("report");
+ i.second.dump(f);
+ f->close_section();
+ }
+ f->close_section();
}
-
static void generate_test_instances(std::list<OSDMetricPayload*>& ls) {
- ls.push_back(new OSDMetricPayload);
+ ls.push_back(new OSDMetricPayload());
}
};
denc(v.metric_report, p);
DENC_FINISH(p);
}
+ void dump(ceph::Formatter *f) const {
+ metric_report.dump(f);
+ }
+ static void generate_test_instances(std::list<MDSMetricPayload*>& ls) {
+ ls.push_back(new MDSMetricPayload());
+ }
};
struct UnknownMetricPayload {
DENC(UnknownMetricPayload, v, p) {
ceph_abort();
}
+
+ void dump(ceph::Formatter *f) const {
+ ceph_abort();
+ }
};
WRITE_CLASS_DENC(OSDMetricPayload)
boost::apply_visitor(DecodeMetricPayloadVisitor(iter), payload);
}
+ void dump(ceph::Formatter *f) const {
+ f->open_object_section("payload");
+ if (const OSDMetricPayload* osdPayload = boost::get<OSDMetricPayload>(&payload)) {
+ osdPayload->dump(f);
+ } else if (const MDSMetricPayload* mdsPayload = boost::get<MDSMetricPayload>(&payload)) {
+ mdsPayload->dump(f);
+ } else if (const UnknownMetricPayload* unknownPayload = boost::get<UnknownMetricPayload>(&payload)) {
+ unknownPayload->dump(f);
+ } else {
+ ceph_abort();
+ }
+ f->close_section();
+ }
+ static void generate_test_instances(std::list<MetricReportMessage*>& ls) {
+ ls.push_back(new MetricReportMessage(OSDMetricPayload()));
+ ls.push_back(new MetricReportMessage(MDSMetricPayload()));
+ }
};
WRITE_CLASS_ENCODER(MetricReportMessage);
denc(v.config, p);
DENC_FINISH(p);
}
+
+ void dump(ceph::Formatter *f) const {
+ f->open_object_section("config");
+ for (auto& i : config) {
+ f->dump_object("query", i.first);
+ f->open_object_section("limits");
+ for (auto& j : i.second) {
+ f->dump_object("limit", j);
+ }
+ f->close_section();
+ }
+ f->close_section();
+ }
+ static void generate_test_instances(std::list<MDSConfigPayload*>& ls) {
+ ls.push_back(new MDSConfigPayload);
+ }
};
struct UnknownConfigPayload {
#include "common/ceph_json.h"
#include "include/denc.h"
#include "include/stringify.h"
+#include "common/Formatter.h"
+
#include "mgr/Types.h"
#include <regex>
denc(v.regex_str, p);
DENC_FINISH(p);
}
-
void dump(ceph::Formatter *f) const {
f->dump_unsigned("type", static_cast<uint8_t>(type));
f->dump_string("regex", regex_str);
TYPE(snaplink_t)
TYPE(sr_t)
-#include "mds/mdstypes.h"
+#include "mds/SimpleLock.h"
+TYPE_NOCOPY(SimpleLock)
+
+#include "mds/PurgeQueue.h"
+TYPE(PurgeItem)
+
+#include "mds/Anchor.h"
+TYPE(Anchor)
+
#include "include/cephfs/types.h"
TYPE(frag_info_t)
TYPE(nest_info_t)
TYPE(quota_info_t)
TYPE(client_writeable_range_t)
TYPE_FEATUREFUL(inode_t<std::allocator>)
+//TYPE(inode_t<std::allocator>)
TYPE_FEATUREFUL(old_inode_t<std::allocator>)
TYPE(fnode_t)
TYPE(old_rstat_t)
TYPE(MDSCacheObjectInfo)
TYPE(inode_backtrace_t)
TYPE(inode_backpointer_t)
+TYPE(vinodeno_t)
+
+#include "include/cephfs/metrics/Types.h"
+TYPE(ClientMetricMessage)
#include "mds/CInode.h"
TYPE_FEATUREFUL(InodeStore)
TYPE_FEATUREFUL(MDSMap)
TYPE_FEATUREFUL(MDSMap::mds_info_t)
+#include "mds/flock.h"
+TYPE(ceph_lock_state_t)
+
#include "mds/FSMap.h"
//TYPE_FEATUREFUL(Filesystem)
TYPE_FEATUREFUL(FSMap)
+TYPE(MirrorInfo)
#include "mds/Capability.h"
TYPE_NOCOPY(Capability)
+TYPE(Capability::Export)
+TYPE(Capability::Import)
#include "mds/inode_backtrace.h"
TYPE(inode_backpointer_t)
#include "mds/InoTable.h"
TYPE(InoTable)
+#include "mds/SessionMap.h"
+//TYPE_FEATUREFUL(SessionMapStore)
+
#include "mds/SnapServer.h"
-TYPE_STRAYDATA(SnapServer)
+TYPE_FEATUREFUL(SnapServer)
#include "mds/events/ECommitted.h"
TYPE_FEATUREFUL_NOCOPY(ECommitted)
#include "mds/events/EUpdate.h"
TYPE_FEATUREFUL_NOCOPY(EUpdate)
+
+#include "mgr/MetricTypes.h"
+TYPE(MDSMetricPayload)
+TYPE(MetricReportMessage)
+TYPE(MDSConfigPayload)
+
+#include "mds/mdstypes.h"
+TYPE(metareqid_t)
+TYPE(feature_bitset_t)
+TYPE(dirfrag_t)
+TYPE(client_metadata_t)
+TYPE(MDSPerfMetricReport)
+TYPE(metric_spec_t)
+
+#include "messages/MMDSBeacon.h"
+TYPE(MDSHealthMetric)
+TYPE(MDSHealth)
+
#endif // WITH_CEPHFS