]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: tidy up ScrubHeader
authorJohn Spray <john.spray@redhat.com>
Mon, 19 Sep 2016 17:26:42 +0000 (18:26 +0100)
committerNathan Cutler <ncutler@suse.com>
Mon, 19 Jun 2017 21:24:30 +0000 (23:24 +0200)
Signed-off-by: John Spray <john.spray@redhat.com>
(cherry picked from commit 111d2cf2d8504cd4486180a95e52f253018364b3)

Conflicts:
src/mds/CInode.cc (jewel does not have 5259683e7819c22c14b21b1dd678a33e14574f21)

src/mds/CDir.cc
src/mds/CInode.cc
src/mds/MDCache.cc
src/mds/ScrubHeader.h
src/mds/ScrubStack.cc

index d5283e2036cf4feeddb6fb6858ae6d56e2605cfc..7e9f7cff1ac4361125527ec940c524142c27425e 100644 (file)
@@ -3040,7 +3040,7 @@ int CDir::_next_dentry_on_set(set<dentry_key_t>& dns, bool missing_okay,
     dns.erase(dnkey);
 
     if (dn->get_projected_version() < scrub_infop->last_recursive.version &&
-       !(scrub_infop->header->force)) {
+       !(scrub_infop->header->get_force())) {
       dout(15) << " skip dentry " << dnkey.name
               << ", no change since last scrub" << dendl;
       continue;
@@ -3146,7 +3146,7 @@ bool CDir::scrub_local()
     scrub_infop->last_scrub_dirty = true;
   } else {
     scrub_infop->pending_scrub_error = true;
-    if (scrub_infop->header->repair)
+    if (scrub_infop->header->get_repair())
       cache->repair_dirfrag_stats(this);
   }
   return rval;
index 41dbfaf69bfcbc91629d6755e8d1fc5d73a7b260..e10d2b7a523b394de4ffa9d8b925670424ade36c 100644 (file)
@@ -3764,7 +3764,7 @@ void CInode::validate_disk_state(CInode::validated_data *results,
       // present)
       if (in->scrub_infop) {
         // I'm a non-orphan, so look up my ScrubHeader via my linkage
-        const std::string &tag = in->scrub_infop->header->tag;
+        const std::string &tag = in->scrub_infop->header->get_tag();
         // Rather than using the usual CInode::fetch_backtrace,
         // use a special variant that optionally writes a tag in the same
         // operation.
@@ -3933,7 +3933,7 @@ next:
        if (dir->scrub_infop &&
            dir->scrub_infop->pending_scrub_error) {
          dir->scrub_infop->pending_scrub_error = false;
-         if (dir->scrub_infop->header->repair) {
+         if (dir->scrub_infop->header->get_repair()) {
            results->raw_stats.error_str
              << "dirfrag(" << p->first << ") has bad stats (will be fixed); ";
          } else {
@@ -3948,7 +3948,7 @@ next:
       if (!dir_info.same_sums(in->inode.dirstat) ||
          !nest_info.same_sums(in->inode.rstat)) {
        if (in->scrub_infop &&
-           in->scrub_infop->header->repair) {
+           in->scrub_infop->header->get_repair()) {
          results->raw_stats.error_str
            << "freshly-calculated rstats don't match existing ones (will be fixed)";
          in->mdcache->repair_inode_stats(in);
@@ -4177,7 +4177,7 @@ void CInode::scrub_initialize(CDentry *scrub_parent,
     for (std::list<frag_t>::iterator i = frags.begin();
         i != frags.end();
         ++i) {
-      if (header->force)
+      if (header->get_force())
        scrub_infop->dirfrag_stamps[*i].reset();
       else
        scrub_infop->dirfrag_stamps[*i];
@@ -4288,10 +4288,10 @@ void CInode::scrub_finished(MDSInternalContextBase **c) {
   *c = scrub_infop->on_finish;
   scrub_infop->on_finish = NULL;
 
-  if (scrub_infop->header->origin == this) {
+  if (scrub_infop->header->get_origin() == this) {
     // We are at the point that a tagging scrub was initiated
     LogChannelRef clog = mdcache->mds->clog;
-    clog->info() << "scrub complete with tag '" << scrub_infop->header->tag << "'";
+    clog->info() << "scrub complete with tag '" << scrub_infop->header->get_tag() << "'";
   }
 }
 
index 4f81c587f45a4327e86ef1f856a2ab708f65a2e1..b31d8879ac709bc170eaba13866a592fb7fa8425 100644 (file)
@@ -11856,7 +11856,7 @@ class C_MDS_EnqueueScrub : public Context
 public:
   ScrubHeaderRef header;
   C_MDS_EnqueueScrub(Formatter *f, Context *fin) :
-    formatter(f), on_finish(fin), header(new ScrubHeader()) {}
+    formatter(f), on_finish(fin), header(nullptr) {}
 
   Context *take_finisher() {
     Context *fin = on_finish;
@@ -11887,12 +11887,8 @@ void MDCache::enqueue_scrub(
   mdr->set_filepath(fp);
 
   C_MDS_EnqueueScrub *cs = new C_MDS_EnqueueScrub(f, fin);
-  ScrubHeaderRef &header = cs->header;
-  header->tag = tag;
-  header->force = force;
-  header->recursive = recursive;
-  header->repair = repair;
-  header->formatter = f;
+  cs->header = std::make_shared<ScrubHeader>(
+      tag, force, recursive, repair, f);
 
   mdr->internal_op_finish = cs;
   enqueue_scrub_work(mdr);
@@ -11923,11 +11919,11 @@ void MDCache::enqueue_scrub_work(MDRequestRef& mdr)
     in->scrub_info();
   }
 
-  header->origin = in;
+  header->set_origin(in);
 
   // only set completion context for non-recursive scrub, because we don't 
   // want to block asok caller on long running scrub
-  if (!header->recursive) {
+  if (!header->get_recursive()) {
     Context *fin = cs->take_finisher();
     mds->scrubstack->enqueue_inode_top(in, header,
                                       new MDSInternalContextWrapper(mds, fin));
index c5939304d4fd8db045348b14c11b0ec285af40dd..fc4a5a989eeecc88e23e1ab5bc4a908bfaf2bad3 100644 (file)
@@ -1,3 +1,17 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- 
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2016 Red Hat Inc
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation.  See file COPYING.
+ *
+ */
+
 
 #ifndef SCRUB_HEADER_H_
 #define SCRUB_HEADER_H_
@@ -10,14 +24,34 @@ class CInode;
  */
 class ScrubHeader {
 public:
-  CInode *origin;
-  std::string tag;
+  ScrubHeader(std::string tag_, bool force_, bool recursive_,
+              bool repair_, Formatter *f_)
+      : tag(tag_), force(force_), recursive(recursive_), repair(repair_),
+        formatter(f_), origin(nullptr)
+  {
+    assert(formatter != nullptr);
+  }
+
+  // Set after construction because it won't be known until we've
+  // started resolving path and locking
+  void set_origin(CInode *origin_) { origin = origin_; }
 
-  bool force;
-  bool recursive;
-  bool repair;
-  Formatter *formatter;
+  bool get_recursive() const { return recursive; }
+  bool get_repair() const { return repair; }
+  bool get_force() const { return force; }
+  const CInode *get_origin() const { return origin; }
+  const std::string &get_tag() const { return tag; }
+  Formatter &get_formatter() const { return *formatter; }
+
+protected:
+  const std::string tag;
+  const bool force;
+  const bool recursive;
+  const bool repair;
+  Formatter * const formatter;
+  CInode *origin;
 };
+
 typedef ceph::shared_ptr<ScrubHeader> ScrubHeaderRef;
 typedef ceph::shared_ptr<const ScrubHeader> ScrubHeaderRefConst;
 
index 7da1b4bb5093f4120fb95ff2e5bd006b4d86b15f..143fc1585024b260fc09dcd4b25ef3ae319495bb 100644 (file)
@@ -135,7 +135,7 @@ void ScrubStack::scrub_dir_inode(CInode *in,
 
   const ScrubHeaderRefConst& header = in->scrub_info()->header;
 
-  if (header->recursive) {
+  if (header->get_recursive()) {
     list<frag_t> scrubbing_frags;
     list<CDir*> scrubbing_cdirs;
     in->scrub_dirfrags_scrubbing(&scrubbing_frags);
@@ -390,13 +390,13 @@ void ScrubStack::_validate_inode_done(CInode *in, int r,
   MDSInternalContextBase *c = NULL;
   in->scrub_finished(&c);
 
-  if (!header->recursive && in == header->origin) {
+  if (!header->get_recursive() && in == header->get_origin()) {
     if (r >= 0) { // we got into the scrubbing dump it
-      result.dump(header->formatter);
+      result.dump(&(header->get_formatter()));
     } else { // we failed the lookup or something; dump ourselves
-      header->formatter->open_object_section("results");
-      header->formatter->dump_int("return_code", r);
-      header->formatter->close_section(); // results
+      header->get_formatter().open_object_section("results");
+      header->get_formatter().dump_int("return_code", r);
+      header->get_formatter().close_section(); // results
     }
   }
   if (c) {