From 38cb31ac1426e82ff70ecac23954153d5a7960b1 Mon Sep 17 00:00:00 2001 From: John Spray Date: Tue, 23 Feb 2016 17:31:19 +0000 Subject: [PATCH] mds: add "ceph tell mds damage rm" For situations where an MDS needs to be told that something it thought was damaged is no longer damaged. Signed-off-by: John Spray --- src/mds/DamageTable.cc | 27 +++++++++++++++++++++++++++ src/mds/DamageTable.h | 27 +++++++++++++++++++++++++++ src/mds/MDSDaemon.cc | 2 ++ src/mds/MDSRank.cc | 10 ++++++++++ 4 files changed, 66 insertions(+) diff --git a/src/mds/DamageTable.cc b/src/mds/DamageTable.cc index b4bcea7c2349e..1c7b1919ab2da 100644 --- a/src/mds/DamageTable.cc +++ b/src/mds/DamageTable.cc @@ -137,3 +137,30 @@ void DamageTable::dump(Formatter *f) const f->close_section(); } +void DamageTable::erase(damage_entry_id_t damage_id) +{ + if (by_id.count(damage_id) == 0) { + return; + } + + DamageEntryRef entry = by_id.at(damage_id); + assert(entry->id == damage_id); // Sanity + + const auto type = entry->get_type(); + if (type == DAMAGE_ENTRY_DIRFRAG) { + auto dirfrag_entry = std::static_pointer_cast(entry); + dirfrags.erase(DirFragIdent(dirfrag_entry->ino, dirfrag_entry->frag)); + } else if (type == DAMAGE_ENTRY_DENTRY) { + auto dentry_entry = std::static_pointer_cast(entry); + dentries.erase(DirFragIdent(dentry_entry->ino, dentry_entry->frag)); + } else if (type == DAMAGE_ENTRY_BACKTRACE) { + auto backtrace_entry = std::static_pointer_cast(entry); + remotes.erase(backtrace_entry->ino); + } else { + derr << "Invalid type " << type << dendl; + assert(0); + } + + by_id.erase(damage_id); +} + diff --git a/src/mds/DamageTable.h b/src/mds/DamageTable.h index 15ac53af720e9..cd82911d2e8f6 100644 --- a/src/mds/DamageTable.h +++ b/src/mds/DamageTable.h @@ -23,6 +23,14 @@ class CDir; typedef uint64_t damage_entry_id_t; +typedef enum +{ + DAMAGE_ENTRY_DIRFRAG, + DAMAGE_ENTRY_DENTRY, + DAMAGE_ENTRY_BACKTRACE + +} damage_entry_type_t; + class DamageEntry { public: @@ -35,6 +43,8 @@ class DamageEntry reported_at = ceph_clock_now(g_ceph_context); } + virtual damage_entry_type_t get_type() const = 0; + virtual ~DamageEntry(); virtual void dump(Formatter *f) const = 0; @@ -57,6 +67,11 @@ class DirFragDamage : public DamageEntry : ino(ino_), frag(frag_) {} + virtual damage_entry_type_t get_type() const + { + return DAMAGE_ENTRY_DIRFRAG; + } + void dump(Formatter *f) const { f->open_object_section("dir_frag_damage"); @@ -88,6 +103,11 @@ class DentryDamage : public DamageEntry : ino(ino_), frag(frag_), dname(dname_), snap_id(snap_id_) {} + virtual damage_entry_type_t get_type() const + { + return DAMAGE_ENTRY_DENTRY; + } + void dump(Formatter *f) const { f->open_object_section("dentry_damage"); @@ -114,6 +134,11 @@ class BacktraceDamage : public DamageEntry : ino(ino_) {} + virtual damage_entry_type_t get_type() const + { + return DAMAGE_ENTRY_BACKTRACE; + } + void dump(Formatter *f) const { f->open_object_section("backtrace_damage"); @@ -263,6 +288,8 @@ public: } void dump(Formatter *f) const; + + void erase(damage_entry_id_t damage_id); }; #endif // DAMAGE_TABLE_H_ diff --git a/src/mds/MDSDaemon.cc b/src/mds/MDSDaemon.cc index fb854d2605233..533db45282501 100644 --- a/src/mds/MDSDaemon.cc +++ b/src/mds/MDSDaemon.cc @@ -688,6 +688,8 @@ COMMAND("session evict " \ "Evict client session(s)", "mds", "rw", "cli,rest") COMMAND("damage ls", "List detected metadata damage", "mds", "r", "cli,rest") +COMMAND("damage rm name=damage_id,type=CephInt", + "Remove a damage table entry", "mds", "rw", "cli,rest") COMMAND("heap " \ "name=heapcmd,type=CephChoices,strings=dump|start_profiler|stop_profiler|release|stats", \ "show heap usage info (available only if compiled with tcmalloc)", \ diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index de2cb483ecbcd..1647c708c253e 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -2590,6 +2590,16 @@ bool MDSRankDispatcher::handle_command( f->flush(*ds); delete f; return true; + } else if (prefix == "damage rm") { + damage_entry_id_t id = 0; + bool got = cmd_getval(g_ceph_context, cmdmap, "damage_id", (int64_t&)id); + if (!got) { + *r = -EINVAL; + return true; + } + + damage_table.erase(id); + return true; } else { return false; } -- 2.39.5