]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
radosgw-admin: add some conditions for bucket rewrite
authorYehuda Sadeh <yehuda@inktank.com>
Thu, 19 Sep 2013 18:47:34 +0000 (11:47 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Fri, 11 Apr 2014 17:08:23 +0000 (10:08 -0700)
 --min-rewrite-size, --max-rewrite-size to specify object size
 conditions

 --start-date, --end-date to specify object mtime conditions (format is
 YYYY-MM-DD[ HH:MM:SS])

Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
(cherry picked from commit dbb2013eaf1eedf2a5cbcae1d314385ea033dbb8)

src/rgw/rgw_admin.cc

index 6d8815605551a6d66f23a85c44d23a021b279cf7..b452e2714c8d9f1f88490bf9616dc3f54ee44d68 100644 (file)
@@ -830,6 +830,9 @@ int main(int argc, char **argv)
 
   int sync_stats = false;
 
+  uint64_t min_rewrite_size = 4 * 1024 * 1024;
+  uint64_t max_rewrite_size = ULLONG_MAX;
+
   std::string val;
   std::ostringstream errs;
   string err;
@@ -893,6 +896,10 @@ int main(int argc, char **argv)
        cerr << errs.str() << std::endl;
        exit(EXIT_FAILURE);
       }
+    } else if (ceph_argparse_witharg(args, i, &val, "--min-rewrite-size", (char*)NULL)) {
+      min_rewrite_size = (uint64_t)atoll(val.c_str());
+    } else if (ceph_argparse_witharg(args, i, &val, "--max-rewrite-size", (char*)NULL)) {
+      max_rewrite_size = (uint64_t)atoll(val.c_str());
     } else if (ceph_argparse_witharg(args, i, &val, "--max-buckets", (char*)NULL)) {
       max_buckets = atoi(val.c_str());
     } else if (ceph_argparse_witharg(args, i, &val, "--max-entries", (char*)NULL)) {
@@ -1862,6 +1869,24 @@ next:
       return -ret;
     }
 
+    uint64_t start_epoch = 0;
+    uint64_t end_epoch = 0;
+
+    if (!end_date.empty()) {
+      int ret = utime_t::parse_date(end_date, &end_epoch, NULL);
+      if (ret < 0) {
+        cerr << "ERROR: failed to parse end date" << std::endl;
+        return EINVAL;
+      }
+    }
+    if (!start_date.empty()) {
+      int ret = utime_t::parse_date(start_date, &start_epoch, NULL);
+      if (ret < 0) {
+        cerr << "ERROR: failed to parse start date" << std::endl;
+        return EINVAL;
+      }
+    }
+
     bool is_truncated = true;
 
     string marker;
@@ -1887,19 +1912,27 @@ next:
       map<string, RGWObjEnt>::iterator iter;
       for (iter = result.begin(); iter != result.end(); ++iter) {
         string name = iter->first;
+        RGWObjEnt& entry = iter->second;
 
         formatter->open_object_section("object");
-        formatter->dump_string("name", iter->first);
-        formatter->dump_int("size", iter->second.size);
-        utime_t ut(iter->second.mtime, 0);
+        formatter->dump_string("name", name);
+        formatter->dump_int("size", entry.size);
+        utime_t ut(entry.mtime, 0);
         ut.gmtime(formatter->dump_stream("mtime"));
 
-        rgw_obj obj(bucket, name);
-        r = store->rewrite_obj(obj);
-        if (r == 0) {
-          formatter->dump_string("status", "Success");
+        if ((entry.size < min_rewrite_size) ||
+            (entry.size > max_rewrite_size) ||
+            (start_epoch > 0 && start_epoch > (uint64_t)ut.sec()) ||
+            (end_epoch > 0 && end_epoch < (uint64_t)ut.sec())) {
+          formatter->dump_string("status", "Skipped");
         } else {
-          formatter->dump_string("status", cpp_strerror(-r));
+          rgw_obj obj(bucket, name);
+          r = store->rewrite_obj(obj);
+          if (r == 0) {
+            formatter->dump_string("status", "Success");
+          } else {
+            formatter->dump_string("status", cpp_strerror(-r));
+          }
         }
 
         formatter->close_section();