From d50615a5f182e988d975e5dbeead21ba26a71594 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Tue, 23 Jul 2013 13:51:26 -0700 Subject: 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 --- src/os/FileStore.cc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc index 82185dc9d7c..c764d6bef2a 100644 --- a/src/os/FileStore.cc +++ b/src/os/FileStore.cc @@ -4352,9 +4352,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; } @@ -4363,6 +4360,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 && -- cgit v1.2.1