void debug(const hobject_t &oid, const std::string &str,
const ECUtil::shard_extent_map_t &map, DoutPrefixProvider *dpp) {
ldpp_dout(dpp, 20)
- << " generate_transactions: " << "oid: " << oid << str << map << dendl;
+ << " generate_transactions: " << "oid: " << oid << " " << str << " " << map << dendl;
ldpp_dout(dpp, 20)
<< "EC_DEBUG_BUFFERS: " << map.debug_string(2048, 0) << dendl;
}
void ECTransaction::Generate::encode_and_write() {
+ ldpp_dout(dpp, 20)<< __func__ << dendl;
+
// For PDW, we already have necessary parity buffers.
if (!plan.do_parity_delta_write) {
to_write.insert_parity_buffers();
uint64_t clone_start = std::numeric_limits<uint64_t>::max();
uint64_t clone_end = 0;
- shard_id_set clone_shards; // intentionally left blank!
+ shard_id_set clone_shards;
for (auto &&[shard, eset]: truncate_eset) {
clone_shards.insert(shard);
+ uint64_t start = eset.range_start();
+ uint64_t start_align_prev = ECUtil::align_prev(start);
+ uint64_t end = eset.range_end();
+
+ if (clone_start > start_align_prev) {
+ clone_start = start_align_prev;
+ }
+ if (clone_end < end) {
+ clone_end = end;
+ }
+ }
+
+ for (auto &&[shard, eset]: truncate_eset) {
if (!transactions.contains(shard)) {
continue;
}
auto &t = transactions.at(shard);
uint64_t start = eset.range_start();
- uint64_t start_align_prev = ECUtil::align_prev(start);
uint64_t start_align_next = ECUtil::align_next(start);
uint64_t end = eset.range_end();
t.touch(
coll_t(spg_t(pgid, shard)),
ghobject_t(oid, ghobject_t::NO_GEN, shard),
ghobject_t(oid, entry->version.version, shard),
- start_align_prev,
- end - start_align_prev,
- start_align_prev);
+ clone_start,
+ end - clone_start,
+ clone_start);
// First truncate to exactly the right size.
t.truncate(
ghobject_t(oid, ghobject_t::NO_GEN, shard),
start_align_next);
}
-
- if (clone_start > start_align_prev) {
- clone_start = start_align_prev;
- }
- if (clone_end < end) {
- clone_end = end;
- }
}
- shards_written(clone_shards);
- rollback_extents.emplace_back(make_pair(clone_start, clone_end));
+ rollback_extents.emplace_back(make_pair(clone_start, clone_end - clone_start));
rollback_shards.emplace_back(clone_shards);
}
}
void ECTransaction::Generate::overlay_writes() {
+ ldpp_dout(dpp, 20) << __func__ << " start " << dendl;
+
for (auto &&extent: op.buffer_updates) {
using BufferUpdate = PGTransaction::ObjectOperation::BufferUpdate;
bufferlist bl;
extent_set clone_ranges = plan.will_write.get_extent_superset();
uint64_t clone_max = ECUtil::align_next(plan.orig_size);
+ ldpp_dout(dpp, 20) << __func__ << dendl;
if (op.delete_first) {
clone_max = 0;