From: Patrick Donnelly Date: Tue, 23 Aug 2022 00:35:52 +0000 (-0400) Subject: mds: correct storage of multiple damaged dentries in DamageTable X-Git-Tag: v18.1.0~1125^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8e48c9ed3de078cbb4a41db165169ebc49d02f59;p=ceph.git mds: correct storage of multiple damaged dentries in DamageTable Fixes: c9cfaef104e9aaefad55583d7e54f8b4665904b3 Fixes: https://tracker.ceph.com/issues/57249 Signed-off-by: Patrick Donnelly --- diff --git a/src/mds/DamageTable.cc b/src/mds/DamageTable.cc index 150ad576482..22802079d85 100644 --- a/src/mds/DamageTable.cc +++ b/src/mds/DamageTable.cc @@ -147,12 +147,11 @@ bool DamageTable::notify_dentry( return true; } - auto key = DirFragIdent(ino, frag); - if (dentries.count(key) == 0) { - DamageEntryRef entry = std::make_shared( - ino, frag, dname, snap_id); + auto& df_dentries = dentries[DirFragIdent(ino, frag)]; + if (auto [it, inserted] = df_dentries.try_emplace(DentryIdent(dname, snap_id)); inserted) { + auto entry = std::make_shared(ino, frag, dname, snap_id); entry->path = path; - dentries[key][DentryIdent(dname, snap_id)] = entry; + it->second = entry; by_id[entry->id] = std::move(entry); } @@ -175,11 +174,10 @@ bool DamageTable::notify_dirfrag(inodeno_t ino, frag_t frag, return true; } - auto key = DirFragIdent(ino, frag); - if (dirfrags.count(key) == 0) { + if (auto [it, inserted] = dirfrags.try_emplace(DirFragIdent(ino, frag)); inserted) { DamageEntryRef entry = std::make_shared(ino, frag); entry->path = path; - dirfrags[key] = entry; + it->second = entry; by_id[entry->id] = std::move(entry); } @@ -192,10 +190,10 @@ bool DamageTable::notify_remote_damaged(inodeno_t ino, std::string_view path) return true; } - if (remotes.count(ino) == 0) { + if (auto [it, inserted] = remotes.try_emplace(ino); inserted) { auto entry = std::make_shared(ino); entry->path = path; - remotes[ino] = entry; + it->second = entry; by_id[entry->id] = std::move(entry); }