From 7c05c1fe310fee0cc8f98bc5e25334cafaa918b8 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 13 Oct 2011 12:57:54 -0700 Subject: [PATCH] osd: simplify share_pg_log Use Log::copy_after(). Drop the useless argument. Strip out the broken LOST logic. Signed-off-by: Sage Weil --- src/osd/PG.cc | 48 ++++++++++------------------------------- src/osd/PG.h | 4 +++- src/osd/ReplicatedPG.cc | 2 +- 3 files changed, 15 insertions(+), 39 deletions(-) diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 1908c4adb924a..cf8c127436959 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -3325,17 +3325,13 @@ void PG::share_pg_info() } /* - * Share some of this PG's log with some replicas. - * - * The log will be shared from the current version (last_update) back to - * 'oldver.' + * Share a new segment of this PG's log with some replicas, after PG is active. * * Updates peer_missing and peer_info. */ -void PG::share_pg_log(const eversion_t &oldver) +void PG::share_pg_log() { dout(10) << __func__ << dendl; - assert(is_primary()); vector::const_iterator a = acting.begin(); @@ -3343,41 +3339,19 @@ void PG::share_pg_log(const eversion_t &oldver) vector::const_iterator end = acting.end(); while (++a != end) { int peer(*a); + PG::Missing& pmissing(peer_missing[peer]); + PG::Info& pinfo(peer_info[peer]); + MOSDPGLog *m = new MOSDPGLog(info.last_update.epoch, info); - m->log.head = log.head; - m->log.tail = log.tail; - for (list::const_reverse_iterator i = log.log.rbegin(); - i != log.log.rend(); - ++i) { - if (i->version <= oldver) { - m->log.tail = i->version; - break; - } - const Log::Entry &entry(*i); - switch (entry.op) { - case Log::Entry::LOST_MARK: { - PG::Missing& pmissing(peer_missing[peer]); - pmissing.add(entry.soid, entry.version, eversion_t()); - dout(20) << " peer osd." << peer << " now missing " << entry.soid - << " v" << entry.version << " (lost)" << dendl; - break; - } - default: { - // To do this right, you need to figure out what impact this log - // entry has on the peer missing and the peer info - assert(0); - break; - } - } + m->log.copy_after(log, pinfo.last_update); - m->log.log.push_front(*i); + for (list::const_iterator i = m->log.log.begin(); + i != m->log.log.end(); + ++i) { + pmissing.add_next_event(*i, pinfo); } - PG::Info& pinfo(peer_info[peer]); - pinfo.last_update = log.head; - // shouldn't move pinfo.log.tail - // no change in pinfo.last_complete + pinfo.last_update = m->log.head; - m->missing = missing; osd->cluster_messenger->send_message(m, osd->osdmap->get_cluster_inst(peer)); } } diff --git a/src/osd/PG.h b/src/osd/PG.h index 59792eb0756ac..0a06cf7faf3ea 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -1632,8 +1632,10 @@ public: void queue_snap_trim(); bool queue_scrub(); + /// share pg info after a pg is active void share_pg_info(); - void share_pg_log(const eversion_t &oldver); + /// share new pg log entries after a pg is active + void share_pg_log(); void start_peering_interval(const OSDMap *lastmap, const vector& newup, diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 7ff461fe3442d..124a91fe5cc0d 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -4542,7 +4542,7 @@ void ReplicatedPG::mark_all_unfound_lost() // Send out the PG log to all replicas // So that they know what is lost - share_pg_log(old_last_update); + share_pg_log(); // queue ourselves so that we push the (now-lost) object_infos to replicas. osd->queue_for_recovery(this); -- 2.39.5