]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/FileStore: check replay guard on src for collection rename
authorSage Weil <sage@inktank.com>
Tue, 19 Feb 2013 01:39:46 +0000 (17:39 -0800)
committerSage Weil <sage@inktank.com>
Wed, 20 Mar 2013 23:43:37 +0000 (16:43 -0700)
This avoids a problematic sequence like:

     - rename A/ -> B/
     - remove B/1...100
     - destroy B/
     - create A/
     - write A/101...
     <crash>
     - replay A/ -> B/
     - remove B/1...100  (fails but tolerated)
     - destroy B/        (fails with ENOTEMPTY)

Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Samuel Just <sam.just@inktank.com>
(cherry picked from commit 5fc83c8d9887d2a916af11436ccc94fcbfe59b7a)

src/os/FileStore.cc

index 44f3b571960efd5b77037b43cac7ee922b42c1fd..ac4d9b3afc88b924c18d2956c0d973da6b239039 100644 (file)
@@ -4159,6 +4159,10 @@ int FileStore::_collection_rename(const coll_t &cid, const coll_t &ncid,
   get_cdir(cid, old_coll, sizeof(old_coll));
   get_cdir(ncid, new_coll, sizeof(new_coll));
 
+  if (_check_replay_guard(cid, spos) < 0) {
+    return 0;
+  }
+
   if (_check_replay_guard(ncid, spos) < 0) {
     return _collection_remove_recursive(cid, spos);
   }