]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osdc/Objecter: protect pool ops with rwlock
authorSage Weil <sage@redhat.com>
Sun, 20 Jul 2014 17:22:56 +0000 (10:22 -0700)
committerJohn Spray <john.spray@redhat.com>
Mon, 25 Aug 2014 00:34:00 +0000 (01:34 +0100)
Signed-off-by: Sage Weil <sage@redhat.com>
src/osdc/Objecter.cc
src/osdc/Objecter.h

index 1d969ec77de8007186b8dbb7a9e337334eef5630..0e9cdd1a51b46fa5e5a79a15d15329e8b9c7a31a 100644 (file)
@@ -2549,6 +2549,7 @@ void Objecter::_list_reply(ListContext *list_context, int r,
 
 int Objecter::create_pool_snap(int64_t pool, string& snap_name, Context *onfinish)
 {
+  RWLock::WLocker wl(rwlock);
   ldout(cct, 10) << "create_pool_snap; pool: " << pool << "; snap: " << snap_name << dendl;
 
   const pg_pool_t *p = osdmap->get_pg_pool(pool);
@@ -2589,6 +2590,7 @@ struct C_SelfmanagedSnap : public Context {
 int Objecter::allocate_selfmanaged_snap(int64_t pool, snapid_t *psnapid,
                                        Context *onfinish)
 {
+  RWLock::WLocker wl(rwlock);
   ldout(cct, 10) << "allocate_selfmanaged_snap; pool: " << pool << dendl;
   PoolOp *op = new PoolOp;
   if (!op) return -ENOMEM;
@@ -2606,6 +2608,7 @@ int Objecter::allocate_selfmanaged_snap(int64_t pool, snapid_t *psnapid,
 
 int Objecter::delete_pool_snap(int64_t pool, string& snap_name, Context *onfinish)
 {
+  RWLock::WLocker wl(rwlock);
   ldout(cct, 10) << "delete_pool_snap; pool: " << pool << "; snap: " << snap_name << dendl;
 
   const pg_pool_t *p = osdmap->get_pg_pool(pool);
@@ -2630,7 +2633,9 @@ int Objecter::delete_pool_snap(int64_t pool, string& snap_name, Context *onfinis
 }
 
 int Objecter::delete_selfmanaged_snap(int64_t pool, snapid_t snap,
-                                     Context *onfinish) {
+                                     Context *onfinish)
+{
+  RWLock::WLocker wl(rwlock);
   ldout(cct, 10) << "delete_selfmanaged_snap; pool: " << pool << "; snap: " 
           << snap << dendl;
   PoolOp *op = new PoolOp;
@@ -2650,6 +2655,7 @@ int Objecter::delete_selfmanaged_snap(int64_t pool, snapid_t snap,
 int Objecter::create_pool(string& name, Context *onfinish, uint64_t auid,
                          int crush_rule)
 {
+  RWLock::WLocker wl(rwlock);
   ldout(cct, 10) << "create_pool name=" << name << dendl;
 
   if (osdmap->lookup_pg_pool_name(name.c_str()) >= 0)
@@ -2674,6 +2680,7 @@ int Objecter::create_pool(string& name, Context *onfinish, uint64_t auid,
 
 int Objecter::delete_pool(int64_t pool, Context *onfinish)
 {
+  RWLock::WLocker wl(rwlock);
   ldout(cct, 10) << "delete_pool " << pool << dendl;
 
   if (!osdmap->have_pg_pool(pool))
@@ -2701,6 +2708,7 @@ int Objecter::delete_pool(int64_t pool, Context *onfinish)
  */
 int Objecter::change_pool_auid(int64_t pool, Context *onfinish, uint64_t auid)
 {
+  RWLock::WLocker wl(rwlock);
   ldout(cct, 10) << "change_pool_auid " << pool << " to " << auid << dendl;
   PoolOp *op = new PoolOp;
   if (!op) return -ENOMEM;
@@ -2732,8 +2740,7 @@ public:
 
 void Objecter::pool_op_submit(PoolOp *op)
 {
-  RWLock::WLocker wl(rwlock);
-
+  assert(rwlock.is_locked());
   if (mon_timeout > 0) {
     op->ontimeout = new C_CancelPoolOp(op->tid, this);
     timer.add_event_after(mon_timeout, op->ontimeout);
index 00e767de015631c89cbe191daf1e5f04d97bd797..a66830fe0fe3fd59690700d90153c96763a36907 100644 (file)
@@ -2157,6 +2157,7 @@ public:
 private:
   void pool_op_submit(PoolOp *op);
   void _pool_op_submit(PoolOp *op);
+  void _finish_pool_op(PoolOp *op);
 public:
   int create_pool_snap(int64_t pool, string& snapName, Context *onfinish);
   int allocate_selfmanaged_snap(int64_t pool, snapid_t *psnapid, Context *onfinish);
@@ -2170,7 +2171,6 @@ public:
 
   void handle_pool_op_reply(MPoolOpReply *m);
   int pool_op_cancel(ceph_tid_t tid, int r);
-  void _finish_pool_op(PoolOp *op);
 
   // --------------------------
   // pool stats