]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osdmaptool: allow a completely random placement
authorSage Weil <sage@inktank.com>
Tue, 4 Feb 2014 00:32:48 +0000 (16:32 -0800)
committerSage Weil <sage@inktank.com>
Fri, 7 Feb 2014 15:10:13 +0000 (07:10 -0800)
This useful for comparison purposes and sanity-checking the results.

Signed-off-by: Sage Weil <sage@inktank.com>
src/tools/osdmaptool.cc

index 1d803830d4b9ee97dd58f078d29a39dcf01e5b5a..5464c800aa24c2ad4d5149d13872a7f8747c97d2 100644 (file)
@@ -37,6 +37,7 @@ void usage()
   cout << "   --test-map-pgs          map all pgs" << std::endl;
   cout << "   --mark-up-in            mark osds up and in (but do not persist)" << std::endl;
   cout << "   --clear-temp            clear pg_temp and primary_temp" << std::endl;
+  cout << "   --test-random           do random placements" << std::endl;
   cout << "   --test-map-pg <pgid>    map a pgid to osds" << std::endl;
   cout << "   --test-map-object <objectname> [--pool <poolid>] map an object to osds"
        << std::endl;
@@ -75,6 +76,7 @@ int main(int argc, const char **argv)
   bool clear_temp = false;
   bool test_map_pgs = false;
   int test_pool = -1;
+  bool test_random = false;
 
   std::string val;
   std::ostringstream err;
@@ -103,6 +105,8 @@ int main(int argc, const char **argv)
       clear_temp = true;
     } else if (ceph_argparse_flag(args, i, "--test-map-pgs", (char*)NULL)) {
       test_map_pgs = true;
+    } else if (ceph_argparse_flag(args, i, "--test-random", (char*)NULL)) {
+      test_random = true;
     } else if (ceph_argparse_withint(args, i, &test_pool, &err, "--pool", (char*)NULL)) {
     } else if (ceph_argparse_flag(args, i, "--clobber", (char*)NULL)) {
       clobber = true;
@@ -309,6 +313,8 @@ int main(int argc, const char **argv)
     vector<int> first_count(n, 0);
     vector<int> primary_count(n, 0);
     vector<int> size(30, 0);
+    if (test_random)
+      srand(getpid());
     const map<int64_t,pg_pool_t>& pools = osdmap.get_pools();
     for (map<int64_t,pg_pool_t>::const_iterator p = pools.begin();
         p != pools.end(); ++p) {
@@ -321,7 +327,15 @@ int main(int argc, const char **argv)
 
        vector<int> osds;
        int primary;
-       osdmap.pg_to_acting_osds(pgid, &osds, &primary);
+       if (test_random) {
+         osds.resize(p->second.size);
+         for (unsigned i=0; i<osds.size(); ++i) {
+           osds[i] = rand() % osdmap.get_max_osd();
+         }
+         primary = osds[0];
+       } else {
+         osdmap.pg_to_acting_osds(pgid, &osds, &primary);
+       }
        size[osds.size()]++;
 
        for (unsigned i=0; i<osds.size(); i++) {