]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: disallow pg_num changes until after pool is created
authorSage Weil <sage@redhat.com>
Fri, 23 Feb 2018 14:52:42 +0000 (08:52 -0600)
committerSage Weil <sage@redhat.com>
Wed, 4 Apr 2018 13:26:56 +0000 (08:26 -0500)
The pg create handling OSD code does not handle races between a mon create
message and a split message.

Signed-off-by: Sage Weil <sage@redhat.com>
src/mon/CreatingPGs.h
src/mon/OSDMonitor.cc

index fae7e6f2ce5ab5f3addea85059d4eb64f4986be1..d0c695d9f604f1bb02b25fc12af504d93cdea4f9 100644 (file)
@@ -47,6 +47,17 @@ struct creating_pgs_t {
   /// pools that exist in the osdmap for which at least one pg has been created
   std::set<int64_t> created_pools;
 
+  bool is_creating_pool(int64_t poolid) {
+    if (queue.count(poolid)) {
+      return true;
+    }
+    for (auto& i : pgs) {
+      if ((int64_t)i.first.pool() == poolid) {
+       return true;
+      }
+    }
+    return false;
+  }
   bool create_pool(int64_t poolid, uint32_t pg_num,
                   epoch_t created, utime_t modified) {
     if (created_pools.count(poolid) == 0) {
index a76b4870a24ab104ce2867bc43c89b4bffe2d9e9..3e7eceebc8859a077852ebd5d8199f4bc0ce58a5 100644 (file)
@@ -6065,6 +6065,10 @@ int OSDMonitor::prepare_command_pool_set(const cmdmap_t& cmdmap,
          << " (you may adjust 'mon max pool pg num' for higher values)";
       return -ERANGE;
     }
+    if (creating_pgs.is_creating_pool(pool)) {
+      ss << "still creating initial PGs; cannot update pg_num yet";
+      return -EBUSY;
+    }
     int r = check_pg_num(pool, n, p.get_size(), &ss);
     if (r) {
       return r;