From: Yan, Zheng Date: Sat, 19 Sep 2015 13:02:13 +0000 (+0800) Subject: objectcacher: sort dirty_or_tx_bh in ObjectSet/Object/offset order X-Git-Tag: v10.0.3~120^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=428a1f31083a600f73181b5260e989774ef3c967;p=ceph.git objectcacher: sort dirty_or_tx_bh in ObjectSet/Object/offset order so we can find dirty buffer heads in given a ObjectSet easily. Signed-off-by: Yan, Zheng --- diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc index 745dbe787537..e358ed73989a 100644 --- a/src/osdc/ObjectCacher.cc +++ b/src/osdc/ObjectCacher.cc @@ -1825,7 +1825,7 @@ bool ObjectCacher::flush_set(ObjectSet *oset, Context *onfinish) C_GatherBuilder gather(cct); set waitfor_commit; - set::iterator next, it; + set::iterator next, it; next = it = dirty_or_tx_bh.begin(); while (it != dirty_or_tx_bh.end()) { ++next; diff --git a/src/osdc/ObjectCacher.h b/src/osdc/ObjectCacher.h index 841ee1fd2e82..aa9438b8ebbc 100644 --- a/src/osdc/ObjectCacher.h +++ b/src/osdc/ObjectCacher.h @@ -205,6 +205,22 @@ class ObjectCacher { return (get_journal_tid() == 0 || bh->get_journal_tid() == 0 || get_journal_tid() == bh->get_journal_tid()); } + + struct ptr_lt { + bool operator()(const BufferHead* l, const BufferHead* r) const { + const Object *lob = l->ob; + const Object *rob = r->ob; + const ObjectSet *loset = lob->oset; + const ObjectSet *roset = rob->oset; + if (loset != roset) + return loset < roset; + if (lob != rob) + return lob < rob; + if (l->start() != r->start()) + return l->start() < r->start(); + return l < r; + } + }; }; // ******* Object ********* @@ -397,7 +413,7 @@ class ObjectCacher { ceph_tid_t last_read_tid; - set dirty_or_tx_bh; + set dirty_or_tx_bh; LRU bh_lru_dirty, bh_lru_rest; LRU ob_lru;