]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Filer: add lock to protect strcut PurgeRange 2542/head
authorYan, Zheng <zyan@redhat.com>
Fri, 19 Sep 2014 20:27:38 +0000 (04:27 +0800)
committerYan, Zheng <zyan@redhat.com>
Fri, 19 Sep 2014 22:09:09 +0000 (06:09 +0800)
Fix: #9539
Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/osdc/Filer.cc

index 09749b02b1f51993861911c5cdf7d52da595181d..df23770e3b9b1d833c14197d4b4e989b71127efa 100644 (file)
@@ -242,6 +242,7 @@ bool Filer::_probed(Probe *probe, const object_t& oid, uint64_t size, utime_t mt
 // -----------------------
 
 struct PurgeRange {
+  Mutex lock;
   inodeno_t ino;
   ceph_file_layout layout;
   SnapContext snapc;
@@ -250,6 +251,11 @@ struct PurgeRange {
   int flags;
   Context *oncommit;
   int uncommitted;
+  PurgeRange(inodeno_t i, ceph_file_layout& l, const SnapContext& sc,
+            uint64_t fo, uint64_t no, utime_t t, int fl, Context *fin) :
+         lock("Filer::PurgeRange"), ino(i), layout(l), snapc(sc),
+         first(fo), num(no), mtime(t), flags(fl), oncommit(fin),
+         uncommitted(0) {}
 };
 
 int Filer::purge_range(inodeno_t ino,
@@ -272,17 +278,8 @@ int Filer::purge_range(inodeno_t ino,
     return 0;
   }
 
-  // lots!  let's do this in pieces.
-  PurgeRange *pr = new PurgeRange;
-  pr->ino = ino;
-  pr->layout = *layout;
-  pr->snapc = snapc;
-  pr->first = first_obj;
-  pr->num = num_obj;
-  pr->mtime = mtime;
-  pr->flags = flags;
-  pr->oncommit = oncommit;
-  pr->uncommitted = 0;
+  PurgeRange *pr = new PurgeRange(ino, *layout, snapc, first_obj,
+                                 num_obj, mtime, flags, oncommit);
 
   _do_purge_range(pr, 0);
   return 0;
@@ -299,12 +296,14 @@ struct C_PurgeRange : public Context {
 
 void Filer::_do_purge_range(PurgeRange *pr, int fin)
 {
+  pr->lock.Lock();
   pr->uncommitted -= fin;
   ldout(cct, 10) << "_do_purge_range " << pr->ino << " objects " << pr->first << "~" << pr->num
           << " uncommitted " << pr->uncommitted << dendl;
 
   if (pr->num == 0 && pr->uncommitted == 0) {
     pr->oncommit->complete(0);
+    pr->lock.Unlock();
     delete pr;
     return;
   }
@@ -322,6 +321,7 @@ void Filer::_do_purge_range(PurgeRange *pr, int fin)
     pr->num--;
     max--;
   }
+  pr->lock.Unlock();
 }