From: Sage Weil Date: Thu, 19 Apr 2012 23:15:17 +0000 (-0700) Subject: objectcacher: implement Object::discard() X-Git-Tag: v0.46~22^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7232396598f4cd7c5fc25dcb46d54342f57c388e;p=ceph.git objectcacher: implement Object::discard() Discard a range of bytes from an object. Signed-off-by: Sage Weil --- diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc index 0d3e7e6602b9..25931dd83340 100644 --- a/src/osdc/ObjectCacher.cc +++ b/src/osdc/ObjectCacher.cc @@ -408,6 +408,40 @@ void ObjectCacher::Object::truncate(loff_t s) } } +void ObjectCacher::Object::discard(loff_t off, loff_t len) +{ + ldout(oc->cct, 10) << "discard " << *this << " " << off << "~" << len << dendl; + + map::iterator p = data.lower_bound(off); + if (p != data.begin() && + (p == data.end() || p->first > off)) { + p--; // might overlap! + if (p->first + p->second->length() <= off) + p++; // doesn't overlap. + } + + while (p != data.end()) { + BufferHead *bh = p->second; + if (bh->start() >= off + len) + break; + + // split bh at truncation point? + if (bh->start() < off) { + split(bh, off); + p++; + continue; + } + + assert(bh->start() >= off); + if (bh->end() > off + len) { + split(bh, off + len); + } + + p++; + oc->bh_remove(this, bh); + } +} + /*** ObjectCacher ***/ diff --git a/src/osdc/ObjectCacher.h b/src/osdc/ObjectCacher.h index 767f73c3abfd..800a8b7eecc7 100644 --- a/src/osdc/ObjectCacher.h +++ b/src/osdc/ObjectCacher.h @@ -249,7 +249,7 @@ class ObjectCacher { BufferHead *map_write(OSDWrite *wr); void truncate(loff_t s); - + void discard(loff_t off, loff_t len); };