mdcache->repair_dirfrag_stats(this);
scrub_infop->header->set_repaired();
good = true;
+ mdcache->mds->damage_table.remove_dentry_damage_entry(this);
}
return good;
}
false);
// Flag that we repaired this BT so that it won't go into damagetable
results->backtrace.repaired = true;
+ in->mdcache->mds->damage_table.remove_backtrace_damage_entry(in->ino());
if (in->mdcache->mds->logger)
in->mdcache->mds->logger->inc(l_mds_scrub_backtrace_repaired);
}
<< "freshly-calculated rstats don't match existing ones (will be fixed)";
in->mdcache->repair_inode_stats(in);
results->raw_stats.repaired = true;
+ for (const auto &p : in->dirfrags){
+ in->mdcache->mds->damage_table.remove_dirfrag_damage_entry(p.second);
+ }
} else {
results->raw_stats.error_str
<< "freshly-calculated rstats don't match existing ones";
#include "common/debug.h"
#include "mds/CDir.h"
+#include "mds/CInode.h"
#include "DamageTable.h"
return false;
}
+void DamageTable::remove_dentry_damage_entry(CDir *dir)
+{
+ if (dentries.count(
+ DirFragIdent(dir->inode->ino(), dir->frag)
+ ) > 0){
+ const auto frag_dentries =
+ dentries.at(DirFragIdent(dir->inode->ino(), dir->frag));
+ for(const auto &i : frag_dentries) {
+ erase(i.second->id);
+ }
+ }
+}
+
+void DamageTable::remove_dirfrag_damage_entry(CDir *dir)
+{
+ if (is_dirfrag_damaged(dir)){
+ erase(dirfrags.find(DirFragIdent(dir->inode->ino(), dir->frag))->second->id);
+ }
+}
+
+void DamageTable::remove_backtrace_damage_entry(inodeno_t ino)
+{
+ if (is_remote_damaged(ino)){
+ erase(remotes.find(ino)->second->id);
+ }
+}
+
bool DamageTable::oversized() const
{
return by_id.size() > (size_t)(g_conf()->mds_damage_table_max_entries);
#include "include/random.h"
class CDir;
+class CInode;
typedef uint64_t damage_entry_id_t;
*/
bool notify_remote_damaged(inodeno_t ino, std::string_view path);
+ void remove_dentry_damage_entry(CDir *dir);
+
+ void remove_dirfrag_damage_entry(CDir *dir);
+
+ void remove_backtrace_damage_entry(inodeno_t ino);
+
bool is_dentry_damaged(
const CDir *dir_frag,
std::string_view dname,