friend class ExtentIndex;
friend class Transaction;
+ bool is_linked() {
+ return extent_index_hook.is_linked();
+ }
+
/// hook for intrusive ref list (mainly dirty or lru list)
boost::intrusive::list_member_hook<> primary_ref_list_hook;
using primary_ref_list_member_options = boost::intrusive::member_hook<
);
}
+ template <typename Disposer>
+ void clear_and_dispose(Disposer disposer) {
+ extent_index.clear_and_dispose(disposer);
+ bytes = 0;
+ }
+
void clear() {
extent_index.clear();
bytes = 0;
void erase(CachedExtent &extent) {
assert(extent.parent_index);
+ assert(extent.is_linked());
auto erased = extent_index.erase(
extent_index.s_iterator_to(extent));
extent.parent_index = nullptr;
- if (erased) {
- bytes -= extent.get_length();
- }
+ assert(erased);
+ bytes -= extent.get_length();
}
void replace(CachedExtent &to, CachedExtent &from) {
* Representation of in-progress mutation. Used exclusively through Cache methods.
*/
class Transaction {
+ struct cached_extent_disposer {
+ void operator() (CachedExtent* extent) {
+ extent->parent_index = nullptr;
+ extent->state = CachedExtent::extent_state_t::INVALID;
+ }
+ };
public:
using Ref = std::unique_ptr<Transaction>;
using on_destruct_func_t = std::function<void(Transaction&)>;
~Transaction() {
on_destruct(*this);
- for (auto i = write_set.begin();
- i != write_set.end();) {
- i->state = CachedExtent::extent_state_t::INVALID;
- write_set.erase(*i++);
- }
- for (auto i = delayed_set.begin();
- i != delayed_set.end();) {
- delayed_set.erase(*i++);
- }
+ write_set.clear_and_dispose(cached_extent_disposer());
+ delayed_set.clear_and_dispose(cached_extent_disposer());
}
friend class crimson::os::seastore::SeaStore;
offset = 0;
delayed_temp_offset = 0;
read_set.clear();
- write_set.clear();
- delayed_set.clear();
+ write_set.clear_and_dispose(cached_extent_disposer());
+ delayed_set.clear_and_dispose(cached_extent_disposer());
fresh_block_list.clear();
mutated_block_list.clear();
delayed_alloc_list.clear();