]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Fixed locking issue in the trun method of libradosstriper leading to potential race... 2954/head
authorSebastien Ponce <sebastien.ponce@cern.ch>
Tue, 18 Nov 2014 09:30:36 +0000 (10:30 +0100)
committerSebastien Ponce <sebastien.ponce@cern.ch>
Tue, 18 Nov 2014 11:16:01 +0000 (12:16 +0100)
Signed-off-by: Sebastien Ponce <sebastien.ponce@cern.ch>
(cherry picked from commit 8613984373de946e1815cc84d50bbd4437a3f7a7)

src/libradosstriper/RadosStriperImpl.cc

index 2460999eb31938d9a282b655154fa35c7b8df273..fc08e1179d00e9528123c90759de6fc8da08b31e 100644 (file)
@@ -600,20 +600,20 @@ int libradosstriper::RadosStriperImpl::trunc(const std::string& soid, uint64_t s
   std::string firstObjOid = getObjectId(soid, 0);
   try {
     RadosExclusiveLock lock(&m_ioCtx, firstObjOid);
+    // load layout and size
+    ceph_file_layout layout;
+    uint64_t original_size;
+    int rc = internal_get_layout_and_size(firstObjOid, &layout, &original_size);
+    if (rc) return rc;
+    if (size < original_size) {
+      rc = truncate(soid, original_size, size, layout);
+    } else if (size > original_size) {
+      rc = grow(soid, original_size, size, layout);
+    }
+    return rc;
   } catch (ErrorCode &e) {
     return e.m_code;
   }
-  // load layout and size
-  ceph_file_layout layout;
-  uint64_t original_size;
-  int rc = internal_get_layout_and_size(firstObjOid, &layout, &original_size);
-  if (rc) return rc;
-  if (size < original_size) {
-    rc = truncate(soid, original_size, size, layout);
-  } else if (size > original_size) {
-    rc = grow(soid, original_size, size, layout);
-  }
-  return rc;
 }
 
 ///////////////////////// private helpers /////////////////////////////