diff options
author | Sage Weil <sage@inktank.com> | 2013-02-18 17:39:46 -0800 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-02-19 10:41:09 -0800 |
commit | 5fc83c8d9887d2a916af11436ccc94fcbfe59b7a (patch) | |
tree | 376fabddff2608f355a4f965ec9b7f0576776c13 | |
parent | 56c5a07708d52de1699585c9560cff8b4e993d0a (diff) | |
download | ceph-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.cc | 4 |
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); } |