From: Yan, Zheng Date: Thu, 25 Jan 2018 04:08:47 +0000 (+0800) Subject: osdc/ObjectCacher: don't merge TX buffer heads X-Git-Tag: v12.2.3~12^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7756a44529dd27e0960393e098104c7c1808bb36;p=ceph.git osdc/ObjectCacher: don't merge TX buffer heads Signed-off-by: "Yan, Zheng" (cherry picked from commit 0b1e515d1c5dddf3c11eddbe6d53167d2fb6aaab) --- diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc index 7139318b9f2..ff1bf87b17c 100644 --- a/src/osdc/ObjectCacher.cc +++ b/src/osdc/ObjectCacher.cc @@ -157,9 +157,6 @@ ObjectCacher::BufferHead *ObjectCacher::Object::split(BufferHead *left, void ObjectCacher::Object::merge_left(BufferHead *left, BufferHead *right) { assert(oc->lock.is_locked()); - assert(left->end() == right->start()); - assert(left->get_state() == right->get_state()); - assert(left->can_merge_journal(right)); ldout(oc->cct, 10) << "merge_left " << *left << " + " << *right << dendl; if (left->get_journal_tid() == 0) { @@ -196,6 +193,17 @@ void ObjectCacher::Object::merge_left(BufferHead *left, BufferHead *right) ldout(oc->cct, 10) << "merge_left result " << *left << dendl; } +bool ObjectCacher::Object::can_merge_bh(BufferHead *left, BufferHead *right) +{ + if (left->end() != right->start() || + left->get_state() != right->get_state() || + !left->can_merge_journal(right)) + return false; + if (left->is_tx() && left->last_write_tid != right->last_write_tid) + return false; + return true; +} + void ObjectCacher::Object::try_merge_bh(BufferHead *bh) { assert(oc->lock.is_locked()); @@ -210,9 +218,7 @@ void ObjectCacher::Object::try_merge_bh(BufferHead *bh) assert(p->second == bh); if (p != data.begin()) { --p; - if (p->second->end() == bh->start() && - p->second->get_state() == bh->get_state() && - p->second->can_merge_journal(bh)) { + if (can_merge_bh(p->second, bh)) { merge_left(p->second, bh); bh = p->second; } else { @@ -222,10 +228,7 @@ void ObjectCacher::Object::try_merge_bh(BufferHead *bh) // to the right? assert(p->second == bh); ++p; - if (p != data.end() && - p->second->start() == bh->end() && - p->second->get_state() == bh->get_state() && - p->second->can_merge_journal(bh)) + if (p != data.end() && can_merge_bh(bh, p->second)) merge_left(bh, p->second); } @@ -1152,12 +1155,6 @@ void ObjectCacher::bh_write_commit(int64_t poolid, sobject_t oid, if (bh->start() >= start+(loff_t)length) break; - if (bh->start() < start && - bh->end() > start+(loff_t)length) { - ldout(cct, 20) << "bh_write_commit skipping " << *bh << dendl; - continue; - } - // make sure bh is tx if (!bh->is_tx()) { ldout(cct, 10) << "bh_write_commit skipping non-tx " << *bh << dendl; @@ -1171,6 +1168,10 @@ void ObjectCacher::bh_write_commit(int64_t poolid, sobject_t oid, continue; } + // we don't merge tx buffers. tx buffer should be within the range + assert(bh->start() >= start); + assert(bh->end() <= start+(loff_t)length); + if (r >= 0) { // ok! mark bh clean and error-free mark_clean(bh); diff --git a/src/osdc/ObjectCacher.h b/src/osdc/ObjectCacher.h index 58b3e7aafee..01ab8829b88 100644 --- a/src/osdc/ObjectCacher.h +++ b/src/osdc/ObjectCacher.h @@ -341,6 +341,7 @@ class ObjectCacher { // mid-level BufferHead *split(BufferHead *bh, loff_t off); void merge_left(BufferHead *left, BufferHead *right); + bool can_merge_bh(BufferHead *left, BufferHead *right); void try_merge_bh(BufferHead *bh); bool is_cached(loff_t off, loff_t len) const;