From 499adb1db1cd225c91acce31b5f48fad5145043b 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 --- 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 0d02b241c1d..ba3d3746039 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 5d8419944f9..1816eab96ee 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 { @@ -6202,7 +6203,9 @@ int ReplicatedPG::start_flush(OpContext *ctx, bool blocking, hobject_t *pmissing 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(); @@ -6228,11 +6231,12 @@ int ReplicatedPG::start_flush(OpContext *ctx, bool blocking, hobject_t *pmissing 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 f2cf9cdab0d..15dd661d176 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.47.3