Skip to content

Commit 8569dbc

Browse files
authored
Merge pull request ceph#56606 from guojidan/num_bytes
crimson/osd/ops_executer: fix snap overlap range error Reviewed-by: Samuel Just <[email protected]>
2 parents 472cc2b + 7eca779 commit 8569dbc

File tree

4 files changed

+33
-16
lines changed

4 files changed

+33
-16
lines changed

src/crimson/osd/ops_executer.cc

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -970,20 +970,30 @@ std::unique_ptr<OpsExecuter::CloningContext> OpsExecuter::execute_clone(
970970
osd_op_params->at_version.version++;
971971
encode(cloned_snaps, cloning_ctx->log_entry.snaps);
972972

973-
// update most recent clone_overlap and usage stats
974-
assert(cloning_ctx->new_snapset.clones.size() > 0);
975-
// In classic, we check for evicted clones before
976-
// adjusting the clone_overlap.
977-
// This check is redundant here since `clone_obc`
978-
// was just created (See prepare_clone()).
979-
interval_set<uint64_t> &newest_overlap =
980-
cloning_ctx->new_snapset.clone_overlap.rbegin()->second;
981-
osd_op_params->modified_ranges.intersection_of(newest_overlap);
982-
delta_stats.num_bytes += osd_op_params->modified_ranges.size();
983-
newest_overlap.subtract(osd_op_params->modified_ranges);
984973
return cloning_ctx;
985974
}
986975

976+
void OpsExecuter::update_clone_overlap() {
977+
interval_set<uint64_t> *newest_overlap;
978+
if (cloning_ctx) {
979+
newest_overlap =
980+
&cloning_ctx->new_snapset.clone_overlap.rbegin()->second;
981+
} else if (op_info.may_write()
982+
&& obc->obs.exists
983+
&& !snapc.snaps.empty()
984+
&& !obc->ssc->snapset.clones.empty()) {
985+
newest_overlap =
986+
&obc->ssc->snapset.clone_overlap.rbegin()->second;
987+
} else {
988+
return;
989+
}
990+
991+
assert(osd_op_params);
992+
osd_op_params->modified_ranges.intersection_of(*newest_overlap);
993+
newest_overlap->subtract(osd_op_params->modified_ranges);
994+
delta_stats.num_bytes += osd_op_params->modified_ranges.size();
995+
}
996+
987997
void OpsExecuter::CloningContext::apply_to(
988998
std::vector<pg_log_entry_t>& log_entries,
989999
ObjectContext& processed_obc) &&
@@ -1002,6 +1012,7 @@ OpsExecuter::flush_clone_metadata(
10021012
{
10031013
assert(!txn.empty());
10041014
auto maybe_snap_mapped = interruptor::now();
1015+
update_clone_overlap();
10051016
if (cloning_ctx) {
10061017
std::move(*cloning_ctx).apply_to(log_entries, *obc);
10071018
const auto& coid = log_entries.front().soid;

src/crimson/osd/ops_executer.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,14 @@ class OpsExecuter : public seastar::enable_lw_shared_from_this<OpsExecuter> {
255255
&& snapc.snaps[0] > initial_obc.ssc->snapset.seq; // existing obj is old
256256
}
257257

258+
/**
259+
* update_clone_overlap
260+
*
261+
* We need to update the most recent snapshot and the overlapping
262+
* part of the head object for each write operation.
263+
*/
264+
void update_clone_overlap();
265+
258266
interruptible_future<std::vector<pg_log_entry_t>> flush_clone_metadata(
259267
std::vector<pg_log_entry_t>&& log_entries,
260268
SnapMapper& snap_mapper,

src/crimson/osd/pg_backend.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -596,11 +596,11 @@ void PGBackend::update_size_and_usage(object_stat_sum_t& delta_stats,
596596
if (write_full) {
597597
if (oi.size) {
598598
ch.insert(0, oi.size);
599-
} else if (length) {
600-
ch.insert(offset, length);
601599
}
602-
modified.union_of(ch);
600+
} else if (length) {
601+
ch.insert(offset, length);
603602
}
603+
modified.union_of(ch);
604604
if (write_full ||
605605
(offset + length > oi.size && length)) {
606606
uint64_t new_size = offset + length;

src/test/librados/snapshots_cxx.cc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,6 @@ TEST_F(LibRadosSnapshotsSelfManagedPP, RollbackPP) {
238238
}
239239

240240
TEST_F(LibRadosSnapshotsSelfManagedPP, SnapOverlapPP) {
241-
// WIP https://tracker.ceph.com/issues/58263
242-
SKIP_IF_CRIMSON();
243241
std::vector<uint64_t> my_snaps;
244242
IoCtx readioctx;
245243
ASSERT_EQ(0, cluster.ioctx_create(pool_name.c_str(), readioctx));

0 commit comments

Comments
 (0)