From 6593c4f170c4a0833ba19604e7e7d4097092cea4 Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Thu, 30 Jun 2016 15:47:19 +0800 Subject: [PATCH 1/6] os/bluestore: fix incorrect skipping of partial hole reading Signed-off-by: xie xingguo --- src/os/bluestore/BlueStore.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index e3854b51091f8..72a3a2210a9b4 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -3421,7 +3421,6 @@ int BlueStore::_do_read( << std::dec << dendl; pos += hole; left -= hole; - continue; } Blob *bptr = c->get_blob(o, lp->second.blob); if (bptr == nullptr) { From 34028c204d33c275ddd45f5c374144b9e4a00c09 Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Thu, 30 Jun 2016 13:51:42 +0800 Subject: [PATCH 2/6] os/bluestore: fix potential access violation Signed-off-by: xie xingguo --- src/os/bluestore/BlueStore.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 72a3a2210a9b4..52cb08f9d61a3 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -2738,6 +2738,7 @@ int BlueStore::_fsck_verify_blob_map( derr << " " << what << " blob " << b.id << " has no lextent refs" << dendl; ++errors; + continue; } if (pv->second != b.blob.ref_map) { derr << " " << what << " blob " << b.id From 9ec2adda94fbfcb9b4e004ef903ffa8d35cc0300 Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Wed, 29 Jun 2016 16:07:07 +0800 Subject: [PATCH 3/6] os/bluestore: kill unused buffer state "read" Signed-off-by: xie xingguo --- src/os/bluestore/BlueStore.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index f65024f7e86ca..1cad9151789fd 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -114,14 +114,12 @@ class BlueStore : public ObjectStore, STATE_EMPTY, ///< empty buffer -- used for cache history STATE_CLEAN, ///< clean data that is up to date STATE_WRITING, ///< data that is being written (io not yet complete) - STATE_READING, }; static const char *get_state_name(int s) { switch (s) { case STATE_EMPTY: return "empty"; case STATE_CLEAN: return "clean"; case STATE_WRITING: return "writing"; - case STATE_READING: return "reading"; default: return "???"; } } @@ -164,9 +162,6 @@ class BlueStore : public ObjectStore, bool is_writing() const { return state == STATE_WRITING; } - bool is_reading() const { - return state == STATE_READING; - } uint64_t end() const { return offset + length; From f77d49e09c8cbb25a48037ab083904aaef89c0c2 Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Wed, 29 Jun 2016 16:53:26 +0800 Subject: [PATCH 4/6] os/bluestore: merge _rm_buffer() to reduce code redundancy Signed-off-by: xie xingguo --- src/os/bluestore/BlueStore.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 52cb08f9d61a3..03f88ec2003be 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -882,11 +882,10 @@ int BlueStore::BufferSpace::_discard(uint64_t offset, uint64_t length) bufferlist bl; bl.substr_of(b->data, b->length - keep, keep); _add_buffer(new Buffer(this, b->state, b->seq, end, bl), 0, b); - _rm_buffer(i); } else { _add_buffer(new Buffer(this, b->state, b->seq, end, keep), 0, b); - _rm_buffer(i); } + _rm_buffer(i); cache->_audit("discard end 2"); break; } From b812482a1e0233a7950143e5317ab49a2d7a0a0d Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Thu, 30 Jun 2016 11:01:18 +0800 Subject: [PATCH 5/6] os/bluestore: remove duplicated initialization of max_alloc_size _set_alloc_sizes() already did this. Signed-off-by: xie xingguo --- src/os/bluestore/BlueStore.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 03f88ec2003be..54cf1e23b2ab0 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -1617,7 +1617,6 @@ int BlueStore::_open_bdev(bool create) assert(block_size == 1u << block_size_order); _set_alloc_sizes(); - max_alloc_size = g_conf->bluestore_max_alloc_size; return 0; fail_close: From a6fb43363f3e6f6d6a84f61580501b32daac7249 Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Thu, 30 Jun 2016 19:31:45 +0800 Subject: [PATCH 6/6] os/bluestore: check against if tail_pad is already 0 So we may skip the potential has_any_lextents() check. Signed-off-by: xie xingguo --- src/os/bluestore/BlueStore.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 54cf1e23b2ab0..f80795e1738cb 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -5639,7 +5639,7 @@ void BlueStore::_do_write_small( } uint64_t tail_pad = ROUND_UP_TO(offset + length, chunk_size) - (offset + length); - if (o->onode.has_any_lextents(offset + length, tail_pad)) { + if (tail_pad && o->onode.has_any_lextents(offset + length, tail_pad)) { tail_pad = 0; } bufferlist padded = bl;