From: Haomai Wang Date: Wed, 16 Jul 2014 06:34:22 +0000 (+0800) Subject: Wait tx state buffer in flush_set X-Git-Tag: v0.84~55^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5283cfee5b067a338e069980bbc3205a6766134d;p=ceph.git Wait tx state buffer in flush_set Signed-off-by: Haomai Wang --- diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc index b52de928a678..cb3c56456a8c 100644 --- a/src/osdc/ObjectCacher.cc +++ b/src/osdc/ObjectCacher.cc @@ -530,7 +530,7 @@ ObjectCacher::~ObjectCacher() assert(bh_lru_rest.lru_get_size() == 0); assert(bh_lru_dirty.lru_get_size() == 0); assert(ob_lru.lru_get_size() == 0); - assert(dirty_bh.empty()); + assert(dirty_or_tx_bh.empty()); } void ObjectCacher::perf_start() @@ -1616,8 +1616,8 @@ bool ObjectCacher::flush_set(ObjectSet *oset, Context *onfinish) set waitfor_commit; set::iterator next, it; - next = it = dirty_bh.begin(); - while (it != dirty_bh.end()) { + next = it = dirty_or_tx_bh.begin(); + while (it != dirty_or_tx_bh.end()) { next++; BufferHead *bh = *it; waitfor_commit.insert(bh->ob); @@ -2007,14 +2007,16 @@ void ObjectCacher::bh_set_state(BufferHead *bh, int s) if (s == BufferHead::STATE_DIRTY && bh->get_state() != BufferHead::STATE_DIRTY) { bh_lru_rest.lru_remove(bh); bh_lru_dirty.lru_insert_top(bh); - dirty_bh.insert(bh); - } - if (s != BufferHead::STATE_DIRTY && bh->get_state() == BufferHead::STATE_DIRTY) { + dirty_or_tx_bh.insert(bh); + } else if (s != BufferHead::STATE_DIRTY && bh->get_state() == BufferHead::STATE_DIRTY) { bh_lru_dirty.lru_remove(bh); bh_lru_rest.lru_insert_top(bh); - dirty_bh.erase(bh); - } - if (s != BufferHead::STATE_ERROR && bh->get_state() == BufferHead::STATE_ERROR) { + dirty_or_tx_bh.erase(bh); + } else if (s == BufferHead::STATE_TX && bh->get_state() != BufferHead::STATE_TX) { + dirty_or_tx_bh.insert(bh); + } else if (s != BufferHead::STATE_TX && bh->get_state() == BufferHead::STATE_TX) { + dirty_or_tx_bh.erase(bh); + } else if (s != BufferHead::STATE_ERROR && bh->get_state() == BufferHead::STATE_ERROR) { bh->error = 0; } @@ -2031,7 +2033,9 @@ void ObjectCacher::bh_add(Object *ob, BufferHead *bh) ob->add_bh(bh); if (bh->is_dirty()) { bh_lru_dirty.lru_insert_top(bh); - dirty_bh.insert(bh); + dirty_or_tx_bh.insert(bh); + } else if (bh->is_tx()) { + dirty_or_tx_bh.insert(bh); } else { bh_lru_rest.lru_insert_top(bh); } @@ -2045,7 +2049,9 @@ void ObjectCacher::bh_remove(Object *ob, BufferHead *bh) ob->remove_bh(bh); if (bh->is_dirty()) { bh_lru_dirty.lru_remove(bh); - dirty_bh.erase(bh); + dirty_or_tx_bh.erase(bh); + } else if (bh->is_tx()) { + dirty_or_tx_bh.insert(bh); } else { bh_lru_rest.lru_remove(bh); } diff --git a/src/osdc/ObjectCacher.h b/src/osdc/ObjectCacher.h index 9d9ab3fe90c9..ca16138fa2d0 100644 --- a/src/osdc/ObjectCacher.h +++ b/src/osdc/ObjectCacher.h @@ -343,7 +343,7 @@ class ObjectCacher { ceph_tid_t last_read_tid; - set dirty_bh; + set dirty_or_tx_bh; LRU bh_lru_dirty, bh_lru_rest; LRU ob_lru;