From c751191f65e58c679617b859bc5272e89afd2a21 Mon Sep 17 00:00:00 2001 From: David Zafman Date: Thu, 26 Mar 2015 15:53:42 -0700 Subject: [PATCH] ceph-objectstore-tool, osd: Filter the pg_log_t for objects no longer in pg Fixes: #11184 Signed-off-by: David Zafman --- src/osd/osd_types.cc | 30 ++++++++++++++++++++++++++++++ src/osd/osd_types.h | 4 ++++ src/tools/ceph_objectstore_tool.cc | 14 +++++++++++++- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 4efab9f70bbbd..e5954c06d4e0a 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -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::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); diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index d2e2345ed962e..531f1638c4393 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -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 * diff --git a/src/tools/ceph_objectstore_tool.cc b/src/tools/ceph_objectstore_tool.cc index c2944293efd85..3388210afa6ed 100644 --- a/src/tools/ceph_objectstore_tool.cc +++ b/src/tools/ceph_objectstore_tool.cc @@ -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::iterator i = newlog.log.begin(); + i != newlog.log.end(); ++i) + cerr << "Keeping log entry " << *i << std::endl; + for (list::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 -- 2.39.5