this->set_layout_buf(this->get_bptr().c_str());
}
- void prepare_commit() final {
- parent_node_t::prepare_commit();
+ void prepare_commit(Transaction &t) final {
+ if (!is_rewrite_transaction(t.get_src())) {
+ parent_node_t::prepare_commit();
+ }
}
virtual ~FixedKVInternalNode() {
delta_buffer.clear();
}
- void on_replace_prior() final {
- this->parent_node_t::on_replace_prior();
- if (this->is_btree_root()) {
- this->root_node_t::on_replace_prior();
- } else {
- this->child_node_t::on_replace_prior();
+ void on_replace_prior(Transaction &t) final {
+ if (!is_rewrite_transaction(t.get_src())) {
+ this->parent_node_t::on_replace_prior();
+ if (this->is_btree_root()) {
+ this->root_node_t::on_replace_prior();
+ } else {
+ this->child_node_t::on_replace_prior();
+ }
}
}
}
virtual void do_prepare_commit() = 0;
- void prepare_commit() final {
- do_prepare_commit();
+ void prepare_commit(Transaction &t) final {
+ if (!is_rewrite_transaction(t.get_src())) {
+ do_prepare_commit();
+ }
modifications = 0;
}
virtual void do_on_replace_prior() = 0;
- void on_replace_prior() final {
+ void on_replace_prior(Transaction &t) final {
ceph_assert(!this->is_rewrite());
- do_on_replace_prior();
- if (this->is_btree_root()) {
- this->root_node_t::on_replace_prior();
- } else {
- this->child_node_t::on_replace_prior();
+ if (!is_rewrite_transaction(t.get_src())) {
+ do_on_replace_prior();
+ if (this->is_btree_root()) {
+ this->root_node_t::on_replace_prior();
+ } else {
+ this->child_node_t::on_replace_prior();
+ }
}
modifications = 0;
}
}
i->prepare_write();
- i->prepare_commit();
+ i->prepare_commit(t);
if (i->is_mutation_pending()) {
- i->on_replace_prior();
+ i->on_replace_prior(t);
} // else, is_exist_mutation_pending():
// - it doesn't have prior_instance to replace
i->trans_view_hook.unlink();
}
- t.for_each_finalized_fresh_block([](auto &e) {
+ t.for_each_finalized_fresh_block([&t](auto &e) {
// fresh blocks' `prepare_commit` must be invoked before
// retiering extents, this is because logical linked tree
// nodes needs to access their prior instances in this
// phase if they are rewritten.
- e->prepare_commit();
+ e->prepare_commit(t);
});
/*
* Called prior to committing the transaction in which this extent
* is living.
*/
- virtual void prepare_commit() {}
+ virtual void prepare_commit(Transaction &) {}
/**
* on_initial_write
* with the states of Cache and can't wait till transaction
* completes.
*/
- virtual void on_replace_prior() {}
+ virtual void on_replace_prior(Transaction &) {}
/**
* on_invalidated
return (get_laddr() + get_length()).checked_to_laddr();
}
protected:
- void on_replace_prior() final {
+ void on_replace_prior(Transaction &t) final {
assert(is_seen_by_users());
- lba_child_node_t::on_replace_prior();
- do_on_replace_prior();
+ if (!is_rewrite_transaction(t.get_src())) {
+ lba_child_node_t::on_replace_prior();
+ }
+ do_on_replace_prior(t);
}
- virtual void do_on_replace_prior() {}
+ virtual void do_on_replace_prior(Transaction &t) {}
};
using LogicalChildNodeRef = TCachedExtentRef<LogicalChildNode>;
} // namespace crimson::os::seastore
modified_region.clear();
}
- void prepare_commit() final {
+ void prepare_commit(Transaction &t) final {
+ if (is_rewrite_transaction(t.get_src())) {
+ return;
+ }
if (has_mutation()) {
ceph_assert(!cached_overwrites.is_empty());
if (cached_overwrites.has_cached_bptr()) {
}
}
- void prepare_commit() final {
+ void prepare_commit(Transaction &t) final {
+ if (is_rewrite_transaction(t.get_src())) {
+ return;
+ }
if (unlikely(!is_seen_by_users())) {
ceph_assert(is_rewrite());
auto &prior = *get_prior_instance()->template cast<OMapInnerNode>();
}
}
- void do_on_replace_prior() final {
+ void do_on_replace_prior(Transaction &t) final {
+ if (is_rewrite_transaction(t.get_src())) {
+ return;
+ }
this->parent_node_t::on_replace_prior();
if (!this->is_btree_root()) {
auto &prior = *get_prior_instance()->template cast<OMapInnerNode>();
this->child_node_t::on_invalidated();
}
- void prepare_commit() final {
+ void prepare_commit(Transaction &t) final {
+ if (is_rewrite_transaction(t.get_src())) {
+ return;
+ }
if (unlikely(!is_seen_by_users())) {
ceph_assert(is_rewrite());
auto &prior = *get_prior_instance()->template cast<OMapLeafNode>();
}
}
- void do_on_replace_prior() final {
+ void do_on_replace_prior(Transaction &t) final {
ceph_assert(!this->is_rewrite());
- if (!this->is_btree_root()) {
+ if (!this->is_btree_root() && !is_rewrite_transaction(t.get_src())) {
auto &prior = *get_prior_instance()->template cast<OMapLeafNode>();
assert(prior.base_child_t::has_parent_tracker());
this->child_node_t::on_replace_prior();
namespace crimson::os::seastore {
-void RootBlock::on_replace_prior() {
- if (!lba_root_node) {
+void RootBlock::on_replace_prior(Transaction &t) {
+ if (!lba_root_node ||
+ // for rewrite transactions, we keep the prior extents instead of
+ // the new ones.
+ is_rewrite_transaction(t.get_src())) {
auto &prior = static_cast<RootBlock&>(*get_prior_instance());
if (prior.lba_root_node) {
RootBlockRef this_ref = this;
}
}
}
- if (!backref_root_node) {
+ if (!backref_root_node ||
+ // for rewrite transactions, we keep the prior extents instead of
+ // the new ones.
+ is_rewrite_transaction(t.get_src())) {
auto &prior = static_cast<RootBlock&>(*get_prior_instance());
if (prior.backref_root_node) {
RootBlockRef this_ref = this;
return extent_types_t::ROOT;
}
- void on_replace_prior() final;
+ void on_replace_prior(Transaction &t) final;
/// dumps root as delta
ceph::bufferlist get_delta() final {