]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-objectstore-tool, osd: Filter the pg_log_t for objects no longer in pg
authorDavid Zafman <dzafman@redhat.com>
Thu, 26 Mar 2015 22:53:42 +0000 (15:53 -0700)
committerDavid Zafman <dzafman@redhat.com>
Sat, 28 Mar 2015 01:23:08 +0000 (18:23 -0700)
Fixes: #11184
Signed-off-by: David Zafman <dzafman@redhat.com>
src/osd/osd_types.cc
src/osd/osd_types.h
src/tools/ceph_objectstore_tool.cc

index 4efab9f70bbbd716ee170e1b01fecf8280fe480e..e5954c06d4e0abc2870fb5f31d93d30b70fc07a5 100644 (file)
@@ -3091,6 +3091,36 @@ ostream& operator<<(ostream& out, const pg_log_entry_t& e)
 
 // -- pg_log_t --
 
+// out: pg_log_t that only has entries that apply to import_pgid using curmap
+// reject: Entries rejected from "in" are in the reject.log.  Other fields not set.
+void pg_log_t::filter_log(spg_t import_pgid, const OSDMap &curmap,
+  const string &hit_set_namespace, const pg_log_t &in,
+  pg_log_t &out, pg_log_t &reject)
+{
+  out = in;
+  out.log.clear();
+  reject.log.clear();
+
+  for (list<pg_log_entry_t>::const_iterator i = in.log.begin();
+       i != in.log.end(); ++i) {
+
+    if (i->soid.nspace != hit_set_namespace) {
+      object_t oid = i->soid.oid;
+      object_locator_t loc(i->soid);
+      pg_t raw_pgid = curmap.object_locator_to_pg(oid, loc);
+      pg_t pgid = curmap.raw_pg_to_pg(raw_pgid);
+
+      if (import_pgid.pgid == pgid) {
+        out.log.push_back(*i);
+      } else {
+        reject.log.push_back(*i);
+      }
+    } else {
+      out.log.push_back(*i);
+    }
+  }
+}
+
 void pg_log_t::encode(bufferlist& bl) const
 {
   ENCODE_START(6, 3, bl);
index d2e2345ed962e040d18f1841fea80b7b0f42d00e..531f1638c4393e8443a8fc56a17412ea28da8883 100644 (file)
@@ -2287,6 +2287,10 @@ struct pg_log_t {
     }      
   }
 
+  static void filter_log(spg_t import_pgid, const OSDMap &curmap,
+    const string &hit_set_namespace, const pg_log_t &in,
+    pg_log_t &out, pg_log_t &reject);
+
   /**
    * copy entries from the tail of another pg_log_t
    *
index c2944293efd85bd62b70e5b0ceab1685b8267a7e..3388210afa6ed4671065330dd011e05e03f31410 100644 (file)
@@ -1852,8 +1852,20 @@ int do_import(ObjectStore *store, OSDSuperblock& sb)
     return EFAULT;
   }
 
+  pg_log_t newlog, reject;
+  pg_log_t::filter_log(pgid, curmap, g_ceph_context->_conf->osd_hit_set_namespace,
+    ms.log, newlog, reject);
+  if (debug) {
+    for (list<pg_log_entry_t>::iterator i = newlog.log.begin();
+         i != newlog.log.end(); ++i)
+      cerr << "Keeping log entry " << *i << std::endl;
+    for (list<pg_log_entry_t>::iterator i = reject.log.begin();
+         i != reject.log.end(); ++i)
+      cerr << "Skipping log entry " << *i << std::endl;
+  }
+
   t = new ObjectStore::Transaction;
-  ret = write_pg(*t, ms.map_epoch, ms.info, ms.log, ms.past_intervals);
+  ret = write_pg(*t, ms.map_epoch, ms.info, newlog, ms.past_intervals);
   if (ret) return ret;
 
   // done, clear removal flag