Fix rename corner case: Renaming element to its old name

This commit is contained in:
Sebastian Messmer 2016-04-28 22:36:53 -07:00
parent 9864a95570
commit 66b52b6434

View File

@ -76,18 +76,15 @@ void DirEntryList::addOrOverwrite(const string &name, const Key &blobKey, fspp::
void DirEntryList::rename(const blockstore::Key &key, const std::string &name, std::function<void (const blockstore::Key &key)> onOverwritten) { void DirEntryList::rename(const blockstore::Key &key, const std::string &name, std::function<void (const blockstore::Key &key)> onOverwritten) {
auto foundSameName = _findByName(name); auto foundSameName = _findByName(name);
if (foundSameName != _entries.end()) { if (foundSameName != _entries.end() && foundSameName->key() != key) {
onOverwritten(foundSameName->key()); onOverwritten(foundSameName->key());
_entries.erase(foundSameName); _entries.erase(foundSameName);
} }
ASSERT(_findByName(name) == _entries.end(), "There is still an entry with this name. That means there was a duplicate.");
auto elementToRename = _findByKey(key); auto elementToRename = _findByKey(key);
std::string oldName = elementToRename->name(); std::string oldName = elementToRename->name();
ASSERT(elementToRename != _entries.end(), "Didn't find element to rename"); ASSERT(elementToRename != _entries.end(), "Didn't find element to rename");
elementToRename->setName(name); elementToRename->setName(name);
ASSERT(_findByName(oldName) == _entries.end(), "There is an entry with the old name left. That means there was a duplicate.");
} }
void DirEntryList::_overwrite(vector<DirEntry>::iterator entry, const string &name, const Key &blobKey, fspp::Dir::EntryType entryType, mode_t mode, void DirEntryList::_overwrite(vector<DirEntry>::iterator entry, const string &name, const Key &blobKey, fspp::Dir::EntryType entryType, mode_t mode,