]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
objectcacher bugfixes, better bh merging
authorsageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Mon, 13 Aug 2007 22:45:38 +0000 (22:45 +0000)
committersageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Mon, 13 Aug 2007 22:45:38 +0000 (22:45 +0000)
git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1630 29311d96-e01e-0410-9327-a35deaab8ce9

branches/sage/mds/osdc/ObjectCacher.cc
branches/sage/mds/osdc/ObjectCacher.h

index 7f5bc439c6bca5ecc24d727d0a8f7328dfe09833..9ec3df910dd084b467c5aa68cbdc18dc9cd12f1a 100644 (file)
@@ -98,6 +98,30 @@ void ObjectCacher::Object::merge_left(BufferHead *left, BufferHead *right)
   dout(10) << "merge_left result " << *left << endl;
 }
 
+void ObjectCacher::Object::try_merge_bh(BufferHead *bh)
+{
+  dout(10) << "try_merge_bh " << *bh << endl;
+
+  // to the left?
+  map<off_t,BufferHead*>::iterator p = data.find(bh->start());
+  assert(p->second == bh);
+  if (p != data.begin()) {
+    p--;
+    if (p->second->end() == bh->start() &&
+       p->second->get_state() == bh->get_state()) {
+      merge_left(p->second, bh);
+      bh = p->second;
+    } else 
+      p++;
+  }
+  // to the right?
+  assert(p->second == bh);
+  p++;
+  if (p != data.end() &&
+      p->second->start() == bh->end() &&
+      p->second->get_state() == bh->get_state()) 
+    merge_left(bh, p->second);
+}
 
 
 /*
@@ -340,6 +364,9 @@ void ObjectCacher::Object::truncate(off_t s)
 }
 
 
+
+
+
 /*** ObjectCacher ***/
 
 #undef dout
@@ -436,7 +463,7 @@ void ObjectCacher::bh_read_finish(object_t oid, off_t start, size_t length, buff
       
       opos = bh->end();
       p++;
-      
+
       // finishers?
       // called with lock held.
       list<Context*> ls;
@@ -446,6 +473,9 @@ void ObjectCacher::bh_read_finish(object_t oid, off_t start, size_t length, buff
         ls.splice(ls.end(), p->second);
       bh->waitfor_read.clear();
       finish_contexts(ls);
+
+      // clean up?
+      ob->try_merge_bh(bh);
     }
   }
   //lock.Unlock();
@@ -870,30 +900,12 @@ int ObjectCacher::writex(Objecter::OSDWrite *wr, inodeno_t ino)
       opos += f_it->second;
     }
 
-    // it's dirty.
+    // ok, now bh is dirty.
     mark_dirty(bh);
     touch_bh(bh);
     bh->last_write = now;
 
-    // combine with left?
-    map<off_t,BufferHead*>::iterator p = o->data.find(bh->start());
-    assert(p->second == bh);
-    if (p != o->data.begin()) {
-      p--;
-      if (p->second->is_dirty() &&
-         p->second->end() == bh->start()) {
-        o->merge_left(p->second, bh);
-        bh = p->second;
-      } else 
-       p++;
-    }
-    // combine to the right?
-    assert(p->second == bh);
-    p++;
-    if (p != o->data.end() &&
-       !p->second->is_dirty() &&
-       p->second->start() > bh->end()) 
-      o->merge_left(bh, p->second);
+    o->try_merge_bh(bh);
   }
 
   delete wr;
index 054953e4670cc41481462cf6d680aaa56a23af06..f1d057beef99c82743ddfdd650fa0f1dc33a0814 100644 (file)
@@ -185,7 +185,7 @@ class ObjectCacher {
     // mid-level
     BufferHead *split(BufferHead *bh, off_t off);
     void merge_left(BufferHead *left, BufferHead *right);
-    void merge_right(BufferHead *left, BufferHead *right);
+    void try_merge_bh(BufferHead *bh);
 
     int map_read(Objecter::OSDRead *rd,
                  map<off_t, BufferHead*>& hits,
@@ -193,7 +193,8 @@ class ObjectCacher {
                  map<off_t, BufferHead*>& rx);
     BufferHead *map_write(Objecter::OSDWrite *wr);
     
-       void truncate(off_t s);
+    void truncate(off_t s);
+
   };
   
   // ******* ObjectCacher *********