From 084ac4b9500d896deb4ed1a6b7b1ffd54b14ff4a Mon Sep 17 00:00:00 2001 From: Ming-Hung Tsai Date: Sat, 20 Jun 2020 00:04:01 +0800 Subject: [PATCH 1/6] [io_generator] Simplify the class interface --- base/io_generator.cc | 13 +++++-------- base/io_generator.h | 3 +-- thin-provisioning/thin_generate_mappings.cc | 4 +--- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/base/io_generator.cc b/base/io_generator.cc index 0543d31..a808a6c 100644 --- a/base/io_generator.cc +++ b/base/io_generator.cc @@ -115,8 +115,7 @@ namespace { class base_io_generator: public io_generator { public: base_io_generator(io_generator_options const &opts); - virtual bool has_next(); - virtual void next(base::io &next_io); + virtual bool next(base::io &next_io); private: offset_generator::ptr @@ -140,19 +139,17 @@ namespace { io_size_total_(opts.io_size_) { } - bool base_io_generator::has_next() { - return io_size_finished_ < io_size_total_; - } - - void base_io_generator::next(base::io &next_io) { + bool base_io_generator::next(base::io &next_io) { if (io_size_finished_ >= io_size_total_) - throw std::runtime_error(""); + return false; next_io.op_ = op_gen_->next_op(); next_io.sector_ = offset_gen_->next_offset(); next_io.size_ = block_size_; io_size_finished_ += block_size_; + + return true; } offset_generator::ptr diff --git a/base/io_generator.h b/base/io_generator.h index 4a33550..16a78d9 100644 --- a/base/io_generator.h +++ b/base/io_generator.h @@ -42,8 +42,7 @@ namespace base { public: typedef std::shared_ptr ptr; - virtual bool has_next() = 0; - virtual void next(base::io &next_io) = 0; + virtual bool next(base::io &next_io) = 0; }; io_generator::ptr diff --git a/thin-provisioning/thin_generate_mappings.cc b/thin-provisioning/thin_generate_mappings.cc index a366eba..97402ce 100644 --- a/thin-provisioning/thin_generate_mappings.cc +++ b/thin-provisioning/thin_generate_mappings.cc @@ -93,10 +93,8 @@ namespace { io_generator::ptr gen = create_io_generator(opts); base::io io; - while (gen->has_next()) { + while (gen->next(io)) { // TODO: support io.size_ - gen->next(io); - switch (io.op_) { case base::REQ_OP_READ: process_read(td, pool, io.sector_); From 8006e1817388b55489cbdff222015505a379d347 Mon Sep 17 00:00:00 2001 From: Ming-Hung Tsai Date: Mon, 22 Jun 2020 15:01:25 +0800 Subject: [PATCH 2/6] [thin_pool] Fix the number of mapped blocks --- thin-provisioning/thin_pool.cc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/thin-provisioning/thin_pool.cc b/thin-provisioning/thin_pool.cc index 3bdc9e7..3a34ba8 100644 --- a/thin-provisioning/thin_pool.cc +++ b/thin-provisioning/thin_pool.cc @@ -72,13 +72,16 @@ thin::insert(block_address thin_block, block_address data_block) { uint64_t key[2] = {dev_, thin_block}; - ++details_.mapped_blocks_; - changed_ = true; - mapping_tree_detail::block_time bt; bt.block_ = data_block; bt.time_ = pool_.get_time(); - return pool_.md_->mappings_->insert(key, bt); + bool inserted = pool_.md_->mappings_->insert(key, bt); + + changed_ = true; + if (inserted) + ++details_.mapped_blocks_; + + return inserted; } void From 19e482fd2f8256f4d77d77aad9b0f190662bbaee Mon Sep 17 00:00:00 2001 From: Ming-Hung Tsai Date: Mon, 22 Jun 2020 23:52:42 +0800 Subject: [PATCH 3/6] [thin_generate_mappings] Update help text --- thin-provisioning/thin_generate_mappings.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/thin-provisioning/thin_generate_mappings.cc b/thin-provisioning/thin_generate_mappings.cc index 97402ce..1a124bb 100644 --- a/thin-provisioning/thin_generate_mappings.cc +++ b/thin-provisioning/thin_generate_mappings.cc @@ -129,10 +129,10 @@ thin_generate_mappings_cmd::usage(std::ostream &out) const << " {-h|--help}\n" << " {-o|--output} \n" << " {--dev-id} \n" - << " {--offset} \n" - << " {--io-size} \n" + << " {--offset} \n" + << " {--io-size} \n" << " {--rw write|trim|randwrite|randtrim|randtw}\n" - << " {--size} \n" + << " {--size} \n" << " {-V|--version}" << endl; } From ce8945e82962076b4a111ae5a592794df01e82ba Mon Sep 17 00:00:00 2001 From: Ming-Hung Tsai Date: Fri, 26 Jun 2020 23:04:15 +0800 Subject: [PATCH 4/6] [io_generator] Fix address boundary for doing IO Limit the addresses to be within the specified range --- base/io_generator.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/base/io_generator.cc b/base/io_generator.cc index a808a6c..4d6ebb0 100644 --- a/base/io_generator.cc +++ b/base/io_generator.cc @@ -48,8 +48,10 @@ namespace { base::sector_t next_offset() { sector_t r = current_; current_ += block_size_; - if (current_ > end_) + if (current_ > end_) { current_ = begin_; + return begin_; + } return r; } From 4f8466c48952481fbe5ef38ea6975b90976e7742 Mon Sep 17 00:00:00 2001 From: Ming-Hung Tsai Date: Tue, 30 Jun 2020 14:07:38 +0800 Subject: [PATCH 5/6] [btree] Fix parent key index for the new shadow --- persistent-data/data-structures/btree-remove.tcc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistent-data/data-structures/btree-remove.tcc b/persistent-data/data-structures/btree-remove.tcc index d222273..9d3317e 100644 --- a/persistent-data/data-structures/btree-remove.tcc +++ b/persistent-data/data-structures/btree-remove.tcc @@ -93,7 +93,7 @@ namespace persistent_data { { using namespace btree_detail; - unsigned i = 0; + unsigned i = *index; bool r = false; for (;;) { From cf127f3471242dea7ba60bfdaf7948a298bf5999 Mon Sep 17 00:00:00 2001 From: Ming-Hung Tsai Date: Tue, 30 Jun 2020 16:42:30 +0800 Subject: [PATCH 6/6] [btree] Fix reference counts of children below a shadow --- persistent-data/data-structures/btree-remove.tcc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/persistent-data/data-structures/btree-remove.tcc b/persistent-data/data-structures/btree-remove.tcc index 9d3317e..852d267 100644 --- a/persistent-data/data-structures/btree-remove.tcc +++ b/persistent-data/data-structures/btree-remove.tcc @@ -94,10 +94,11 @@ namespace persistent_data { using namespace btree_detail; unsigned i = *index; - bool r = false; for (;;) { - r = spine.step(block); + bool inc = spine.step(block); + if (inc) + inc_children(spine, leaf_rc); // patch up the parent to point to the new shadow if (spine.has_parent()) { @@ -115,9 +116,9 @@ namespace persistent_data { return true; } - r = rebalance_children(spine, key); + bool r = rebalance_children(spine, key); if (!r) - break; + return false; n = spine.get_node(); if (n.get_type() == btree_detail::LEAF) { @@ -133,7 +134,7 @@ namespace persistent_data { block = n.value_at(i); } - return r; + return true; } template