]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
some osd fixes
authorsageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Tue, 17 Jul 2007 20:50:35 +0000 (20:50 +0000)
committersageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Tue, 17 Jul 2007 20:50:35 +0000 (20:50 +0000)
git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1520 29311d96-e01e-0410-9327-a35deaab8ce9

trunk/ceph/osd/OSD.cc
trunk/ceph/osd/OSD.h
trunk/ceph/osd/RAID4PG.cc

index 94b3e63f2d8f442bf9c756c970588a999761179e..7ce38a8063d0f0f780a3d9e46be34f1e43cb0844 100644 (file)
@@ -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<Cond*>& 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);
       }
 
index a63c0ab7a3e0d96732893683b6a55e35533000aa..fcaeeeed3a7a6849fcc5eea6a2f86bc5cb86abbd 100644 (file)
@@ -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
 
index 48aa519a4ffbe9243f1ce5f24bc977424a75cf29..8190f60a19663788096cd91cd336a11e97e77bb4 100644 (file)
@@ -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);
 }