SnapTrimObjSubEvent::remove_clone(
ObjectContextRef obc,
ObjectContextRef head_obc,
- ceph::os::Transaction& txn,
- std::vector<pg_log_entry_t>& log_entries
+ ceph::os::Transaction& txn
) {
const auto p = std::find(
head_obc->ssc->snapset.clones.begin(),
head_obc->ssc->snapset.clone_size.erase(last);
head_obc->ssc->snapset.clone_snaps.erase(last);
- log_entries.emplace_back(
- pg_log_entry_t{
- pg_log_entry_t::DELETE,
- coid,
- osd_op_p.at_version,
- obc->obs.oi.version,
- 0,
- osd_reqid_t(),
- obc->obs.oi.mtime, // will be replaced in `apply_to()`
- 0}
- );
+ add_log_entry(
+ pg_log_entry_t::DELETE,
+ coid,
+ obc->obs.oi.version,
+ 0,
+ osd_reqid_t(),
+ obc->obs.oi.mtime, // will be replaced in `apply_to()`
+ 0);
txn.remove(
pg->get_collection_ref()->get_cid(),
ghobject_t{coid, ghobject_t::NO_GEN, shard_id_t::NO_SHARD});
void SnapTrimObjSubEvent::remove_head_whiteout(
ObjectContextRef obc,
ObjectContextRef head_obc,
- ceph::os::Transaction& txn,
- std::vector<pg_log_entry_t>& log_entries
+ ceph::os::Transaction& txn
) {
// NOTE: this arguably constitutes minor interference with the
// tiering agent if this is a cache tier since a snap trim event
const auto head_oid = coid.get_head();
logger().info("{}: {} removing {}",
*this, coid, head_oid);
- log_entries.emplace_back(
- pg_log_entry_t{
- pg_log_entry_t::DELETE,
- head_oid,
- osd_op_p.at_version,
- head_obc->obs.oi.version,
- 0,
- osd_reqid_t(),
- obc->obs.oi.mtime, // will be replaced in `apply_to()`
- 0}
- );
+ add_log_entry(
+ pg_log_entry_t::DELETE,
+ head_oid,
+ head_obc->obs.oi.version,
+ 0,
+ osd_reqid_t(),
+ obc->obs.oi.mtime, // will be replaced in `apply_to()`
+ 0);
logger().info("{}: remove snap head", *this);
object_info_t& oi = head_obc->obs.oi;
delta_stats.num_objects--;
ObjectContextRef obc,
ObjectContextRef head_obc,
const std::set<snapid_t>& new_snaps,
- ceph::os::Transaction& txn,
- std::vector<pg_log_entry_t>& log_entries
+ ceph::os::Transaction& txn
) {
head_obc->ssc->snapset.clone_snaps[coid.snap] =
std::vector<snapid_t>(new_snaps.rbegin(), new_snaps.rend());
ghobject_t{coid, ghobject_t::NO_GEN, shard_id_t::NO_SHARD},
OI_ATTR,
bl);
- log_entries.emplace_back(
- pg_log_entry_t{
- pg_log_entry_t::MODIFY,
- coid,
- obc->obs.oi.version,
- obc->obs.oi.prior_version,
- 0,
- osd_reqid_t(),
- obc->obs.oi.mtime,
- 0}
- );
+ add_log_entry(
+ pg_log_entry_t::MODIFY,
+ coid,
+ obc->obs.oi.prior_version,
+ 0,
+ osd_reqid_t(),
+ obc->obs.oi.mtime,
+ 0);
return OpsExecuter::snap_map_modify(
coid, new_snaps, pg->snap_mapper, pg->osdriver, txn);
}
void SnapTrimObjSubEvent::update_head(
ObjectContextRef obc,
ObjectContextRef head_obc,
- ceph::os::Transaction& txn,
- std::vector<pg_log_entry_t>& log_entries
+ ceph::os::Transaction& txn
) {
const auto head_oid = coid.get_head();
logger().info("{}: writing updated snapset on {}, snapset is {}",
*this, head_oid, head_obc->ssc->snapset);
- log_entries.emplace_back(
- pg_log_entry_t{
- pg_log_entry_t::MODIFY,
- head_oid,
- osd_op_p.at_version,
- head_obc->obs.oi.version,
- 0,
- osd_reqid_t(),
- obc->obs.oi.mtime,
- 0}
- );
+ add_log_entry(
+ pg_log_entry_t::MODIFY,
+ head_oid,
+ head_obc->obs.oi.version,
+ 0,
+ osd_reqid_t(),
+ obc->obs.oi.mtime,
+ 0);
head_obc->obs.oi.prior_version = head_obc->obs.oi.version;
head_obc->obs.oi.version = osd_op_p.at_version;
attrs);
}
-SnapTrimObjSubEvent::remove_or_update_iertr::future<
- SnapTrimObjSubEvent::remove_or_update_ret_t>
+SnapTrimObjSubEvent::remove_or_update_iertr::future<ceph::os::Transaction>
SnapTrimObjSubEvent::remove_or_update(
ObjectContextRef obc,
ObjectContextRef head_obc)
}
return seastar::do_with(ceph::os::Transaction{}, [=, this](auto &txn) {
- std::vector<pg_log_entry_t> log_entries{};
-
- int64_t num_objects_before_trim = delta_stats.num_objects;
- osd_op_p.at_version = pg->next_version();
- auto ret = remove_or_update_iertr::now();
- if (new_snaps.empty()) {
- // remove clone from snapset
- logger().info("{}: {} snaps {} -> {} ... deleting",
- *this, coid, old_snaps, new_snaps);
- ret = remove_clone(obc, head_obc, txn, log_entries);
- } else {
- // save adjusted snaps for this object
- logger().info("{}: {} snaps {} -> {}",
- *this, coid, old_snaps, new_snaps);
- ret = adjust_snaps(obc, head_obc, new_snaps, txn, log_entries);
- }
- return std::move(ret).si_then(
- [&txn, obc, num_objects_before_trim, log_entries=std::move(log_entries), head_obc=std::move(head_obc), this]() mutable {
- osd_op_p.at_version = pg->next_version();
-
- // save head snapset
- logger().debug("{}: {} new snapset {} on {}",
- *this, coid, head_obc->ssc->snapset, head_obc->obs.oi);
- if (head_obc->ssc->snapset.clones.empty() && head_obc->obs.oi.is_whiteout()) {
- remove_head_whiteout(obc, head_obc, txn, log_entries);
+ int64_t num_objects_before_trim = delta_stats.num_objects;
+ osd_op_p.at_version = pg->get_next_version();
+ auto ret = remove_or_update_iertr::now();
+ if (new_snaps.empty()) {
+ // remove clone from snapset
+ logger().info("{}: {} snaps {} -> {} ... deleting",
+ *this, coid, old_snaps, new_snaps);
+ ret = remove_clone(obc, head_obc, txn);
} else {
- update_head(obc, head_obc, txn, log_entries);
- }
- // Stats reporting - Set number of objects trimmed
- if (num_objects_before_trim > delta_stats.num_objects) {
- //int64_t num_objects_trimmed =
- // num_objects_before_trim - delta_stats.num_objects;
- //add_objects_trimmed_count(num_objects_trimmed);
+ // save adjusted snaps for this object
+ logger().info("{}: {} snaps {} -> {}",
+ *this, coid, old_snaps, new_snaps);
+ ret = adjust_snaps(obc, head_obc, new_snaps, txn);
}
- }).si_then(
- [&txn, log_entries=std::move(log_entries)] () mutable {
- return remove_or_update_iertr::make_ready_future<remove_or_update_ret_t>(
- std::make_pair(std::move(txn), std::move(log_entries)));
- });
+ return std::move(ret).si_then(
+ [&txn, obc, num_objects_before_trim,
+ head_obc=std::move(head_obc), this]() mutable {
+ // save head snapset
+ logger().debug("{}: {} new snapset {} on {}",
+ *this, coid, head_obc->ssc->snapset, head_obc->obs.oi);
+ if (head_obc->ssc->snapset.clones.empty() && head_obc->obs.oi.is_whiteout()) {
+ remove_head_whiteout(obc, head_obc, txn);
+ } else {
+ update_head(obc, head_obc, txn);
+ }
+ // Stats reporting - Set number of objects trimmed
+ if (num_objects_before_trim > delta_stats.num_objects) {
+ //int64_t num_objects_trimmed =
+ // num_objects_before_trim - delta_stats.num_objects;
+ //add_objects_trimmed_count(num_objects_trimmed);
+ }
+ }).si_then(
+ [&txn] () mutable {
+ return std::move(txn);
+ });
});
}
logger().debug("{}: processing clone_obc={}", *this, clone_obc->get_oid());
return remove_or_update(
clone_obc, head_obc
- ).safe_then_unpack_interruptible([clone_obc, this]
- (auto&& txn, auto&& log_entries) mutable {
+ ).safe_then_interruptible([clone_obc, this](auto&& txn) mutable {
auto [submitted, all_completed] = pg->submit_transaction(
std::move(clone_obc),
std::move(txn),
remove_or_update_iertr::future<> remove_clone(
ObjectContextRef obc,
ObjectContextRef head_obc,
- ceph::os::Transaction& txn,
- std::vector<pg_log_entry_t>& log_entries);
+ ceph::os::Transaction& txn);
void remove_head_whiteout(
ObjectContextRef obc,
ObjectContextRef head_obc,
- ceph::os::Transaction& txn,
- std::vector<pg_log_entry_t>& log_entries);
+ ceph::os::Transaction& txn);
interruptible_future<> adjust_snaps(
ObjectContextRef obc,
ObjectContextRef head_obc,
const std::set<snapid_t>& new_snaps,
- ceph::os::Transaction& txn,
- std::vector<pg_log_entry_t>& log_entries);
+ ceph::os::Transaction& txn);
void update_head(
ObjectContextRef obc,
ObjectContextRef head_obc,
- ceph::os::Transaction& txn,
- std::vector<pg_log_entry_t>& log_entries);
+ ceph::os::Transaction& txn);
- using remove_or_update_ret_t =
- std::pair<ceph::os::Transaction, std::vector<pg_log_entry_t>>;
- remove_or_update_iertr::future<remove_or_update_ret_t>
+ remove_or_update_iertr::future<ceph::os::Transaction>
remove_or_update(ObjectContextRef obc, ObjectContextRef head_obc);
// we don't need to synchronize with other instances started by
static constexpr auto type_name = "SnapTrimObjSubEvent::wait_repop";
} wait_repop;
+ void add_log_entry(
+ int _op,
+ const hobject_t& _soid,
+ const eversion_t& pv,
+ version_t uv,
+ const osd_reqid_t& rid,
+ const utime_t& mt,
+ int return_code) {
+ log_entries.emplace_back(
+ _op,
+ _soid,
+ osd_op_p.at_version,
+ pv,
+ uv,
+ rid,
+ mt,
+ return_code);
+ osd_op_p.at_version.version++;
+ }
+
Ref<PG> pg;
PipelineHandle handle;
osd_op_params_t osd_op_p;
const hobject_t coid;
const snapid_t snap_to_trim;
+ std::vector<pg_log_entry_t> log_entries;
public:
PipelineHandle& get_handle() { return handle; }