From: Sage Weil Date: Sat, 17 May 2008 04:23:33 +0000 (-0700) Subject: osd: read_superblock cleanup. purge_strays() is generic X-Git-Tag: v0.3~209^2~35 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4fc0345c68c7067adcc4815dd957655a2b1f29ee;p=ceph.git osd: read_superblock cleanup. purge_strays() is generic --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index c640a57b62a3..c375994fdb66 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -321,7 +321,11 @@ int OSD::init() dout(2) << "boot" << dendl; // read superblock - read_superblock(); + if (read_superblock() < 0) { + store->umount(); + delete store; + return -1; + } // load up pgs (as they previously existed) load_pgs(); @@ -451,14 +455,19 @@ int OSD::read_superblock() bufferlist bl; int r = store->read(OSD_SUPERBLOCK_POBJECT, 0, sizeof(superblock), bl); if (bl.length() != sizeof(superblock)) { - dout(10) << "read_superblock failed, r = " << r << ", i got " << bl.length() << " bytes, not " << sizeof(superblock) << dendl; + derr(0) << "read_superblock failed, r = " << r + << ", i got " << bl.length() << " bytes, not " << sizeof(superblock) << dendl; return -1; } bl.copy(0, sizeof(superblock), (char*)&superblock); dout(10) << "read_superblock " << superblock << dendl; - assert(whoami == superblock.whoami); // fixme! + if (whoami != superblock.whoami) { + derr(0) << "read_superblock superblock says osd" << superblock.whoami + << ", but i (think i) am osd" << whoami << dendl; + return -1; + } // load up "current" osdmap assert(!osdmap); @@ -2187,18 +2196,18 @@ void OSD::handle_pg_notify(MOSDPGNotify *m) dout(10) << *pg << " osd" << from << " " << *it << dendl; pg->info.history.merge(it->history); + // save info. + bool had = pg->peer_info.count(from); + pg->peer_info[from] = *it; + // stray? bool acting = pg->is_acting(from); - if (!acting && (*it).last_update > eversion_t()) { // FIXME is this right? + if (!acting) { dout(10) << *pg << " osd" << from << " has stray content: " << *it << dendl; pg->stray_set.insert(from); pg->state_clear(PG_STATE_CLEAN); } - // save info. - bool had = pg->peer_info.count(from); - pg->peer_info[from] = *it; - if (had) { if (pg->is_active() && (*it).is_uptodate() && diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 2868d36108d9..3c09eeba0760 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -1060,6 +1060,27 @@ void PG::finish_recovery() } +void PG::purge_strays() +{ + dout(10) << "purge_strays " << stray_set << dendl; + + for (set::iterator p = stray_set.begin(); + p != stray_set.end(); + p++) { + dout(10) << "sending PGRemove to osd" << *p << dendl; + set ls; + ls.insert(info.pgid); + MOSDPGRemove *m = new MOSDPGRemove(osd->osdmap->get_epoch(), ls); + osd->messenger->send_message(m, osd->osdmap->get_inst(*p)); + + peer_info.erase(*p); + } + + stray_set.clear(); +} + + + void PG::update_stats() { diff --git a/src/osd/PG.h b/src/osd/PG.h index 1ec55077b045..f20ef80ceae0 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -598,7 +598,8 @@ public: virtual void cancel_recovery() = 0; virtual bool do_recovery() = 0; - virtual void purge_strays() = 0; + + void purge_strays(); void finish_recovery(); diff --git a/src/osd/RAID4PG.cc b/src/osd/RAID4PG.cc index 84a9f2c2e418..2f2415ec8220 100644 --- a/src/osd/RAID4PG.cc +++ b/src/osd/RAID4PG.cc @@ -158,10 +158,5 @@ bool RAID4PG::do_recovery() return false; } -void RAID4PG::purge_strays() -{ - //assert(0); -} - diff --git a/src/osd/RAID4PG.h b/src/osd/RAID4PG.h index 010371a25fd9..112ab10d1207 100644 --- a/src/osd/RAID4PG.h +++ b/src/osd/RAID4PG.h @@ -44,7 +44,6 @@ protected: void clean_up_local(ObjectStore::Transaction& t); void cancel_recovery(); bool do_recovery(); - void purge_strays(); public: diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 4c78cf75f821..90ed258f386c 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -1784,23 +1784,6 @@ void ReplicatedPG::do_peer_recovery() } } -void ReplicatedPG::purge_strays() -{ - dout(10) << "purge_strays " << stray_set << dendl; - - for (set::iterator p = stray_set.begin(); - p != stray_set.end(); - p++) { - dout(10) << "sending PGRemove to osd" << *p << dendl; - set ls; - ls.insert(info.pgid); - MOSDPGRemove *m = new MOSDPGRemove(osd->osdmap->get_epoch(), ls); - osd->messenger->send_message(m, osd->osdmap->get_inst(*p)); - } - - stray_set.clear(); -} - /** clean_up_local diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index afec8ad5099c..848f3715f941 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -117,8 +117,6 @@ protected: bool do_recovery(); void do_peer_recovery(); - void purge_strays(); - void op_read(MOSDOp *op); void op_modify(MOSDOp *op);