From 8e48c9ed3de078cbb4a41db165169ebc49d02f59 Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Mon, 22 Aug 2022 20:35:52 -0400 Subject: [PATCH] mds: correct storage of multiple damaged dentries in DamageTable Fixes: c9cfaef104e9aaefad55583d7e54f8b4665904b3 Fixes: https://tracker.ceph.com/issues/57249 Signed-off-by: Patrick Donnelly --- src/mds/DamageTable.cc | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/mds/DamageTable.cc b/src/mds/DamageTable.cc index 150ad5764825..22802079d85d 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); } -- 2.47.3