summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2013-07-23 13:51:26 -0700
committerSamuel Just <sam.just@inktank.com>2013-07-25 10:33:40 -0700
commit870c474c5348831fcb13797d164f49682918fb30 (patch)
treeff1daee65cc6bf6036a7e5e59e42558755fef29b
parent0dc3efdd885377a07987d868af5bb7a38245c90b (diff)
downloadceph-870c474c5348831fcb13797d164f49682918fb30.tar.gz
FileStore::_collection_rename: fix global replay guard
If the replay is being replayed, we might have already performed the rename, skip it. Also, we must set the collection replay guard only after we have done the rename. Signed-off-by: Samuel Just <sam.just@inktank.com> Reviewed-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/os/FileStore.cc13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc
index 17105c11d69..4e4847e6917 100644
--- a/src/os/FileStore.cc
+++ b/src/os/FileStore.cc
@@ -4304,9 +4304,6 @@ 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));
- _set_global_replay_guard(cid, spos);
- _set_replay_guard(cid, spos);
-
if (_check_replay_guard(cid, spos) < 0) {
return 0;
}
@@ -4315,6 +4312,16 @@ int FileStore::_collection_rename(const coll_t &cid, const coll_t &ncid,
return _collection_remove_recursive(cid, spos);
}
+ if (!collection_exists(cid)) {
+ if (replaying) {
+ // already happened
+ return 0;
+ } else {
+ return -ENOENT;
+ }
+ }
+ _set_global_replay_guard(cid, spos);
+
int ret = 0;
if (::rename(old_coll, new_coll)) {
if (replaying && !btrfs_stable_commits &&