]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd: disk-usage can now optionally compute exact on-disk usage 21912/head
authorJason Dillaman <dillaman@redhat.com>
Wed, 9 May 2018 17:13:56 +0000 (13:13 -0400)
committerJason Dillaman <dillaman@redhat.com>
Wed, 9 May 2018 17:13:56 +0000 (13:13 -0400)
Fixes: http://tracker.ceph.com/issues/24064
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/test/cli/rbd/help.t
src/tools/rbd/action/DiskUsage.cc

index 7206c7a57f77b50b3693ab287fed8ca968782520..bce34fcd855a6275fc18f6f87acc0d32026bf14f 100644 (file)
   rbd help disk-usage
   usage: rbd disk-usage [--pool <pool>] [--image <image>] [--snap <snap>] 
                         [--format <format>] [--pretty-format] 
-                        [--from-snap <from-snap>] 
+                        [--from-snap <from-snap>] [--exact] 
                         <image-or-snap-spec> 
   
   Show disk usage stats for pool, image or snapshot.
     --format arg          output format (plain, json, or xml) [default: plain]
     --pretty-format       pretty formatting (json and xml)
     --from-snap arg       snapshot starting point
+    --exact               compute exact disk usage (slow)
   
   rbd help export
   usage: rbd export [--pool <pool>] [--image <image>] [--snap <snap>] 
index 2df2d3606fd0e0c1a9e5b9caec7236b9fba951e2..5705bdfe780d17a37f3209bf06fda28f31b6aa0d 100644 (file)
@@ -34,7 +34,7 @@ static int compute_image_disk_usage(const std::string& name,
                                     const std::string& snap_name,
                                     const std::string& from_snap_name,
                                     librbd::Image &image, uint64_t size,
-                                    TextTable& tbl, Formatter *f,
+                                    bool exact, TextTable& tbl, Formatter *f,
                                     uint64_t *used_size) {
   const char* from = NULL;
   if (!from_snap_name.empty()) {
@@ -55,7 +55,7 @@ static int compute_image_disk_usage(const std::string& name,
   }
 
   *used_size = 0;
-  r = image.diff_iterate2(from, 0, size, false, true,
+  r = image.diff_iterate2(from, 0, size, false, !exact,
                           &disk_usage_callback, used_size);
   if (r < 0) {
     std::cerr << "rbd: failed to iterate diffs: " << cpp_strerror(r)
@@ -87,7 +87,7 @@ static int compute_image_disk_usage(const std::string& name,
 
 static int do_disk_usage(librbd::RBD &rbd, librados::IoCtx &io_ctx,
                          const char *imgname, const char *snapname,
-                         const char *from_snapname, Formatter *f) {
+                         const char *from_snapname, bool exact, Formatter *f) {
   std::vector<std::string> names;
   int r = rbd.list(io_ctx, names);
   if (r == -ENOENT) {
@@ -179,7 +179,7 @@ static int do_disk_usage(librbd::RBD &rbd, librados::IoCtx &io_ctx,
       if (imgname == nullptr || found_from_snap ||
          (found_from_snap && snapname != nullptr && snap->name == snapname)) {
         r = compute_image_disk_usage(*name, snap->name, last_snap_name,
-                                     snap_image, snap->size, tbl, f,
+                                     snap_image, snap->size, exact, tbl, f,
                                      &used_size);
         if (r < 0) {
           goto out;
@@ -204,7 +204,7 @@ static int do_disk_usage(librbd::RBD &rbd, librados::IoCtx &io_ctx,
 
     if (snapname == NULL) {
       r = compute_image_disk_usage(*name, "", last_snap_name, image, info.size,
-                                   tbl, f, &used_size);
+                                   exact, tbl, f, &used_size);
       if (r < 0) {
         goto out;
       }
@@ -247,7 +247,8 @@ void get_arguments(po::options_description *positional,
   at::add_format_options(options);
   options->add_options()
     (at::FROM_SNAPSHOT_NAME.c_str(), po::value<std::string>(),
-     "snapshot starting point");
+     "snapshot starting point")
+    ("exact", po::bool_switch(), "compute exact disk usage (slow)");
 }
 
 int execute(const po::variables_map &vm,
@@ -287,7 +288,7 @@ int execute(const po::variables_map &vm,
                     image_name.empty() ? nullptr: image_name.c_str(),
                     snap_name.empty() ? nullptr : snap_name.c_str(),
                     from_snap_name.empty() ? nullptr : from_snap_name.c_str(),
-                    formatter.get());
+                    vm["exact"].as<bool>(), formatter.get());
   if (r < 0) {
     std::cerr << "rbd: du failed: " << cpp_strerror(r) << std::endl;
     return r;