]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/ReplicatedPG: add PROMOTE log entry type
authorSage Weil <sage@inktank.com>
Fri, 27 Dec 2013 01:31:01 +0000 (17:31 -0800)
committerSage Weil <sage@inktank.com>
Tue, 14 Jan 2014 00:19:39 +0000 (16:19 -0800)
This is an alternative to MODIFY that indicates the object was just
promoted from another tier.  Thanksfully, is_modify() is used in very
few places!

Signed-off-by: Sage Weil <sage@inktank.com>
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h
src/osd/osd_types.h

index 788108a277c457faef5c53f6a911b27bed5809c6..1dd4f927f0616b18f97259b162c8f9151dd9b239 100644 (file)
@@ -4539,15 +4539,19 @@ int ReplicatedPG::prepare_transaction(OpContext *ctx)
   // clone, if necessary
   make_writeable(ctx);
 
-  finish_ctx(ctx);
+  finish_ctx(ctx,
+            ctx->new_obs.exists ? pg_log_entry_t::MODIFY :
+            pg_log_entry_t::DELETE);
 
   return result;
 }
 
-void ReplicatedPG::finish_ctx(OpContext *ctx)
+void ReplicatedPG::finish_ctx(OpContext *ctx, int log_op_type)
 {
   const hobject_t& soid = ctx->obs->oi.soid;
-  dout(20) << __func__ << " " << soid << " " << ctx << dendl;
+  dout(20) << __func__ << " " << soid << " " << ctx
+          << " op " << pg_log_entry_t::get_op_name(log_op_type)
+          << dendl;
 
   // snapset
   bufferlist bss;
@@ -4635,10 +4639,7 @@ void ReplicatedPG::finish_ctx(OpContext *ctx)
   }
 
   // append to log
-  int logopcode = pg_log_entry_t::MODIFY;
-  if (!ctx->new_obs.exists)
-    logopcode = pg_log_entry_t::DELETE;
-  ctx->log.push_back(pg_log_entry_t(logopcode, soid, ctx->at_version,
+  ctx->log.push_back(pg_log_entry_t(log_op_type, soid, ctx->at_version,
                                    ctx->obs->oi.version,
                                    ctx->user_at_version, ctx->reqid,
                                    ctx->mtime));
@@ -5061,7 +5062,8 @@ void ReplicatedPG::finish_promote(int r, OpRequestRef op,
   tctx->lock_to_release = OpContext::W_LOCK;
   dout(20) << __func__ << " took lock on obc, " << obc->rwstate << dendl;
 
-  finish_ctx(tctx);
+  finish_ctx(tctx, pg_log_entry_t::PROMOTE);
+
   simple_repop_submit(repop);
 }
 
@@ -5315,7 +5317,7 @@ int ReplicatedPG::try_flush_mark_clean(FlushOpRef fop)
   ctx->new_obs.oi.clear_flag(object_info_t::FLAG_DIRTY);
   --ctx->delta_stats.num_objects_dirty;
 
-  finish_ctx(ctx);
+  finish_ctx(ctx, pg_log_entry_t::MODIFY);
 
   if (!fop->dup_ops.empty()) {
     dout(20) << __func__ << " queueing dups for " << ctx->at_version << dendl;
index 284635970dc236b4f4875a5776bb7dabc0a46f46..c19e79378c5aeceaf1b7f21007c366ee14ef26d2 100644 (file)
@@ -775,7 +775,7 @@ protected:
                   const hobject_t& head, const hobject_t& coid,
                   object_info_t *poi);
   void execute_ctx(OpContext *ctx);
-  void finish_ctx(OpContext *ctx);
+  void finish_ctx(OpContext *ctx, int log_op_type);
   void reply_ctx(OpContext *ctx, int err);
   void reply_ctx(OpContext *ctx, int err, eversion_t v, version_t uv);
   void make_writeable(OpContext *ctx);
index 11005b56575238cfbd51934db73e3c75af1668bb..2608b529d0eb2ce5f3f0c2925b2ccb55f4f6784b 100644 (file)
@@ -1578,18 +1578,21 @@ inline ostream& operator<<(ostream& out, const pg_query_t& q) {
  */
 struct pg_log_entry_t {
   enum {
-    MODIFY = 1,
-    CLONE = 2,
-    DELETE = 3,
+    MODIFY = 1,   // some unspecified modification (but not *all* modifications)
+    CLONE = 2,    // cloned object from head
+    DELETE = 3,   // deleted object
     BACKLOG = 4,  // event invented by generate_backlog [deprecated]
     LOST_REVERT = 5, // lost new version, revert to an older version.
     LOST_DELETE = 6, // lost new version, revert to no object (deleted).
     LOST_MARK = 7,   // lost new version, now EIO
+    PROMOTE = 8,     // promoted object from another tier
   };
   static const char *get_op_name(int op) {
     switch (op) {
     case MODIFY:
       return "modify  ";
+    case PROMOTE:
+      return "promote ";
     case CLONE:
       return "clone   ";
     case DELETE:
@@ -1636,13 +1639,14 @@ struct pg_log_entry_t {
       
   bool is_clone() const { return op == CLONE; }
   bool is_modify() const { return op == MODIFY; }
+  bool is_promote() const { return op == PROMOTE; }
   bool is_backlog() const { return op == BACKLOG; }
   bool is_lost_revert() const { return op == LOST_REVERT; }
   bool is_lost_delete() const { return op == LOST_DELETE; }
   bool is_lost_mark() const { return op == LOST_MARK; }
 
   bool is_update() const {
-    return is_clone() || is_modify() || is_backlog() || is_lost_revert() || is_lost_mark();
+    return is_clone() || is_modify() || is_promote() || is_backlog() || is_lost_revert() || is_lost_mark();
   }
   bool is_delete() const {
     return op == DELETE || op == LOST_DELETE;