]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG: handle FLAG_OMAP on promote and copyfrom
authorSamuel Just <sam.just@inktank.com>
Thu, 3 Apr 2014 17:39:39 +0000 (10:39 -0700)
committerSamuel Just <sam.just@inktank.com>
Thu, 3 Apr 2014 20:03:56 +0000 (13:03 -0700)
Fixes: #7967
Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index 3f729b28421a6273fe0b9a082a52c586af6a8156..b7466239699d51cf96360754de0e25c9b9845a08 100644 (file)
@@ -5472,6 +5472,9 @@ void ReplicatedPG::process_copy_chunk(hobject_t oid, ceph_tid_t tid, int r)
     return;
   }
 
+  if (cop->omap.size())
+    cop->results.has_omap = true;
+
   if (r >= 0 && pool.info.require_rollback() && cop->omap.size()) {
     r = -EOPNOTSUPP;
   }
@@ -5668,6 +5671,14 @@ void ReplicatedPG::finish_copyfrom(OpContext *ctx)
     --ctx->delta_stats.num_whiteouts;
   }
 
+  if (cb->results->has_omap) {
+    dout(10) << __func__ << " setting omap flag on " << obs.oi.soid << dendl;
+    obs.oi.set_flag(object_info_t::FLAG_OMAP);
+  } else {
+    dout(10) << __func__ << " clearing omap flag on " << obs.oi.soid << dendl;
+    obs.oi.clear_flag(object_info_t::FLAG_OMAP);
+  }
+
   interval_set<uint64_t> ch;
   if (obs.oi.size > 0)
     ch.insert(0, obs.oi.size);
@@ -5744,6 +5755,11 @@ void ReplicatedPG::finish_promote(int r, OpRequestRef op,
     dout(20) << __func__ << " creating whiteout on " << soid << dendl;
     osd->logger->inc(l_osd_tier_whiteout);
   } else {
+    if (results->has_omap) {
+      dout(10) << __func__ << " setting omap flag on " << soid << dendl;
+      tctx->new_obs.oi.set_flag(object_info_t::FLAG_OMAP);
+    }
+
     tctx->op_t->append(results->final_tx);
     delete results->final_tx;
     results->final_tx = NULL;
@@ -10861,6 +10877,8 @@ bool ReplicatedPG::agent_maybe_evict(ObjectContextRef& obc)
   ctx->at_version = get_next_version();
   assert(ctx->new_obs.exists);
   int r = _delete_oid(ctx, true);
+  if (obc->obs.oi.is_omap())
+    ctx->delta_stats.num_objects_omap--;
   assert(r == 0);
   finish_ctx(ctx, pg_log_entry_t::DELETE);
   simple_repop_submit(repop);
index 4d6000da8c4a1978820f196074d18f33e6deedca..115685225bc4df282c5c69b8931ac7ab8aa0c6dd 100644 (file)
@@ -123,9 +123,11 @@ public:
     librados::snap_set_t snapset; ///< src snapset (if head)
     bool mirror_snapset;
     map<string, bufferlist> attrs; ///< src user attrs
+    bool has_omap;
     CopyResults() : object_size(0), started_temp_obj(false),
                    final_tx(NULL), user_version(0), 
-                   should_requeue(false), mirror_snapset(false) {}
+                   should_requeue(false), mirror_snapset(false),
+                   has_omap(false) {}
   };
 
   struct CopyOp {