From 4bac8c7a3f0c12337fdc1c5b3d9f6253d79ee681 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Tue, 1 Apr 2014 16:27:20 -0700 Subject: [PATCH] rados.h,ReplicatedPG: add CEPH_OSD_FLAG_ENFORCE_SNAPC and use on flush We need to ensure that even with pool snaps, we use the snapc provided in order to ensure that the clones are written back correctly. Fixes: #7941 Signed-off-by: Samuel Just (cherry picked from commit 499adb1db1cd225c91acce31b5f48fad5145043b) --- src/include/rados.h | 2 ++ src/osd/ReplicatedPG.cc | 18 +++++++++++------- src/osd/osd_types.cc | 1 + 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/include/rados.h b/src/include/rados.h index 0d02b241c1d7d..ba3d3746039fd 100644 --- a/src/include/rados.h +++ b/src/include/rados.h @@ -374,6 +374,8 @@ enum { CEPH_OSD_FLAG_FLUSH = 0x40000, /* this is part of flush */ CEPH_OSD_FLAG_MAP_SNAP_CLONE =0x80000, /* map snap direct to clone id */ + CEPH_OSD_FLAG_ENFORCE_SNAPC =0x100000, /* use snapc provided even if + pool uses pool snaps */ }; enum { diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index de04481bfb1ca..b6beae665e9e6 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -1716,7 +1716,8 @@ void ReplicatedPG::execute_ctx(OpContext *ctx) op->mark_started(); // snap - if (pool.info.is_pool_snaps_mode()) { + if (!(m->get_flags() & CEPH_OSD_FLAG_ENFORCE_SNAPC) && + pool.info.is_pool_snaps_mode()) { // use pool's snapc ctx->snapc = pool.snapc; } else { @@ -6206,7 +6207,9 @@ int ReplicatedPG::start_flush( o, dsnapc, oi.mtime, - CEPH_OSD_FLAG_IGNORE_OVERLAY | CEPH_OSD_FLAG_ORDERSNAP, + (CEPH_OSD_FLAG_IGNORE_OVERLAY | + CEPH_OSD_FLAG_ORDERSNAP | + CEPH_OSD_FLAG_ENFORCE_SNAPC), NULL, NULL /* no callback, we'll rely on the ordering w.r.t the next op */); osd->objecter_lock.Unlock(); @@ -6234,11 +6237,12 @@ int ReplicatedPG::start_flush( C_Flush *fin = new C_Flush(this, soid, get_last_peering_reset()); osd->objecter_lock.Lock(); - ceph_tid_t tid = osd->objecter->mutate(soid.oid, base_oloc, o, snapc, oi.mtime, - CEPH_OSD_FLAG_IGNORE_OVERLAY, - NULL, - new C_OnFinisher(fin, - &osd->objecter_finisher)); + ceph_tid_t tid = osd->objecter->mutate( + soid.oid, base_oloc, o, snapc, oi.mtime, + CEPH_OSD_FLAG_IGNORE_OVERLAY | CEPH_OSD_FLAG_ENFORCE_SNAPC, + NULL, + new C_OnFinisher(fin, + &osd->objecter_finisher)); fin->tid = tid; fop->objecter_tid = tid; osd->objecter_lock.Unlock(); diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index f2cf9cdab0d17..15dd661d1761a 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -47,6 +47,7 @@ const char *ceph_osd_flag_name(unsigned flag) case CEPH_OSD_FLAG_IGNORE_OVERLAY: return "ignore_overlay"; case CEPH_OSD_FLAG_FLUSH: return "flush"; case CEPH_OSD_FLAG_MAP_SNAP_CLONE: return "map_snap_clone"; + case CEPH_OSD_FLAG_ENFORCE_SNAPC: return "enforce_snapc"; default: return "???"; } } -- 2.39.5