From: Sage Weil Date: Wed, 24 Oct 2012 19:48:02 +0000 (-0700) Subject: osdc/ObjectCacher: refresh iterator in read apply loop X-Git-Tag: v0.55~130^2~55^2^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f3db940f055056dc5427067605f7447511d41671;p=ceph.git osdc/ObjectCacher: refresh iterator in read apply loop The p iterator points to the next bh, but try_merge_bh() at the end of the loop might merge that into our result and invalidate the iterator. Fix this by repeating the lookup on each pass through the loop. Signed-off-by: Sage Weil --- diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc index 803bb4c652d6..218d9dbd2f96 100644 --- a/src/osdc/ObjectCacher.cc +++ b/src/osdc/ObjectCacher.cc @@ -564,10 +564,13 @@ void ObjectCacher::bh_read_finish(int64_t poolid, sobject_t oid, loff_t start, // apply to bh's! loff_t opos = start; - map::iterator p = ob->data.lower_bound(opos); - - while (p != ob->data.end() && - opos < start+(loff_t)length) { + while (true) { + map::iterator p = ob->data.lower_bound(opos); + if (p == ob->data.end()) + break; + if (opos >= start+(loff_t)length) + break; + BufferHead *bh = p->second; if (bh->start() > opos) {