From 85690d65631e66cf8d198bb2f38eef4d03d03783 Mon Sep 17 00:00:00 2001 From: sageweil Date: Mon, 13 Aug 2007 22:45:38 +0000 Subject: [PATCH] objectcacher bugfixes, better bh merging git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1630 29311d96-e01e-0410-9327-a35deaab8ce9 --- branches/sage/mds/osdc/ObjectCacher.cc | 54 ++++++++++++++++---------- branches/sage/mds/osdc/ObjectCacher.h | 5 ++- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/branches/sage/mds/osdc/ObjectCacher.cc b/branches/sage/mds/osdc/ObjectCacher.cc index 7f5bc439c6bca..9ec3df910dd08 100644 --- a/branches/sage/mds/osdc/ObjectCacher.cc +++ b/branches/sage/mds/osdc/ObjectCacher.cc @@ -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::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 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::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; diff --git a/branches/sage/mds/osdc/ObjectCacher.h b/branches/sage/mds/osdc/ObjectCacher.h index 054953e4670cc..f1d057beef99c 100644 --- a/branches/sage/mds/osdc/ObjectCacher.h +++ b/branches/sage/mds/osdc/ObjectCacher.h @@ -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& hits, @@ -193,7 +193,8 @@ class ObjectCacher { map& rx); BufferHead *map_write(Objecter::OSDWrite *wr); - void truncate(off_t s); + void truncate(off_t s); + }; // ******* ObjectCacher ********* -- 2.39.5