1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
8 #include "include/types.h"
9 #include "common/Formatter.h"
10 #include "common/ceph_argparse.h"
11 #include "common/errno.h"
12 #include "osdc/Journaler.h"
13 #include "mds/mdstypes.h"
14 #include "mds/LogEvent.h"
15 #include "mds/InoTable.h"
16 #include "mds/CDentry.h"
18 #include "mds/events/ENoOp.h"
19 #include "mds/events/EUpdate.h"
21 #include "mds/JournalPointer.h"
22 // #include "JournalScanner.h"
23 // #include "EventOutput.h"
24 // #include "Dumper.h"
25 // #include "Resetter.h"
27 // #include "JournalTool.h"
29 #include "type_helper.hpp"
30 #include "include/object.h"
32 WRITE_RAW_ENCODER(char)
33 WRITE_RAW_ENCODER(unsigned char)
35 #define dout_context g_ceph_context
36 #define dout_subsys ceph_subsys_mds
38 #define dout_prefix *_dout << __func__ << ": "
42 void MetaTool::meta_op::release()
44 for (const auto& i
: inodes
) {
48 while (!sub_ops
.empty()) {
54 void MetaTool::inode_meta_t::decode_json(JSONObj
*obj
)
56 unsigned long long tmp
;
57 JSONDecoder::decode_json("snapid_t", tmp
, obj
, true);
59 JSONDecoder::decode_json("itype", tmp
, obj
, true);
63 JSONDecoder::decode_json("store", *_i
, obj
, true);
66 void MetaTool::usage()
68 generic_client_usage();
71 int MetaTool::main(string
& mode
,
82 std::string manual_meta_pool
;
83 std::string manual_data_pool
;
84 std::string manual_rank_num
;
85 bool manual_mode
= false;
88 string_split(minfo
, v
);
89 manual_meta_pool
= v
.size() >= 1 ? v
[0] : "";
90 manual_data_pool
= v
.size() >= 2 ? v
[1] : "";
91 manual_rank_num
= v
.size() >= 3 ? v
[2] : "";
92 std::cout
<< "("<< minfo
<< ")=>"
93 << " mpool: " << manual_meta_pool
94 << " dpool: " << manual_data_pool
95 << " rank: " << manual_rank_num
97 if (!manual_meta_pool
.empty() && !manual_data_pool
.empty() && !manual_rank_num
.empty()) {
98 std::cout
<< "you specify rank: " << manual_rank_num
99 << " mpool: " << manual_meta_pool
100 << " dpool: " << manual_data_pool
101 << "\nstart manual mode!!"<< std::endl
;
107 r
= rados
.init_with_context(g_ceph_context
);
109 cerr
<< "RADOS unavailable" << std::endl
;
114 cout
<< "MetaTool: connecting to RADOS..." << std::endl
;
117 cerr
<< "couldn't connect to cluster: " << cpp_strerror(r
) << std::endl
;
122 r
= role_selector
.parse(*fsmap
, rank_str
);
124 cerr
<< "Couldn't determine MDS rank." << std::endl
;
128 auto fs
= fsmap
->get_filesystem(role_selector
.get_ns());
129 assert(fs
!= nullptr);
131 // prepare io for meta pool
132 int64_t const pool_id
= fs
->mds_map
.get_metadata_pool();
133 features
= fs
->mds_map
.get_up_features();
135 features
= CEPH_FEATURES_SUPPORTED_DEFAULT
;
136 else if (features
!= CEPH_FEATURES_SUPPORTED_DEFAULT
) {
137 cout
<< "I think we need to check the feature! : " << features
<< std::endl
;
141 std::string pool_name
;
142 r
= rados
.pool_reverse_lookup(pool_id
, &pool_name
);
144 cerr
<< "Pool " << pool_id
<< " named in MDS map not found in RADOS!" << std::endl
;
149 cout
<< "MetaTool: creating IoCtx.." << std::endl
;
150 r
= rados
.ioctx_create(pool_name
.c_str(), io_meta
);
154 // prepare io for data pool
155 for (const auto p
: fs
->mds_map
.get_data_pools()) {
156 r
= rados
.pool_reverse_lookup(p
, &pool_name
);
158 cerr
<< "Pool " << pool_id
<< " named in MDS map not found in RADOS!" << std::endl
;
161 librados::IoCtx
* io_data
= new librados::IoCtx
;
162 r
= rados
.ioctx_create(pool_name
.c_str(), *io_data
);
164 io_data_v
.push_back(io_data
);
167 for (auto role
: role_selector
.get_roles()) {
170 r
= process(mode
, ino
, out
, in
, confirm
);
171 cout
<< "executing for rank " << rank
<< " op[" <<mode
<< "] ret : " << r
<< std::endl
;
175 features
= CEPH_FEATURES_SUPPORTED_DEFAULT
;
176 r
= rados
.ioctx_create(manual_meta_pool
.c_str(), io_meta
);
179 librados::IoCtx
* io_data
= new librados::IoCtx
;
180 r
= rados
.ioctx_create(manual_data_pool
.c_str(), *io_data
);
182 io_data_v
.push_back(io_data
);
185 rank
= conv_t
<int>(manual_rank_num
);
186 r
= process(mode
, ino
, out
, in
, confirm
);
187 cout
<< "op[" << mode
<< "] ret : " << r
<< std::endl
;
192 int MetaTool::process(string
& mode
, string
& ino
, string out
, string in
, bool confirm
)
194 if (mode
== "showm") {
195 return show_meta_info(ino
, out
);
196 } else if (mode
== "showfn") {
197 return show_fnode(ino
, out
);
198 } else if (mode
== "listc") {
199 return list_meta_info(ino
, out
);
200 } else if (mode
== "amend") {
201 return amend_meta_info(ino
, in
, confirm
);
202 } else if (mode
== "amendfn") {
203 return amend_fnode(in
, confirm
);
205 cerr
<< "bad command '" << mode
<< "'" << std::endl
;
209 int MetaTool::show_fnode(string
& ino
, string
& out
)
212 inodeno_t i_ino
= std::stoull(ino
.c_str(), nullptr, 0);
213 meta_op
op(_debug
, out
);
214 meta_op::sub_op
* nsop
= new meta_op::sub_op(&op
);
215 nsop
->sub_op_t
= meta_op::OP_SHOW_FN
;
216 nsop
->sub_ino_t
= meta_op::INO_DIR
;
219 return op_process(op
);
221 cerr
<< "parameter error? : ino = " << ino
<< std::endl
;
225 int MetaTool::amend_fnode(string
& in
, bool confirm
)
227 meta_op
op(_debug
, "", in
, confirm
);
228 meta_op::sub_op
* nsop
= new meta_op::sub_op(&op
);
229 nsop
->sub_op_t
= meta_op::OP_AMEND_FN
;
230 nsop
->sub_ino_t
= meta_op::INO_DIR
;
233 return op_process(op
);
235 int MetaTool::amend_meta_info(string
& ino
, string
& in
, bool confirm
)
237 if (ino
!= "0" && in
!= "") {
238 inodeno_t i_ino
= std::stoull(ino
.c_str(), nullptr, 0);
239 meta_op
op(_debug
, "", in
, confirm
);
240 meta_op::sub_op
* nsop
= new meta_op::sub_op(&op
);
241 nsop
->sub_op_t
= meta_op::OP_AMEND
;
242 nsop
->sub_ino_t
= meta_op::INO_DIR
;
245 return op_process(op
);
247 cerr
<< "parameter error? : ino = " << ino
<< std::endl
;
251 int MetaTool::list_meta_info(string
& ino
, string
& out
)
254 inodeno_t i_ino
= std::stoull(ino
.c_str(), nullptr, 0);
255 meta_op
op(_debug
, out
);
256 meta_op::sub_op
* nsop
= new meta_op::sub_op(&op
);
257 nsop
->sub_op_t
= meta_op::OP_LIST
;
258 nsop
->sub_ino_t
= meta_op::INO_DIR
;
261 return op_process(op
);
263 cerr
<< "parameter error? : ino = " << ino
<< std::endl
;
267 int MetaTool::show_meta_info(string
& ino
, string
& out
)
270 inodeno_t i_ino
= std::stoull(ino
.c_str(), nullptr, 0);
271 meta_op
op(_debug
, out
);
273 meta_op::sub_op
* nsop
= new meta_op::sub_op(&op
);
274 nsop
->sub_op_t
= meta_op::OP_SHOW
;
275 nsop
->sub_ino_t
= meta_op::INO_DIR
;
278 return op_process(op
);
280 cerr
<< "parameter error? : ino = " << ino
<< std::endl
;
285 int MetaTool::op_process(meta_op
& op
)
288 while (!op
.no_sops()) {
290 std::cout
<< "process : " << op
.top_op()->detail() << std::endl
;
291 switch(op
.top_op()->sub_op_t
) {
292 case meta_op::OP_LIST
:
295 case meta_op::OP_LTRACE
:
298 case meta_op::OP_SHOW
:
301 case meta_op::OP_AMEND
:
304 case meta_op::OP_SHOW_FN
:
307 case meta_op::OP_AMEND_FN
:
311 cerr
<< "unknow op" << std::endl
;
322 int MetaTool::amend_meta(meta_op
&op
)
324 meta_op::sub_op
* sop
= op
.top_op();
325 auto item
= op
.inodes
.find(sop
->ino
);
326 auto item_k
= op
.okeys
.find(sop
->ino
);
327 if (item
!= op
.inodes
.end() && item_k
!= op
.okeys
.end()) {
328 if (_amend_meta(item_k
->second
, *(item
->second
), op
.infile(), op
) < 0)
331 if (op
.inodes
.empty()) {
332 meta_op::sub_op
* nsop
= new meta_op::sub_op(&op
);
333 nsop
->sub_op_t
= meta_op::OP_LIST
;
334 nsop
->sub_ino_t
= meta_op::INO_DIR
;
335 nsop
->trace_level
= 0;
336 nsop
->ino_c
= sop
->ino
;
346 void MetaTool::inode_meta_t::encode(::ceph::bufferlist
& bl
, uint64_t features
)
350 _i
->encode_bare(bl
, features
);
352 int MetaTool::_amend_meta(string
& k
, inode_meta_t
& inode_meta
, const string
& fn
, meta_op
& op
)
355 if (!parser
.parse(fn
.c_str())) {
356 cout
<< "Error parsing create user response" << std::endl
;
361 inode_meta
.decode_json(&parser
);
362 } catch (JSONDecoder::err
& e
) {
363 cout
<< "failed to decode JSON input: " << e
.what() << std::endl
;
367 if (!op
.confirm_chg() || op
.is_debug()) {
368 cout
<< "you will amend info of inode ==>: " << std::endl
;
369 _show_meta(inode_meta
, "");
372 if (!op
.confirm_chg()) {
373 cout
<< "warning: this operation is irreversibl!!!\n"
374 << " You must confirm that all logs of mds have been flushed!!!\n"
375 << " if you want amend it, please add --yes-i-really-really-mean-it!!!"
381 inode_meta
.encode(bl
, features
);
382 map
<string
, bufferlist
> to_set
;
384 inode_backpointer_t bp
;
385 if (!op
.top_op()->get_ancestor(bp
))
388 auto item
= op
.inodes
.find(bp
.dirino
);
389 if (item
!= op
.inodes
.end()) {
390 frag
= item
->second
->get_meta()->pick_dirfrag(bp
.dname
);
392 string oid
= obj_name(bp
.dirino
, frag
);
393 int ret
= io_meta
.omap_set(oid
, to_set
);
397 int MetaTool::show_fn(meta_op
&op
)
399 meta_op::sub_op
* sop
= op
.top_op();
400 auto item
= op
.inodes
.find(sop
->ino
);
401 if (item
!= op
.inodes
.end()) {
402 if (_show_fn(*(item
->second
), op
.outfile()) < 0)
405 if (op
.inodes
.empty()) {
406 meta_op::sub_op
* nsop
= new meta_op::sub_op(&op
);
407 nsop
->sub_op_t
= meta_op::OP_LIST
;
408 nsop
->sub_ino_t
= meta_op::INO_DIR
;
409 nsop
->trace_level
= 0;
410 nsop
->ino_c
= sop
->ino
;
418 int MetaTool::_show_fn(inode_meta_t
& inode_meta
, const string
& fn
)
420 std::list
<frag_t
> frags
;
421 inode_meta
.get_meta()->dirfragtree
.get_leaves(frags
);
422 std::stringstream ds
;
423 std::string format
= "json";
425 Formatter
* f
= Formatter::create(format
);
426 f
->enable_line_break();
427 f
->open_object_section("fnodes");
428 for (const auto &frag
: frags
) {
430 string oid
= obj_name(inode_meta
.get_meta()->inode
->ino
, frag
);
431 int ret
= io_meta
.omap_get_header(oid
, &hbl
);
433 std::cerr
<< __func__
<< " : can't find oid("<< oid
<< ")" << std::endl
;
439 auto p
= hbl
.cbegin();
440 ::decode(got_fnode
, p
);
441 } catch (const buffer::error
&err
) {
442 cerr
<< "corrupt fnode header in " << oid
443 << ": " << err
.what() << std::endl
;
449 f
->open_object_section(oid
.c_str());
454 f
->dump_string("oids", oids
.c_str());
464 cout
<< "out to file (" << fn
<< ") failed" << std::endl
;
465 cout
<< ds
.str() << std::endl
;
468 std::cout
<< ds
.str() << std::endl
;
471 int MetaTool::amend_fn(meta_op
&op
)
473 if (_amend_fn(op
.infile(), op
.confirm_chg()) < 0)
477 int MetaTool::_amend_fn(const string
& fn
, bool confirm
)
480 if (!parser
.parse(fn
.c_str())) {
481 cout
<< "Error parsing create user response : " << fn
<< std::endl
;
485 cout
<< "warning: this operation is irreversibl!!!\n"
486 << " You must confirm that all logs of mds have been flushed!!!\n"
487 << " if you want amend it, please add --yes-i-really-really-mean-it!!!"
493 JSONDecoder::decode_json("oids", tmp
, &parser
, true);
494 string::size_type pos1
, pos2
;
499 while (string::npos
!= pos2
) {
500 v
.push_back(tmp
.substr(pos1
, pos2
-pos1
));
501 pos1
= pos2
+ c
.size();
502 pos2
= tmp
.find(c
, pos1
);
504 if (pos1
!= tmp
.length())
505 v
.push_back(tmp
.substr(pos1
));
508 cout
<< "amend frag : " << i
<< "..." << std::endl
;
510 JSONDecoder::decode_json(i
.c_str(), fnode
, &parser
, true);
513 ret
= io_meta
.omap_set_header(i
, bl
);
517 } catch (JSONDecoder::err
& e
) {
518 cout
<< "failed to decode JSON input: " << e
.what() << std::endl
;
523 int MetaTool::show_meta(meta_op
&op
)
525 meta_op::sub_op
* sop
= op
.top_op();
526 auto item
= op
.inodes
.find(sop
->ino
);
527 if (item
!= op
.inodes
.end()) {
528 if (_show_meta(*(item
->second
), op
.outfile()) < 0)
531 if (op
.inodes
.empty()) {
532 meta_op::sub_op
* nsop
= new meta_op::sub_op(&op
);
533 nsop
->sub_op_t
= meta_op::OP_LIST
;
534 nsop
->sub_ino_t
= meta_op::INO_DIR
;
535 nsop
->trace_level
= 0;
536 nsop
->ino_c
= sop
->ino
;
545 int MetaTool::_show_meta(inode_meta_t
& inode_meta
, const string
& fn
)
547 std::stringstream ds
;
548 std::string format
= "json";
549 InodeStore
& inode_data
= *inode_meta
.get_meta();
550 Formatter
* f
= Formatter::create(format
);
551 f
->enable_line_break();
552 f
->open_object_section("meta");
553 f
->dump_unsigned("snapid_t", inode_meta
.get_snapid());
554 f
->dump_unsigned("itype", inode_meta
.get_type());
555 f
->open_object_section("store");
558 if (inode_data
.snap_blob
.length()) {
560 auto p
= inode_data
.snap_blob
.cbegin();
562 f
->open_object_section("snap_blob");
566 } catch (const buffer::error
&err
) {
567 cerr
<< "corrupt decode in snap_blob"
568 << ": " << err
.what() << std::endl
;
583 cout
<< "out to file (" << fn
<< ") failed" << std::endl
;
584 cout
<< ds
.str() << std::endl
;
588 std::cout
<< ds
.str() << std::endl
;
591 int MetaTool::list_meta(meta_op
&op
)
593 meta_op::sub_op
* sop
= op
.top_op();
595 bool list_all
= false;
597 inodeno_t ino
= sop
->ino_c
;
598 frag_t frag
= sop
->frag
;
600 if (sop
->ino_c
== 0) {
602 oid
= obj_name(sop
->ino
, frag
);
605 std::cout
<< __func__
<< " : " << sop
->trace_level
<< " " << op
.ancestors
.size() << std::endl
;
606 inode_backpointer_t bp
;
607 if (sop
->get_c_ancestor(bp
)) {
608 auto item
= op
.inodes
.find(bp
.dirino
);
609 if (item
!= op
.inodes
.end()) {
610 frag
= item
->second
->get_meta()->pick_dirfrag(bp
.dname
);
612 oid
= obj_name(bp
.dirino
, frag
);
614 meta_op::sub_op
* nsop
= new meta_op::sub_op(&op
);
615 nsop
->ino
= sop
->ino_c
;
616 nsop
->sub_op_t
= meta_op::OP_LTRACE
;
617 nsop
->sub_ino_t
= meta_op::INO_DIR
;
623 std::cout
<< __func__
<< " : " << string(list_all
?"listall ":"info ") << oid
<< " "<< ino
<< std::endl
;
625 int ret
= io_meta
.omap_get_header(oid
, &hbl
);
627 std::cerr
<< __func__
<< " : can't find it, maybe it (ino:"<< sop
->ino
<< ")isn't a normal dir!" << std::endl
;
631 if (hbl
.length() == 0) { // obj has splite
633 if (frag
== frag_t()) {
634 auto item
= op
.inodes
.find(sop
->ino
);
635 if (item
!= op
.inodes
.end()) {
636 inodeno_t tmp
= sop
->ino
;
638 std::list
<frag_t
> frags
;
639 item
->second
->get_meta()->dirfragtree
.get_leaves(frags
);
640 for (const auto &frag
: frags
) {
641 meta_op::sub_op
* nsop
= new meta_op::sub_op(&op
);
643 nsop
->sub_op_t
= meta_op::OP_LIST
;
644 nsop
->sub_ino_t
= meta_op::INO_DIR
;
649 meta_op::sub_op
* nsop
= new meta_op::sub_op(&op
);
650 nsop
->ino_c
= sop
->ino
;
651 nsop
->sub_op_t
= meta_op::OP_LIST
;
652 nsop
->sub_ino_t
= meta_op::INO_DIR
;
657 cerr
<< __func__
<< " missing some data (" << oid
<< ")???" << std::endl
;
661 if (frag
== frag_t()) {
662 inode_backpointer_t bp
;
663 if (sop
->get_c_ancestor(bp
)) {
664 meta_op::sub_op
* nsop
= new meta_op::sub_op(&op
);
665 nsop
->ino_c
= bp
.dirino
;
666 nsop
->sub_op_t
= meta_op::OP_LIST
;
667 nsop
->sub_ino_t
= meta_op::INO_DIR
;
668 nsop
->trace_level
= sop
->trace_level
+ 1;
672 cerr
<< __func__
<< "can't find obj(" << oid
<< ") ,miss ancestors or miss some objs??? " << std::endl
;
676 cerr
<< __func__
<< "missing some objs(" << oid
<< ")??? " << std::endl
;
684 auto p
= hbl
.cbegin();
685 ::decode(got_fnode
, p
);
686 } catch (const buffer::error
&err
) {
687 cerr
<< "corrupt fnode header in " << oid
688 << ": " << err
.what() << std::endl
;
693 std::string format
= "json";
694 Formatter
* f
= Formatter::create(format
);
695 f
->enable_line_break();
696 f
->dump_string("type", "--fnode--");
697 f
->open_object_section("fnode");
701 std::cout
<< std::endl
;
705 std::map
<string
, bufferlist
> out_vals
;
707 io_meta
.omap_get_vals(oid
, "", max_vals
, &out_vals
);
709 bool force_dirty
= false;
710 const set
<snapid_t
> *snaps
= NULL
;
711 unsigned pos
= out_vals
.size() - 1;
712 std::string last_dname
;
713 for (map
<string
, bufferlist
>::iterator p
= out_vals
.begin();
718 dentry_key_t::decode_helper(p
->first
, dname
, last
);
723 if (show_child(p
->first
, dname
, last
, p
->second
, pos
, snaps
,
724 &force_dirty
, ino
, &op
) == 1) {
728 cout
<< "dname : " << dname
<< " " << last
<< std::endl
;
729 if (show_child(p
->first
, dname
, last
, p
->second
, pos
, snaps
,
733 } catch (const buffer::error
&err
) {
734 derr
<< "Corrupt dentry '" << dname
<< "' : "
735 << err
.what() << "(" << "" << ")" << dendl
;
739 while (out_vals
.size() == (size_t)max_vals
) {
741 io_meta
.omap_get_vals(oid
, last_dname
, max_vals
, &out_vals
);
742 pos
= out_vals
.size() - 1;
743 for (map
<string
, bufferlist
>::iterator p
= (++out_vals
.begin());
748 dentry_key_t::decode_helper(p
->first
, dname
, last
);
752 if (show_child(p
->first
, dname
, last
, p
->second
, pos
, snaps
,
753 &force_dirty
, ino
, &op
) == 1) {
757 cout
<< "dname : " << dname
<< " " << last
<< std::endl
;
758 if (show_child(p
->first
, dname
, last
, p
->second
, pos
, snaps
,
762 } catch (const buffer::error
&err
) {
763 derr
<< "Corrupt dentry '" << dname
<< "' : "
764 << err
.what() << "(" << "" << ")" << dendl
;
771 cerr
<< __func__
<< "miss obj(ino:" << ino
<< ")??? " << std::endl
;
777 int MetaTool::file_meta(meta_op
&op
)
780 if (op
.top_op()->sub_ino_t
== meta_op::INO_DIR
) {
781 r
= _file_meta(op
, io_meta
);
782 } else if (op
.top_op()->sub_ino_t
== meta_op::INO_F
) {
783 for (auto i
= io_data_v
.begin(); i
!= io_data_v
.end(); ++i
)
784 if ((r
= _file_meta(op
, **i
)) == 1)
788 inode_backpointer_t bp
;
789 if (op
.top_op()->get_ancestor(bp
)) {
792 std::cerr
<< "no trace for obj (ino:" << op
.top_op()->ino
<<")??" << std::endl
;
795 } else if (op
.top_op()->sub_ino_t
== meta_op::INO_DIR
) {
796 std::cerr
<< "\tmaybe it's a file(ino:" << op
.top_op()->ino
<< ")" << std::endl
;
797 op
.top_op()->sub_ino_t
= meta_op::INO_F
;
801 std::cerr
<< "can't get (ino:" << op
.top_op()->ino
<<")trace??" << std::endl
;
805 int MetaTool::_file_meta(meta_op
&op
, librados::IoCtx
& io
)
807 inodeno_t ino
= op
.top_op()->ino
;
808 std::string oid
= obj_name(ino
);
809 bufferlist pointer_bl
;
810 std::map
<std::string
, bufferlist
> attrset
;
812 bool have_data
= false;
813 r
= io
.getxattrs (oid
.c_str(), attrset
);
815 std::stringstream ds
;
816 std::string format
= "json";
817 Formatter
* f
= Formatter::create(format
);
818 auto item
= attrset
.find("parent");
819 if (item
!= attrset
.end()) {
820 inode_backtrace_t i_bt
;
822 bufferlist::const_iterator q
= item
->second
.cbegin();
824 f
->open_array_section("info");
826 if (i_bt
.ancestors
.size() > 0)
827 op
.ancestors
[ino
] = i_bt
.ancestors
[0];
828 f
->dump_string("type", "--i_bt--");
829 f
->open_object_section("parent");
832 } catch (buffer::error
&e
) {
833 cerr
<< "failed to decode parent of " << oid
<< std::endl
;
837 cerr
<< oid
<< " in " << io
.get_pool_name() << " , but no parent" << std::endl
;
841 item
= attrset
.find("layout");
842 if (item
!= attrset
.end()) {
843 file_layout_t layout
;
845 auto q
= item
->second
.cbegin();
847 f
->dump_string("type", "--layout--");
848 f
->open_object_section("layout");
852 } catch (buffer::error
&e
) {
853 cerr
<< "failed to decode layout of " << oid
<< std::endl
;
857 cerr
<< oid
<< " in " << io
.get_pool_name() << " , but no layout" << std::endl
;
863 cout
<< ino
<< " : "<< ds
.str() << std::endl
;
869 std::string
MetaTool::obj_name(inodeno_t ino
, uint64_t offset
, const char *suffix
) const
872 snprintf(name
, sizeof(name
), "%llx.%08llx%s", (long long unsigned)ino
, (long long unsigned)offset
, suffix
? suffix
: "");
873 return std::string(name
);
875 std::string
MetaTool::obj_name(inodeno_t ino
, frag_t fg
, const char *suffix
) const
878 snprintf(name
, sizeof(name
), "%llx.%08llx%s", (long long unsigned)ino
, (long long unsigned)fg
, suffix
? suffix
: "");
879 return std::string(name
);
882 std::string
MetaTool::obj_name(const char* ino
, uint64_t offset
, const char *suffix
) const
885 snprintf(name
, sizeof(name
), "%s.%08llx%s", ino
, (long long unsigned)offset
, suffix
? suffix
: "");
886 std::string out
= name
;
887 transform(out
.begin(), out
.end(), out
.begin(),::tolower
);
891 int MetaTool::show_child(std::string_view key
,
892 std::string_view dname
,
896 const std::set
<snapid_t
> *snaps
,
901 bufferlist::const_iterator q
= bl
.cbegin();
911 std::cout
<< pos
<< " type '" << type
<< "' dname '" << dname
912 << " [" << first
<< "," << last
<< "]"
914 // bool stale = false;
915 if (snaps
&& last
!= CEPH_NOSNAP
) {
916 derr
<< "!!!! erro !!!!" << dendl
;
920 // CDentry *dn = NULL;
921 // look for existing dentry for _last_ snap, can't process snap of obj
923 // dn = lookup_exact_snap(dname, last);
925 // dn = lookup(dname, last);
926 if (type
== 'L' || type
== 'l') {
929 unsigned char d_type
;
930 mempool::mds_co::string alternate_name
;
932 CDentry::decode_remote(type
, ino
, d_type
, alternate_name
, q
);
936 std::cout
<< "find hard link : " << ino
<< "," << d_type
<< std::endl
;
941 std::cout
<< "hard link : " << ino
<< "," << d_type
<< std::endl
;
942 } else if (type
== 'I' || type
== 'i') {
944 // load inode data before lookuping up or constructing CInode
945 InodeStore
& inode_data
= *(new InodeStore
);
947 mempool::mds_co::string alternate_name
;
951 decode(alternate_name
, q
);
952 inode_data
.decode(q
);
955 inode_data
.decode_bare(q
);
958 std::stringstream ds
;
959 std::string format
= "json";
960 Formatter
* f
= Formatter::create(format
);
961 f
->enable_line_break();
962 f
->open_object_section("meta");
963 f
->dump_unsigned("snapid_t", first
);
964 f
->dump_unsigned("itype", type
);
965 f
->open_object_section("store");
968 if (inode_data
.snap_blob
.length()) {
970 auto p
= inode_data
.snap_blob
.cbegin();
972 f
->open_object_section("snap_blob");
976 } catch (const buffer::error
&err
) {
977 cerr
<< "corrupt decode in snap_blob"
978 << ": " << err
.what() << std::endl
;
984 if (sp_ino
> 0 && op
!= NULL
&& sp_ino
== inode_data
.inode
->ino
) {
985 inode_meta_t
* tmp
= new inode_meta_t(first
, type
, &inode_data
);
986 op
->inodes
[inode_data
.inode
->ino
] = tmp
;
987 op
->okeys
[inode_data
.inode
->ino
] = key
.data();
994 cout
<< ds
.str() << std::endl
;
997 std::cerr
<< __func__
<< "unknow type : " << dname
<< "," << type
<< std::endl
;