]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rados.h,ReplicatedPG: add CEPH_OSD_FLAG_ENFORCE_SNAPC and use on flush 1745/head
authorSamuel Just <sam.just@inktank.com>
Tue, 1 Apr 2014 23:27:20 +0000 (16:27 -0700)
committerSamuel Just <sam.just@inktank.com>
Thu, 24 Apr 2014 23:48:15 +0000 (16:48 -0700)
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 <sam.just@inktank.com>
src/include/rados.h
src/osd/ReplicatedPG.cc
src/osd/osd_types.cc

index 0d02b241c1d7d9f4c96d3535d56ca332c3bfbe52..ba3d3746039fd0c36053284d058650e91ec0ca70 100644 (file)
@@ -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 {
index 5d8419944f901a0dc79d40c99c1248c7910fee3e..1816eab96ee38eb6b05829706acad1d5f0cf4759 100644 (file)
@@ -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();
index f2cf9cdab0d1774197228c9b15ad95d4c423b6ae..15dd661d1761a693641ebbcd280dd7f778319893 100644 (file)
@@ -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 "???";
   }
 }