summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-02-18 17:39:46 -0800
committerSage Weil <sage@inktank.com>2013-02-19 10:41:09 -0800
commit5fc83c8d9887d2a916af11436ccc94fcbfe59b7a (patch)
tree376fabddff2608f355a4f965ec9b7f0576776c13
parent56c5a07708d52de1699585c9560cff8b4e993d0a (diff)
downloadceph-5fc83c8d9887d2a916af11436ccc94fcbfe59b7a.tar.gz
os/FileStore: check replay guard on src for collection rename
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>
-rw-r--r--src/os/FileStore.cc4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc
index c91d47c6d0d..c53bd79b2ed 100644
--- a/src/os/FileStore.cc
+++ b/src/os/FileStore.cc
@@ -4169,6 +4169,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);
}