1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
5 #include "include/cephfs/types.h"
6 #include "MDSContext.h"
7 #include "common/Formatter.h"
8 #include "common/StackStringStream.h"
10 const mds_gid_t MDS_GID_NONE
= mds_gid_t(0);
18 using ceph::bufferlist
;
19 using ceph::Formatter
;
25 void frag_info_t::encode(bufferlist
&bl
) const
27 ENCODE_START(3, 2, bl
);
32 encode(change_attr
, bl
);
36 void frag_info_t::decode(bufferlist::const_iterator
&bl
)
38 DECODE_START_LEGACY_COMPAT_LEN(3, 2, 2, bl
);
44 decode(change_attr
, bl
);
50 void frag_info_t::dump(Formatter
*f
) const
52 f
->dump_unsigned("version", version
);
53 f
->dump_stream("mtime") << mtime
;
54 f
->dump_unsigned("num_files", nfiles
);
55 f
->dump_unsigned("num_subdirs", nsubdirs
);
56 f
->dump_unsigned("change_attr", change_attr
);
59 void frag_info_t::decode_json(JSONObj
*obj
){
61 JSONDecoder::decode_json("version", version
, obj
, true);
62 JSONDecoder::decode_json("mtime", mtime
, obj
, true);
63 JSONDecoder::decode_json("num_files", nfiles
, obj
, true);
64 JSONDecoder::decode_json("num_subdirs", nsubdirs
, obj
, true);
65 JSONDecoder::decode_json("change_attr", change_attr
, obj
, true);
68 void frag_info_t::generate_test_instances(std::list
<frag_info_t
*>& ls
)
70 ls
.push_back(new frag_info_t
);
71 ls
.push_back(new frag_info_t
);
72 ls
.back()->version
= 1;
73 ls
.back()->mtime
= utime_t(2, 3);
74 ls
.back()->nfiles
= 4;
75 ls
.back()->nsubdirs
= 5;
78 ostream
& operator<<(ostream
&out
, const frag_info_t
&f
)
80 if (f
== frag_info_t())
82 out
<< "f(v" << f
.version
;
83 if (f
.mtime
!= utime_t())
84 out
<< " m" << f
.mtime
;
85 if (f
.nfiles
|| f
.nsubdirs
)
86 out
<< " " << f
.size() << "=" << f
.nfiles
<< "+" << f
.nsubdirs
;
96 void nest_info_t::encode(bufferlist
&bl
) const
98 ENCODE_START(3, 2, bl
);
102 encode(rsubdirs
, bl
);
105 int64_t ranchors
= 0;
106 encode(ranchors
, bl
);
113 void nest_info_t::decode(bufferlist::const_iterator
&bl
)
115 DECODE_START_LEGACY_COMPAT_LEN(3, 2, 2, bl
);
119 decode(rsubdirs
, bl
);
122 decode(ranchors
, bl
);
129 void nest_info_t::dump(Formatter
*f
) const
131 f
->dump_unsigned("version", version
);
132 f
->dump_unsigned("rbytes", rbytes
);
133 f
->dump_unsigned("rfiles", rfiles
);
134 f
->dump_unsigned("rsubdirs", rsubdirs
);
135 f
->dump_unsigned("rsnaps", rsnaps
);
136 f
->dump_stream("rctime") << rctime
;
139 void nest_info_t::decode_json(JSONObj
*obj
){
141 JSONDecoder::decode_json("version", version
, obj
, true);
142 JSONDecoder::decode_json("rbytes", rbytes
, obj
, true);
143 JSONDecoder::decode_json("rfiles", rfiles
, obj
, true);
144 JSONDecoder::decode_json("rsubdirs", rsubdirs
, obj
, true);
145 JSONDecoder::decode_json("rsnaps", rsnaps
, obj
, true);
146 JSONDecoder::decode_json("rctime", rctime
, obj
, true);
149 void nest_info_t::generate_test_instances(std::list
<nest_info_t
*>& ls
)
151 ls
.push_back(new nest_info_t
);
152 ls
.push_back(new nest_info_t
);
153 ls
.back()->version
= 1;
154 ls
.back()->rbytes
= 2;
155 ls
.back()->rfiles
= 3;
156 ls
.back()->rsubdirs
= 4;
157 ls
.back()->rsnaps
= 6;
158 ls
.back()->rctime
= utime_t(7, 8);
161 ostream
& operator<<(ostream
&out
, const nest_info_t
&n
)
163 if (n
== nest_info_t())
165 out
<< "n(v" << n
.version
;
166 if (n
.rctime
!= utime_t())
167 out
<< " rc" << n
.rctime
;
169 out
<< " b" << n
.rbytes
;
171 out
<< " rs" << n
.rsnaps
;
172 if (n
.rfiles
|| n
.rsubdirs
)
173 out
<< " " << n
.rsize() << "=" << n
.rfiles
<< "+" << n
.rsubdirs
;
181 void quota_info_t::dump(Formatter
*f
) const
183 f
->dump_int("max_bytes", max_bytes
);
184 f
->dump_int("max_files", max_files
);
187 void quota_info_t::decode_json(JSONObj
*obj
){
189 JSONDecoder::decode_json("max_bytes", max_bytes
, obj
, true);
190 JSONDecoder::decode_json("max_files", max_files
, obj
, true);
193 void quota_info_t::generate_test_instances(std::list
<quota_info_t
*>& ls
)
195 ls
.push_back(new quota_info_t
);
196 ls
.push_back(new quota_info_t
);
197 ls
.back()->max_bytes
= 16;
198 ls
.back()->max_files
= 16;
201 ostream
& operator<<(ostream
&out
, const quota_info_t
&n
)
204 << "max_bytes = " << n
.max_bytes
205 << " max_files = " << n
.max_files
211 * client_writeable_range_t
214 void client_writeable_range_t::encode(bufferlist
&bl
) const
216 ENCODE_START(2, 2, bl
);
217 encode(range
.first
, bl
);
218 encode(range
.last
, bl
);
223 void client_writeable_range_t::decode(bufferlist::const_iterator
& bl
)
225 DECODE_START_LEGACY_COMPAT_LEN(2, 2, 2, bl
);
226 decode(range
.first
, bl
);
227 decode(range
.last
, bl
);
232 void client_writeable_range_t::dump(Formatter
*f
) const
234 f
->open_object_section("byte range");
235 f
->dump_unsigned("first", range
.first
);
236 f
->dump_unsigned("last", range
.last
);
238 f
->dump_unsigned("follows", follows
);
241 void client_writeable_range_t::byte_range_t::decode_json(JSONObj
*obj
){
243 JSONDecoder::decode_json("first", first
, obj
, true);
244 JSONDecoder::decode_json("last", last
, obj
, true);
247 void client_writeable_range_t::generate_test_instances(std::list
<client_writeable_range_t
*>& ls
)
249 ls
.push_back(new client_writeable_range_t
);
250 ls
.push_back(new client_writeable_range_t
);
251 ls
.back()->range
.first
= 123;
252 ls
.back()->range
.last
= 456;
253 ls
.back()->follows
= 12;
256 ostream
& operator<<(ostream
& out
, const client_writeable_range_t
& r
)
258 return out
<< r
.range
.first
<< '-' << r
.range
.last
<< "@" << r
.follows
;
264 void inline_data_t::encode(bufferlist
&bl
) const
271 encode(bufferlist(), bl
);
273 void inline_data_t::decode(bufferlist::const_iterator
&p
)
278 decode(inline_len
, p
);
279 if (inline_len
> 0) {
280 ceph::buffer::list bl
;
281 decode_nohead(inline_len
, bl
, p
);
291 void fnode_t::encode(bufferlist
&bl
) const
293 ENCODE_START(4, 3, bl
);
295 encode(snap_purged_thru
, bl
);
296 encode(fragstat
, bl
);
297 encode(accounted_fragstat
, bl
);
299 encode(accounted_rstat
, bl
);
300 encode(damage_flags
, bl
);
301 encode(recursive_scrub_version
, bl
);
302 encode(recursive_scrub_stamp
, bl
);
303 encode(localized_scrub_version
, bl
);
304 encode(localized_scrub_stamp
, bl
);
308 void fnode_t::decode(bufferlist::const_iterator
&bl
)
310 DECODE_START_LEGACY_COMPAT_LEN(3, 2, 2, bl
);
312 decode(snap_purged_thru
, bl
);
313 decode(fragstat
, bl
);
314 decode(accounted_fragstat
, bl
);
316 decode(accounted_rstat
, bl
);
318 decode(damage_flags
, bl
);
321 decode(recursive_scrub_version
, bl
);
322 decode(recursive_scrub_stamp
, bl
);
323 decode(localized_scrub_version
, bl
);
324 decode(localized_scrub_stamp
, bl
);
329 void fnode_t::dump(Formatter
*f
) const
331 f
->dump_unsigned("version", version
);
332 f
->dump_unsigned("snap_purged_thru", snap_purged_thru
);
334 f
->open_object_section("fragstat");
338 f
->open_object_section("accounted_fragstat");
339 accounted_fragstat
.dump(f
);
342 f
->open_object_section("rstat");
346 f
->open_object_section("accounted_rstat");
347 accounted_rstat
.dump(f
);
350 void fnode_t::decode_json(JSONObj
*obj
){
351 JSONDecoder::decode_json("version", version
, obj
, true);
353 JSONDecoder::decode_json("snap_purged_thru", tmp
, obj
, true);
354 snap_purged_thru
.val
= tmp
;
355 JSONDecoder::decode_json("fragstat", fragstat
, obj
, true);
356 JSONDecoder::decode_json("accounted_fragstat", accounted_fragstat
, obj
, true);
357 JSONDecoder::decode_json("rstat", rstat
, obj
, true);
358 JSONDecoder::decode_json("accounted_rstat", accounted_rstat
, obj
, true);
360 void fnode_t::generate_test_instances(std::list
<fnode_t
*>& ls
)
362 ls
.push_back(new fnode_t
);
363 ls
.push_back(new fnode_t
);
364 ls
.back()->version
= 1;
365 ls
.back()->snap_purged_thru
= 2;
366 list
<frag_info_t
*> fls
;
367 frag_info_t::generate_test_instances(fls
);
368 ls
.back()->fragstat
= *fls
.back();
369 ls
.back()->accounted_fragstat
= *fls
.front();
370 list
<nest_info_t
*> nls
;
371 nest_info_t::generate_test_instances(nls
);
372 ls
.back()->rstat
= *nls
.front();
373 ls
.back()->accounted_rstat
= *nls
.back();
380 void old_rstat_t::encode(bufferlist
& bl
) const
382 ENCODE_START(2, 2, bl
);
385 encode(accounted_rstat
, bl
);
389 void old_rstat_t::decode(bufferlist::const_iterator
& bl
)
391 DECODE_START_LEGACY_COMPAT_LEN(2, 2, 2, bl
);
394 decode(accounted_rstat
, bl
);
398 void old_rstat_t::dump(Formatter
*f
) const
400 f
->dump_unsigned("snapid", first
);
401 f
->open_object_section("rstat");
404 f
->open_object_section("accounted_rstat");
405 accounted_rstat
.dump(f
);
409 void old_rstat_t::generate_test_instances(std::list
<old_rstat_t
*>& ls
)
411 ls
.push_back(new old_rstat_t());
412 ls
.push_back(new old_rstat_t());
413 ls
.back()->first
= 12;
414 list
<nest_info_t
*> nls
;
415 nest_info_t::generate_test_instances(nls
);
416 ls
.back()->rstat
= *nls
.back();
417 ls
.back()->accounted_rstat
= *nls
.front();
423 feature_bitset_t::feature_bitset_t(unsigned long value
)
426 for (size_t i
= 0; i
< sizeof(value
) * 8; i
+= bits_per_block
) {
427 _vec
.push_back((block_type
)(value
>> i
));
432 feature_bitset_t::feature_bitset_t(const vector
<size_t>& array
)
434 if (!array
.empty()) {
435 size_t n
= array
.back();
441 for (auto& bit
: array
) {
445 ceph_assert(bit
== last
);
446 _vec
[bit
/ bits_per_block
] |= (block_type
)1 << (bit
% bits_per_block
);
451 feature_bitset_t
& feature_bitset_t::operator-=(const feature_bitset_t
& other
)
453 for (size_t i
= 0; i
< _vec
.size(); ++i
) {
454 if (i
>= other
._vec
.size())
456 _vec
[i
] &= ~other
._vec
[i
];
461 void feature_bitset_t::encode(bufferlist
& bl
) const {
463 using ceph::encode_nohead
;
464 uint32_t len
= _vec
.size() * sizeof(block_type
);
466 encode_nohead(_vec
, bl
);
469 void feature_bitset_t::decode(bufferlist::const_iterator
&p
) {
471 using ceph::decode_nohead
;
476 if (len
>= sizeof(block_type
))
477 decode_nohead(len
/ sizeof(block_type
), _vec
, p
);
479 if (len
% sizeof(block_type
)) {
481 p
.copy(len
% sizeof(block_type
), (char*)&buf
);
482 _vec
.push_back((block_type
)buf
);
486 void feature_bitset_t::dump(Formatter
*f
) const {
487 CachedStackStringStream css
;
489 f
->dump_string("feature_bits", css
->strv());
492 void feature_bitset_t::print(ostream
& out
) const
494 std::ios_base::fmtflags
f(out
.flags());
495 int size
= _vec
.size();
500 for (int i
= size
- 1; i
>= 0; --i
)
501 out
<< std::setfill('0') << std::setw(sizeof(block_type
) * 2)
502 << std::hex
<< _vec
[i
];
510 void metric_spec_t::encode(bufferlist
& bl
) const {
512 ENCODE_START(1, 1, bl
);
513 encode(metric_flags
, bl
);
517 void metric_spec_t::decode(bufferlist::const_iterator
&p
) {
520 decode(metric_flags
, p
);
524 void metric_spec_t::dump(Formatter
*f
) const {
525 f
->dump_object("metric_flags", metric_flags
);
528 void metric_spec_t::print(ostream
& out
) const
530 out
<< "{metric_flags: '" << metric_flags
<< "'}";
536 void client_metadata_t::encode(bufferlist
& bl
) const
538 ENCODE_START(3, 1, bl
);
540 encode(features
, bl
);
541 encode(metric_spec
, bl
);
545 void client_metadata_t::decode(bufferlist::const_iterator
& p
)
552 decode(metric_spec
, p
);
557 void client_metadata_t::dump(Formatter
*f
) const
559 f
->dump_object("client_features", features
);
560 f
->dump_object("metric_spec", metric_spec
);
561 for (const auto& [name
, val
] : kv_map
)
562 f
->dump_string(name
.c_str(), val
);
568 void session_info_t::encode(bufferlist
& bl
, uint64_t features
) const
570 ENCODE_START(7, 7, bl
);
571 encode(inst
, bl
, features
);
572 encode(completed_requests
, bl
);
573 encode(prealloc_inos
, bl
); // hacky, see below.
574 encode((__u32
)0, bl
); // used_inos
575 encode(completed_flushes
, bl
);
576 encode(auth_name
, bl
);
577 encode(client_metadata
, bl
);
581 void session_info_t::decode(bufferlist::const_iterator
& p
)
583 DECODE_START_LEGACY_COMPAT_LEN(7, 2, 2, p
);
589 completed_requests
[*s
.begin()] = inodeno_t();
593 decode(completed_requests
, p
);
595 decode(prealloc_inos
, p
);
597 interval_set
<inodeno_t
> used_inos
;
598 decode(used_inos
, p
);
599 prealloc_inos
.insert(used_inos
);
601 if (struct_v
>= 4 && struct_v
< 7) {
602 decode(client_metadata
.kv_map
, p
);
605 decode(completed_flushes
, p
);
608 decode(auth_name
, p
);
611 decode(client_metadata
, p
);
616 void session_info_t::dump(Formatter
*f
) const
618 f
->dump_stream("inst") << inst
;
620 f
->open_array_section("completed_requests");
621 for (const auto& [tid
, ino
] : completed_requests
) {
622 f
->open_object_section("request");
623 f
->dump_unsigned("tid", tid
);
624 f
->dump_stream("created_ino") << ino
;
629 f
->open_array_section("prealloc_inos");
630 for (const auto& [start
, len
] : prealloc_inos
) {
631 f
->open_object_section("ino_range");
632 f
->dump_stream("start") << start
;
633 f
->dump_unsigned("length", len
);
638 f
->dump_object("client_metadata", client_metadata
);
641 void session_info_t::generate_test_instances(std::list
<session_info_t
*>& ls
)
643 ls
.push_back(new session_info_t
);
644 ls
.push_back(new session_info_t
);
645 ls
.back()->inst
= entity_inst_t(entity_name_t::MDS(12), entity_addr_t());
646 ls
.back()->completed_requests
.insert(make_pair(234, inodeno_t(111222)));
647 ls
.back()->completed_requests
.insert(make_pair(237, inodeno_t(222333)));
648 ls
.back()->prealloc_inos
.insert(333, 12);
649 ls
.back()->prealloc_inos
.insert(377, 112);
650 // we can't add used inos; they're cleared on decode
657 void string_snap_t::encode(bufferlist
& bl
) const
659 ENCODE_START(2, 2, bl
);
665 void string_snap_t::decode(bufferlist::const_iterator
& bl
)
667 DECODE_START_LEGACY_COMPAT_LEN(2, 2, 2, bl
);
673 void string_snap_t::dump(Formatter
*f
) const
675 f
->dump_string("name", name
);
676 f
->dump_unsigned("snapid", snapid
);
679 void string_snap_t::generate_test_instances(std::list
<string_snap_t
*>& ls
)
681 ls
.push_back(new string_snap_t
);
682 ls
.push_back(new string_snap_t
);
683 ls
.back()->name
= "foo";
684 ls
.back()->snapid
= 123;
685 ls
.push_back(new string_snap_t
);
686 ls
.back()->name
= "bar";
687 ls
.back()->snapid
= 456;
694 void MDSCacheObjectInfo::encode(bufferlist
& bl
) const
696 ENCODE_START(2, 2, bl
);
704 void MDSCacheObjectInfo::decode(bufferlist::const_iterator
& p
)
706 DECODE_START_LEGACY_COMPAT_LEN(2, 2, 2, p
);
714 void MDSCacheObjectInfo::dump(Formatter
*f
) const
716 f
->dump_unsigned("ino", ino
);
717 f
->dump_stream("dirfrag") << dirfrag
;
718 f
->dump_string("name", dname
);
719 f
->dump_unsigned("snapid", snapid
);
722 void MDSCacheObjectInfo::generate_test_instances(std::list
<MDSCacheObjectInfo
*>& ls
)
724 ls
.push_back(new MDSCacheObjectInfo
);
725 ls
.push_back(new MDSCacheObjectInfo
);
727 ls
.back()->dirfrag
= dirfrag_t(2, 3);
728 ls
.back()->dname
= "fooname";
729 ls
.back()->snapid
= CEPH_NOSNAP
;
730 ls
.push_back(new MDSCacheObjectInfo
);
731 ls
.back()->ino
= 121;
732 ls
.back()->dirfrag
= dirfrag_t(222, 0);
733 ls
.back()->dname
= "bar foo";
734 ls
.back()->snapid
= 21322;
738 * mds_table_pending_t
740 void mds_table_pending_t::encode(bufferlist
& bl
) const
742 ENCODE_START(2, 2, bl
);
749 void mds_table_pending_t::decode(bufferlist::const_iterator
& bl
)
751 DECODE_START_LEGACY_COMPAT_LEN(2, 2, 2, bl
);
758 void mds_table_pending_t::dump(Formatter
*f
) const
760 f
->dump_unsigned("reqid", reqid
);
761 f
->dump_unsigned("mds", mds
);
762 f
->dump_unsigned("tid", tid
);
765 void mds_table_pending_t::generate_test_instances(std::list
<mds_table_pending_t
*>& ls
)
767 ls
.push_back(new mds_table_pending_t
);
768 ls
.push_back(new mds_table_pending_t
);
769 ls
.back()->reqid
= 234;
771 ls
.back()->tid
= 35434;
774 void metareqid_t::dump(ceph::Formatter
* f
) const {
775 f
->dump_object("entity", name
);
776 f
->dump_unsigned("tid", tid
);
782 void inode_load_vec_t::encode(bufferlist
&bl
) const
784 ENCODE_START(2, 2, bl
);
785 for (const auto &i
: vec
) {
791 void inode_load_vec_t::decode(bufferlist::const_iterator
&p
)
793 DECODE_START_LEGACY_COMPAT_LEN(2, 2, 2, p
);
794 for (auto &i
: vec
) {
800 void inode_load_vec_t::dump(Formatter
*f
) const
802 f
->open_array_section("Decay Counters");
803 for (const auto &i
: vec
) {
804 f
->open_object_section("Decay Counter");
811 void inode_load_vec_t::generate_test_instances(std::list
<inode_load_vec_t
*>& ls
)
813 ls
.push_back(new inode_load_vec_t(DecayRate()));
820 void dirfrag_load_vec_t::dump(Formatter
*f
) const
822 f
->open_array_section("Decay Counters");
823 for (const auto &i
: vec
) {
824 f
->open_object_section("Decay Counter");
831 void dirfrag_load_vec_t::dump(Formatter
*f
, const DecayRate
& rate
) const
833 f
->dump_float("meta_load", meta_load());
834 f
->dump_float("IRD", get(META_POP_IRD
).get());
835 f
->dump_float("IWR", get(META_POP_IWR
).get());
836 f
->dump_float("READDIR", get(META_POP_READDIR
).get());
837 f
->dump_float("FETCH", get(META_POP_FETCH
).get());
838 f
->dump_float("STORE", get(META_POP_STORE
).get());
841 void dirfrag_load_vec_t::generate_test_instances(std::list
<dirfrag_load_vec_t
*>& ls
)
843 ls
.push_back(new dirfrag_load_vec_t(DecayRate()));
849 void mds_load_t::encode(bufferlist
&bl
) const {
850 ENCODE_START(2, 2, bl
);
853 encode(req_rate
, bl
);
854 encode(cache_hit_rate
, bl
);
855 encode(queue_len
, bl
);
856 encode(cpu_load_avg
, bl
);
860 void mds_load_t::decode(bufferlist::const_iterator
&bl
) {
861 DECODE_START_LEGACY_COMPAT_LEN(2, 2, 2, bl
);
864 decode(req_rate
, bl
);
865 decode(cache_hit_rate
, bl
);
866 decode(queue_len
, bl
);
867 decode(cpu_load_avg
, bl
);
871 void mds_load_t::dump(Formatter
*f
) const
873 f
->dump_float("request rate", req_rate
);
874 f
->dump_float("cache hit rate", cache_hit_rate
);
875 f
->dump_float("queue length", queue_len
);
876 f
->dump_float("cpu load", cpu_load_avg
);
877 f
->open_object_section("auth dirfrag");
880 f
->open_object_section("all dirfrags");
885 void mds_load_t::generate_test_instances(std::list
<mds_load_t
*>& ls
)
887 ls
.push_back(new mds_load_t(DecayRate()));
893 void cap_reconnect_t::encode(bufferlist
& bl
) const {
894 ENCODE_START(2, 1, bl
);
895 encode_old(bl
); // extract out when something changes
896 encode(snap_follows
, bl
);
900 void cap_reconnect_t::encode_old(bufferlist
& bl
) const {
903 capinfo
.flock_len
= flockbl
.length();
905 ceph::encode_nohead(flockbl
, bl
);
908 void cap_reconnect_t::decode(bufferlist::const_iterator
& bl
) {
910 decode_old(bl
); // extract out when something changes
912 decode(snap_follows
, bl
);
916 void cap_reconnect_t::decode_old(bufferlist::const_iterator
& bl
) {
920 ceph::decode_nohead(capinfo
.flock_len
, flockbl
, bl
);
923 void cap_reconnect_t::dump(Formatter
*f
) const
925 f
->dump_string("path", path
);
926 f
->dump_int("cap_id", capinfo
.cap_id
);
927 f
->dump_string("cap wanted", ccap_string(capinfo
.wanted
));
928 f
->dump_string("cap issued", ccap_string(capinfo
.issued
));
929 f
->dump_int("snaprealm", capinfo
.snaprealm
);
930 f
->dump_int("path base ino", capinfo
.pathbase
);
931 f
->dump_string("has file locks", capinfo
.flock_len
? "true" : "false");
934 void cap_reconnect_t::generate_test_instances(std::list
<cap_reconnect_t
*>& ls
)
936 ls
.push_back(new cap_reconnect_t
);
937 ls
.back()->path
= "/test/path";
938 ls
.back()->capinfo
.cap_id
= 1;
942 * snaprealm_reconnect_t
944 void snaprealm_reconnect_t::encode(bufferlist
& bl
) const {
945 ENCODE_START(1, 1, bl
);
946 encode_old(bl
); // extract out when something changes
950 void snaprealm_reconnect_t::encode_old(bufferlist
& bl
) const {
955 void snaprealm_reconnect_t::decode(bufferlist::const_iterator
& bl
) {
957 decode_old(bl
); // extract out when something changes
961 void snaprealm_reconnect_t::decode_old(bufferlist::const_iterator
& bl
) {
966 void snaprealm_reconnect_t::dump(Formatter
*f
) const
968 f
->dump_int("ino", realm
.ino
);
969 f
->dump_int("seq", realm
.seq
);
970 f
->dump_int("parent", realm
.parent
);
973 void snaprealm_reconnect_t::generate_test_instances(std::list
<snaprealm_reconnect_t
*>& ls
)
975 ls
.push_back(new snaprealm_reconnect_t
);
976 ls
.back()->realm
.ino
= 0x10000000001ULL
;
977 ls
.back()->realm
.seq
= 2;
978 ls
.back()->realm
.parent
= 1;