]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add "ceph tell mds damage rm" 5919/head
authorJohn Spray <john.spray@redhat.com>
Tue, 23 Feb 2016 17:31:19 +0000 (17:31 +0000)
committerJohn Spray <john.spray@redhat.com>
Thu, 3 Mar 2016 18:35:54 +0000 (18:35 +0000)
For situations where an MDS needs to be told
that something it thought was damaged is no longer
damaged.

Signed-off-by: John Spray <john.spray@redhat.com>
src/mds/DamageTable.cc
src/mds/DamageTable.h
src/mds/MDSDaemon.cc
src/mds/MDSRank.cc

index b4bcea7c2349e3539a0f79602278cee63c3e2a1c..1c7b1919ab2da098db86fc1a9ca42b7c9811e51f 100644 (file)
@@ -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<DirFragDamage>(entry);
+    dirfrags.erase(DirFragIdent(dirfrag_entry->ino, dirfrag_entry->frag));
+  } else if (type == DAMAGE_ENTRY_DENTRY) {
+    auto dentry_entry = std::static_pointer_cast<DentryDamage>(entry);
+    dentries.erase(DirFragIdent(dentry_entry->ino, dentry_entry->frag));
+  } else if (type == DAMAGE_ENTRY_BACKTRACE) {
+    auto backtrace_entry = std::static_pointer_cast<BacktraceDamage>(entry);
+    remotes.erase(backtrace_entry->ino);
+  } else {
+    derr << "Invalid type " << type << dendl;
+    assert(0);
+  }
+
+  by_id.erase(damage_id);
+}
+
index 15ac53af720e94f5ecb1963e8c01afb501ea6d24..cd82911d2e8f67bb05084937415b2e3477e8e3d6 100644 (file)
@@ -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_
index fb854d2605233f50fa136e65d0ac350303bf2c28..533db452825010e55db6deb163d742e4f1cd5306 100644 (file)
@@ -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)", \
index de2cb483ecbcdcc1db1a0098430ca23d3e760c83..1647c708c253e1d0c46389180359c01ddb311dce 100644 (file)
@@ -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;
   }