Skip to content

Commit 0c79bc2

Browse files
authored
Merge pull request ceph#54609 from xxhdx1985126/wip-crimson-rollback-fixes
crimson/osd/pg_backend: fix rollback on whiteouts Reviewed-by: Matan Breizman <[email protected]>
2 parents 85e42bb + 75d86c6 commit 0c79bc2

File tree

4 files changed

+19
-10
lines changed

4 files changed

+19
-10
lines changed

src/crimson/osd/ops_executer.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -638,8 +638,10 @@ OpsExecuter::do_execute_op(OSDOp& osd_op)
638638
case CEPH_OSD_OP_ROLLBACK:
639639
return do_write_op([this, &head=obc,
640640
&osd_op](auto& backend, auto& os, auto& txn) {
641-
return backend.rollback(os, osd_op, txn, *osd_op_params, delta_stats,
642-
head, pg->obc_loader);
641+
ceph_assert(obc->ssc);
642+
return backend.rollback(os, obc->ssc->snapset,
643+
osd_op, txn, *osd_op_params, delta_stats,
644+
head, pg->obc_loader, snapc);
643645
});
644646
case CEPH_OSD_OP_APPEND:
645647
return do_write_op([this, &osd_op](auto& backend, auto& os, auto& txn) {
@@ -666,9 +668,7 @@ OpsExecuter::do_execute_op(OSDOp& osd_op)
666668
case CEPH_OSD_OP_DELETE:
667669
{
668670
bool whiteout = false;
669-
if (!obc->ssc->snapset.clones.empty() ||
670-
(snapc.snaps.size() && // there are snaps
671-
snapc.snaps[0] > obc->ssc->snapset.seq)) { // existing obj is old
671+
if (should_whiteout(obc->ssc->snapset, snapc)) { // existing obj is old
672672
logger().debug("{} has or will have clones, will whiteout {}",
673673
__func__, obc->obs.oi.soid);
674674
whiteout = true;

src/crimson/osd/pg_backend.cc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -770,12 +770,14 @@ PGBackend::write_iertr::future<> PGBackend::writefull(
770770

771771
PGBackend::rollback_iertr::future<> PGBackend::rollback(
772772
ObjectState& os,
773+
const SnapSet &ss,
773774
const OSDOp& osd_op,
774775
ceph::os::Transaction& txn,
775776
osd_op_params_t& osd_op_params,
776777
object_stat_sum_t& delta_stats,
777778
crimson::osd::ObjectContextRef head,
778-
crimson::osd::ObjectContextLoader& obc_loader)
779+
crimson::osd::ObjectContextLoader& obc_loader,
780+
const SnapContext &snapc)
779781
{
780782
const ceph_osd_op& op = osd_op.op;
781783
snapid_t snapid = (uint64_t)op.snap.snapid;
@@ -833,12 +835,12 @@ PGBackend::rollback_iertr::future<> PGBackend::rollback(
833835
// if there's no snapshot, we delete the object;
834836
// otherwise, do nothing.
835837
crimson::ct_error::enoent::handle(
836-
[this, &os, &snapid, &txn, &delta_stats] {
838+
[this, &os, &snapid, &txn, &delta_stats, &snapc, &ss] {
837839
logger().debug("PGBackend::rollback: deleting head on {}"
838840
" with snap_id of {}"
839841
" because got ENOENT|whiteout on obc lookup",
840842
os.oi.soid, snapid);
841-
return remove(os, txn, delta_stats, false);
843+
return remove(os, txn, delta_stats, should_whiteout(ss, snapc));
842844
}),
843845
rollback_ertr::pass_further{},
844846
crimson::ct_error::assert_all{"unexpected error in rollback"}

src/crimson/osd/pg_backend.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,12 +197,14 @@ class PGBackend
197197
rollback_ertr>;
198198
rollback_iertr::future<> rollback(
199199
ObjectState& os,
200+
const SnapSet &ss,
200201
const OSDOp& osd_op,
201202
ceph::os::Transaction& txn,
202203
osd_op_params_t& osd_op_params,
203204
object_stat_sum_t& delta_stats,
204205
crimson::osd::ObjectContextRef head,
205-
crimson::osd::ObjectContextLoader& obc_loader);
206+
crimson::osd::ObjectContextLoader& obc_loader,
207+
const SnapContext &snapc);
206208
write_iertr::future<> truncate(
207209
ObjectState& os,
208210
const OSDOp& osd_op,

src/osd/osd_types.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5572,7 +5572,12 @@ WRITE_CLASS_ENCODER(SnapSet)
55725572

55735573
std::ostream& operator<<(std::ostream& out, const SnapSet& cs);
55745574

5575-
5575+
inline static const bool should_whiteout(
5576+
const SnapSet &ss,
5577+
const SnapContext &client_snapc) {
5578+
return !ss.clones.empty() ||
5579+
(!client_snapc.snaps.empty() && client_snapc.snaps[0] > ss.seq);
5580+
}
55765581

55775582
#define OI_ATTR "_"
55785583
#define SS_ATTR "snapset"

0 commit comments

Comments
 (0)