From: Jason Dillaman Date: Wed, 21 Nov 2018 03:54:08 +0000 (-0500) Subject: rbd: expose optional namespace in parent/child image output X-Git-Tag: v14.1.0~811^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ab74cc24eb9f4be06ada4dcd78c8f5e3f45e8ef6;p=ceph.git rbd: expose optional namespace in parent/child image output Signed-off-by: Jason Dillaman --- diff --git a/src/tools/rbd/action/Children.cc b/src/tools/rbd/action/Children.cc index 550b19bb9b99..b13195506a01 100644 --- a/src/tools/rbd/action/Children.cc +++ b/src/tools/rbd/action/Children.cc @@ -19,41 +19,43 @@ namespace po = boost::program_options; int do_list_children(librados::IoCtx &io_ctx, librbd::Image &image, bool all_flag, Formatter *f) { - std::vector children; + std::vector children; librbd::RBD rbd; - int r = image.list_children2(&children); + int r = image.list_children3(&children); if (r < 0) return r; if (f) f->open_array_section("children"); - for (std::vector::iterator it = children.begin(); - it != children.end(); ++it) { - bool trash = it->trash; + for (auto& child : children) { + bool trash = child.trash; if (f) { if (all_flag) { f->open_object_section("child"); - f->dump_string("pool", it->pool_name); - f->dump_string("image", it->image_name); - f->dump_string("id", it->image_id); - f->dump_bool("trash", it->trash); + f->dump_string("pool", child.pool_name); + f->dump_string("pool_namespace", child.pool_namespace); + f->dump_string("image", child.image_name); + f->dump_string("id", child.image_id); + f->dump_bool("trash", child.trash); f->close_section(); } else if (!trash) { f->open_object_section("child"); - f->dump_string("pool", it->pool_name); - f->dump_string("image", it->image_name); + f->dump_string("pool", child.pool_name); + f->dump_string("pool_namespace", child.pool_namespace); + f->dump_string("image", child.image_name); f->close_section(); } - } else { - if (all_flag) { - std::cout << it->pool_name << "/" << it->image_name; - if (trash) - std::cout << " (trash " << it->image_id << ")"; - std::cout << std::endl; - } else if (!trash) { - std::cout << it->pool_name << "/" << it->image_name << std::endl; + } else if (all_flag || !trash) { + std::cout << child.pool_name << "/"; + if (!child.pool_namespace.empty()) { + std::cout << child.pool_namespace << "/"; + } + std::cout << child.image_name; + if (trash) { + std::cout << " (trash " << child.image_id << ")"; } + std::cout << std::endl; } } diff --git a/src/tools/rbd/action/Info.cc b/src/tools/rbd/action/Info.cc index 4192a246ef0c..1b4f53d0081f 100644 --- a/src/tools/rbd/action/Info.cc +++ b/src/tools/rbd/action/Info.cc @@ -312,34 +312,32 @@ static int do_show_info(librados::IoCtx &io_ctx, librbd::Image& image, } // parent info, if present - std::string parent_pool, parent_name, parent_id, parent_snapname; - if ((image.parent_info2(&parent_pool, &parent_name, &parent_id, - &parent_snapname) == 0) && - parent_name.length() > 0) { - - librbd::trash_image_info_t trash_image_info; - librbd::RBD rbd; - r = rbd.trash_get(io_ctx, parent_id.c_str(), &trash_image_info); - bool trash_image_info_valid = (r == 0); - + librbd::linked_image_spec_t parent_image_spec; + librbd::snap_spec_t parent_snap_spec; + if ((image.get_parent(&parent_image_spec, &parent_snap_spec) == 0) && + (parent_image_spec.image_name.length() > 0)) { if (f) { f->open_object_section("parent"); - f->dump_string("pool", parent_pool); - f->dump_string("image", parent_name); - f->dump_string("snapshot", parent_snapname); - if (trash_image_info_valid) { - f->dump_string("trash", parent_id); - } + f->dump_string("pool", parent_image_spec.pool_name); + f->dump_string("pool_namespace", parent_image_spec.pool_namespace); + f->dump_string("image", parent_image_spec.image_name); + f->dump_string("id", parent_image_spec.image_id); + f->dump_string("snapshot", parent_snap_spec.name); + f->dump_bool("trash", parent_image_spec.trash); if ((features & RBD_FEATURE_MIGRATING) != 0) { f->dump_bool("migration_source", true); } f->dump_unsigned("overlap", overlap); f->close_section(); } else { - std::cout << "\tparent: " << parent_pool << "/" << parent_name - << (parent_snapname.empty() ? "" : "@") << parent_snapname; - if (trash_image_info_valid) { - std::cout << " (trash " << parent_id << ")"; + std::cout << "\tparent: " << parent_image_spec.pool_name << "/"; + if (!parent_image_spec.pool_namespace.empty()) { + std::cout << parent_image_spec.pool_namespace << "/"; + } + std::cout << parent_image_spec.image_name << "@" + << parent_snap_spec.name; + if (parent_image_spec.trash) { + std::cout << " (trash " << parent_image_spec.image_id << ")"; } if ((features & RBD_FEATURE_MIGRATING) != 0) { std::cout << " (migration source)"; diff --git a/src/tools/rbd/action/List.cc b/src/tools/rbd/action/List.cc index dcab81814a6e..56c14a901609 100644 --- a/src/tools/rbd/action/List.cc +++ b/src/tools/rbd/action/List.cc @@ -46,15 +46,23 @@ int list_process_image(librados::Rados* rados, WorkerEntry* w, bool lflag, Forma { int r = 0; librbd::image_info_t info; - std::string pool, image, snap, parent; + std::string parent; // handle second-nth trips through loop - r = w->img.parent_info(&pool, &image, &snap); - if (r < 0 && r != -ENOENT) + librbd::linked_image_spec_t parent_image_spec; + librbd::snap_spec_t parent_snap_spec; + r = w->img.get_parent(&parent_image_spec, &parent_snap_spec); + if (r < 0 && r != -ENOENT) { return r; + } + bool has_parent = false; if (r != -ENOENT) { - parent = pool + "/" + image + "@" + snap; + parent = parent_image_spec.pool_name + "/"; + if (!parent_image_spec.pool_namespace.empty()) { + parent += parent_image_spec.pool_namespace + "/"; + } + parent += parent_image_spec.image_name + "@" + parent_snap_spec.name; has_parent = true; } @@ -81,9 +89,10 @@ int list_process_image(librados::Rados* rados, WorkerEntry* w, bool lflag, Forma f->dump_unsigned("size", info.size); if (has_parent) { f->open_object_section("parent"); - f->dump_string("pool", pool); - f->dump_string("image", image); - f->dump_string("snapshot", snap); + f->dump_string("pool", parent_image_spec.pool_name); + f->dump_string("pool_namespace", parent_image_spec.pool_namespace); + f->dump_string("image", parent_image_spec.image_name); + f->dump_string("snapshot", parent_snap_spec.name); f->close_section(); } f->dump_int("format", old_format ? 1 : 2); @@ -115,8 +124,12 @@ int list_process_image(librados::Rados* rados, WorkerEntry* w, bool lflag, Forma r = w->img.snap_is_protected(s->name.c_str(), &is_protected); if (r < 0) return r; - if (w->img.parent_info(&pool, &image, &snap) >= 0) { - parent = pool + "/" + image + "@" + snap; + if (w->img.get_parent(&parent_image_spec, &parent_snap_spec) >= 0) { + parent = parent_image_spec.pool_name + "/"; + if (!parent_image_spec.pool_namespace.empty()) { + parent += parent_image_spec.pool_namespace + "/"; + } + parent += parent_image_spec.image_name + "@" + parent_snap_spec.name; has_parent = true; } if (f) { @@ -126,9 +139,10 @@ int list_process_image(librados::Rados* rados, WorkerEntry* w, bool lflag, Forma f->dump_unsigned("size", s->size); if (has_parent) { f->open_object_section("parent"); - f->dump_string("pool", pool); - f->dump_string("image", image); - f->dump_string("snapshot", snap); + f->dump_string("pool", parent_image_spec.pool_name); + f->dump_string("pool_namespace", parent_image_spec.pool_namespace); + f->dump_string("image", parent_image_spec.image_name); + f->dump_string("snapshot", parent_snap_spec.name); f->close_section(); } f->dump_int("format", old_format ? 1 : 2); @@ -152,7 +166,7 @@ int list_process_image(librados::Rados* rados, WorkerEntry* w, bool lflag, Forma int do_list(const std::string &pool_name, const std::string& namespace_name, bool lflag, int threads, Formatter *f) { std::vector workers; - std::vector names; + std::vector images; librados::Rados rados; librbd::RBD rbd; librados::IoCtx ioctx; @@ -171,19 +185,18 @@ int do_list(const std::string &pool_name, const std::string& namespace_name, utils::disable_cache(); - r = rbd.list(ioctx, names); + r = rbd.list2(ioctx, &images); if (r < 0) return r; if (!lflag) { if (f) f->open_array_section("images"); - for (std::vector::const_iterator i = names.begin(); - i != names.end(); ++i) { + for (auto& image : images) { if (f) - f->dump_string("name", *i); + f->dump_string("name", image.name); else - std::cout << *i << std::endl; + std::cout << image.name << std::endl; } if (f) { f->close_section(); @@ -205,11 +218,12 @@ int do_list(const std::string &pool_name, const std::string& namespace_name, tbl.define_column("LOCK", TextTable::LEFT, TextTable::LEFT); } - for (int left = 0; left < std::min(threads, (int)names.size()); left++) { + for (size_t left = 0; left < std::min(threads, images.size()); + left++) { workers.push_back(new WorkerEntry()); } - auto i = names.begin(); + auto i = images.begin(); while (true) { size_t workers_idle = 0; for (auto comp : workers) { @@ -221,13 +235,14 @@ int do_list(const std::string &pool_name, const std::string& namespace_name, comp->completion = nullptr; // we want it to fall through in this case case STATE_IDLE: - if (i == names.end()) { + if (i == images.end()) { workers_idle++; continue; } - comp->name = *i; + comp->name = i->name; comp->completion = new librbd::RBD::AioCompletion(nullptr, nullptr); - r = rbd.aio_open_read_only(ioctx, comp->img, i->c_str(), NULL, comp->completion); + r = rbd.aio_open_read_only(ioctx, comp->img, i->name.c_str(), nullptr, + comp->completion); i++; comp->state = STATE_OPENED; break; @@ -241,8 +256,8 @@ int do_list(const std::string &pool_name, const std::string& namespace_name, comp->completion->release(); if (r < 0) { if (r != -ENOENT) { - std::cerr << "rbd: error opening " << *i << ": " << cpp_strerror(r) - << std::endl; + std::cerr << "rbd: error opening " << i->name << ": " + << cpp_strerror(r) << std::endl; } // in any event, continue to next image comp->state = STATE_IDLE; @@ -250,8 +265,8 @@ int do_list(const std::string &pool_name, const std::string& namespace_name, } r = list_process_image(&rados, comp, lflag, f, tbl); if (r < 0) { - std::cerr << "rbd: error processing image " << comp->name << ": " << cpp_strerror(r) - << std::endl; + std::cerr << "rbd: error processing image " << comp->name << ": " + << cpp_strerror(r) << std::endl; } comp->completion = new librbd::RBD::AioCompletion(nullptr, nullptr); r = comp->img.aio_close(comp->completion); @@ -267,7 +282,7 @@ int do_list(const std::string &pool_name, const std::string& namespace_name, if (f) { f->close_section(); f->flush(std::cout); - } else if (!names.empty()) { + } else if (!images.empty()) { std::cout << tbl; }