]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Fixed locking issue in the trun method of libradosstriper leading to potential race... 2951/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 10:34:56 +0000 (11:34 +0100)
Signed-off-by: Sebastien Ponce <sebastien.ponce@cern.ch>
src/libradosstriper/RadosStriperImpl.cc

index 2ef94ad7b59cd71f92ea79d6d99690582ecdcf43..35c1c7ae27c6d6aa9aa3ec8cf7bc5d6c9137e895 100644 (file)
@@ -613,20 +613,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 /////////////////////////////