From 3478c34019706692690707fe11b4203fd2895c35 Mon Sep 17 00:00:00 2001 From: sageweil Date: Tue, 17 Jul 2007 20:50:35 +0000 Subject: [PATCH] some osd fixes git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1520 29311d96-e01e-0410-9327-a35deaab8ce9 --- trunk/ceph/osd/OSD.cc | 48 +++++++++++++++++++-------------------- trunk/ceph/osd/OSD.h | 3 ++- trunk/ceph/osd/RAID4PG.cc | 14 ++++++------ 3 files changed, 33 insertions(+), 32 deletions(-) diff --git a/trunk/ceph/osd/OSD.cc b/trunk/ceph/osd/OSD.cc index 94b3e63f2d8f4..7ce38a8063d0f 100644 --- a/trunk/ceph/osd/OSD.cc +++ b/trunk/ceph/osd/OSD.cc @@ -370,13 +370,8 @@ int OSD::read_superblock() // ====================================================== // PG's -PG *OSD::_create_lock_pg(pg_t pgid, ObjectStore::Transaction& t) +PG *OSD::_open_lock_pg(pg_t pgid) { - dout(10) << "_create_lock_pg " << pgid << dendl; - - if (pg_map.count(pgid)) - dout(0) << "_create_lock_pg on " << pgid << ", already have " << *pg_map[pgid] << dendl; - // create PG *pg; if (pgid.is_rep()) @@ -396,6 +391,19 @@ PG *OSD::_create_lock_pg(pg_t pgid, ObjectStore::Transaction& t) pg->get(); // because it's in pg_map pg->get(); // because we're locking it + return pg; +} + +PG *OSD::_create_lock_pg(pg_t pgid, ObjectStore::Transaction& t) +{ + dout(10) << "_create_lock_pg " << pgid << dendl; + + if (pg_map.count(pgid)) + dout(0) << "_create_lock_pg on " << pgid << ", already have " << *pg_map[pgid] << dendl; + + // open + PG *pg = _open_lock_pg(pgid); + // create collection assert(!store->collection_exists(pgid)); t.create_collection(pgid); @@ -421,7 +429,7 @@ PG *OSD::_lock_pg(pg_t pgid) list& ls = pg_lock_waiters[pgid]; // this is commit, right? ls.push_back(&c); - while (pg_lock.count(pgid) || + while (pg_lock.count(pgid) && ls.front() != &c) c.Wait(osd_lock); @@ -457,6 +465,7 @@ void OSD::_unlock_pg(pg_t pgid) } else { // nobody waiting dout(15) << "unlock_pg " << pgid << dendl; + pg_lock.erase(pgid); } } @@ -510,16 +519,7 @@ void OSD::load_pgs() it != ls.end(); it++) { pg_t pgid = *it; - - PG *pg = 0; - if (pgid.is_rep()) - new ReplicatedPG(this, pgid); - else if (pgid.is_raid4()) - new RAID4PG(this, pgid); - else - assert(0); - pg_map[pgid] = pg; - pg->get(); + PG *pg = _open_lock_pg(pgid); // read pg info store->collection_getattr(pgid, "info", &pg->info, sizeof(pg->info)); @@ -533,6 +533,7 @@ void OSD::load_pgs() pg->set_role(role); dout(10) << "load_pgs loaded " << *pg << " " << pg->log << dendl; + pg->put_unlock(); } } @@ -999,8 +1000,7 @@ void OSD::handle_osd_map(MOSDMap *m) } dout(10) << "handle_osd_map got full map epoch " << p->first << dendl; - //t.write(oid, 0, p->second.length(), p->second); - store->write(oid, 0, p->second.length(), p->second, 0); + store->write(oid, 0, p->second.length(), p->second, 0); // store _outside_ transaction; activate_map reads it. if (p->first > superblock.newest_map) superblock.newest_map = p->first; @@ -1024,8 +1024,7 @@ void OSD::handle_osd_map(MOSDMap *m) } dout(10) << "handle_osd_map got incremental map epoch " << p->first << dendl; - //t.write(oid, 0, p->second.length(), p->second); - store->write(oid, 0, p->second.length(), p->second, 0); + store->write(oid, 0, p->second.length(), p->second, 0); // store _outside_ transaction; activate_map reads it. if (p->first > superblock.newest_map) superblock.newest_map = p->first; @@ -1044,17 +1043,18 @@ void OSD::handle_osd_map(MOSDMap *m) epoch_t cur = superblock.current_epoch; while (cur < superblock.newest_map) { - bufferlist bl; + dout(10) << "cur " << cur << " < newest " << superblock.newest_map << dendl; + if (m->incremental_maps.count(cur+1) || store->exists(get_inc_osdmap_object_name(cur+1))) { dout(10) << "handle_osd_map decoding inc map epoch " << cur+1 << dendl; bufferlist bl; if (m->incremental_maps.count(cur+1)) { - dout(10) << " using provided inc map" << endl; + dout(10) << " using provided inc map" << dendl; bl = m->incremental_maps[cur+1]; } else { - dout(10) << " using my locally stored inc map" << endl; + dout(10) << " using my locally stored inc map" << dendl; get_inc_map_bl(cur+1, bl); } diff --git a/trunk/ceph/osd/OSD.h b/trunk/ceph/osd/OSD.h index a63c0ab7a3e0d..fcaeeeed3a7a6 100644 --- a/trunk/ceph/osd/OSD.h +++ b/trunk/ceph/osd/OSD.h @@ -247,7 +247,8 @@ private: PG *_lock_pg(pg_t pgid); void _unlock_pg(pg_t pgid); - PG *_create_lock_pg(pg_t pg, ObjectStore::Transaction& t); // create new PG + PG *_open_lock_pg(pg_t pg); // create new PG (in memory) + PG *_create_lock_pg(pg_t pg, ObjectStore::Transaction& t); // create new PG bool _have_pg(pg_t pgid); void _remove_unlock_pg(PG *pg); // remove from store and memory diff --git a/trunk/ceph/osd/RAID4PG.cc b/trunk/ceph/osd/RAID4PG.cc index 48aa519a4ffbe..8190f60a19663 100644 --- a/trunk/ceph/osd/RAID4PG.cc +++ b/trunk/ceph/osd/RAID4PG.cc @@ -77,26 +77,26 @@ bool RAID4PG::is_missing_object(object_t oid) void RAID4PG::wait_for_missing_object(object_t oid, MOSDOp *op) { - assert(0); + //assert(0); } void RAID4PG::note_failed_osd(int o) { dout(10) << "note_failed_osd osd" << o << dendl; - assert(0); + //assert(0); } void RAID4PG::on_acker_change() { dout(10) << "on_acker_change" << dendl; - assert(0); + //assert(0); } void RAID4PG::on_role_change() { dout(10) << "on_role_change" << dendl; - assert(0); + //assert(0); } @@ -106,18 +106,18 @@ void RAID4PG::clean_up_local(ObjectStore::Transaction&) void RAID4PG::cancel_recovery() { - assert(0); + //assert(0); } bool RAID4PG::do_recovery() { - assert(0); + //assert(0); return false; } void RAID4PG::clean_replicas() { - assert(0); + //assert(0); } -- 2.39.5