From 0b1e515d1c5dddf3c11eddbe6d53167d2fb6aaab Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Thu, 25 Jan 2018 12:08:47 +0800 Subject: [PATCH] osdc/ObjectCacher: don't merge TX buffer heads Signed-off-by: "Yan, Zheng" --- src/osdc/ObjectCacher.cc | 33 +++++++++++++++++---------------- src/osdc/ObjectCacher.h | 1 + 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc index 3f549f96631c8..e9040c9a0aa05 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 58b3e7aafeea3..01ab8829b88ac 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; -- 2.39.5