]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
*** empty log message ***
authorsage <sage@29311d96-e01e-0410-9327-a35deaab8ce9>
Tue, 8 Aug 2006 21:50:31 +0000 (21:50 +0000)
committersage <sage@29311d96-e01e-0410-9327-a35deaab8ce9>
Tue, 8 Aug 2006 21:50:31 +0000 (21:50 +0000)
git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@790 29311d96-e01e-0410-9327-a35deaab8ce9

ceph/TODO
ceph/osd/PG.cc
ceph/osdc/ObjectCacher.cc
ceph/osdc/ObjectCacher.h

index 4368cdefc36c26d55e3a51c82334a8b9f2d989ac..d19be41ff7a47c9c860fe02c0c03d7a39b6c8b81 100644 (file)
--- a/ceph/TODO
+++ b/ceph/TODO
@@ -97,8 +97,8 @@ osdmonitor
 objecter
 
 objectcacher
+- ocacher flushing
 - ocacher caps transitions vs locks
-- ocacher flushing, pin Objects* while locks held
 - test read locks
 
 
index a2c95ca085373b0a2cc8df2e770304c3ce098956..b7e2e566782b4b154280197e7d041e9fc1532ea9 100644 (file)
@@ -688,13 +688,12 @@ void PG::activate(ObjectStore::Transaction& t)
   if (!replay_queue.empty()) {
        eversion_t c = info.last_update;
        list<Message*> replay;
-       list<Message*> after;
        for (map<eversion_t,MOSDOp*>::iterator p = replay_queue.begin();
                 p != replay_queue.end();
                 p++) {
          if (p->first <= info.last_update) {
                dout(10) << "activate will WRNOOP " << p->first << " " << *p->second << endl;
-               after.push_back(p->second);
+               replay.push_back(p->second);
                continue;
          }
          if (p->first.version != c.version+1) {
@@ -709,7 +708,6 @@ void PG::activate(ObjectStore::Transaction& t)
        }
        replay_queue.clear();
        osd->take_waiters(replay);
-       osd->take_waiters(after);
   }
 
   // waiters
index 31106e126ed8aa2997e3be866c01e40f7ef0623f..e7da58a38a617367d2bcc3d96db4e71e1223bad2 100644 (file)
@@ -449,6 +449,9 @@ void ObjectCacher::lock_ack(list<object_t>& oids, tid_t tid)
          ob->last_ack_tid = tid;
          
          finish_contexts(ls);
+
+         if (ob->can_close())
+               close_object(ob);
        } else {
          dout(10) << "lock_ack " << *ob 
                           << " tid " << tid << " obsolete" << endl;
@@ -570,7 +573,7 @@ void ObjectCacher::trim(off_t max)
        bh_remove(ob, bh);
        delete bh;
        
-       if (ob->is_empty()) {
+       if (ob->can_close()) {
          dout(10) << "trim trimming " << *ob << endl;
          close_object(ob);
        }
index 557d9ec019d1485568b310e9f2dab534912b6459..13d4a61e89329f06b64599a0ae712c80968440cf 100644 (file)
@@ -134,6 +134,9 @@ class ObjectCacher {
        object_t get_oid() { return oid; }
        inodeno_t get_ino() { return ino; }
 
+       bool can_close() {
+         return data.empty() && lock_state == LOCK_NONE;
+       }
 
        // bh
        void add_bh(BufferHead *bh) {
@@ -203,6 +206,9 @@ class ObjectCacher {
        return o;
   }
   void close_object(Object *ob) {
+       assert(ob->can_close());
+
+       // ok!
        objects.erase(ob->get_oid());
        objects_by_ino[ob->get_ino()].erase(ob);
        if (objects_by_ino[ob->get_ino()].empty())