MB-20852 [16/N]: Add queue_op::set_vbucket_state meta-item 49/69149/7
authorDave Rigby <daver@couchbase.com>
Mon, 24 Oct 2016 11:01:15 +0000 (12:01 +0100)
committerDave Rigby <daver@couchbase.com>
Tue, 1 Nov 2016 08:06:16 +0000 (08:06 +0000)
Add a new meta-item to queue_op enum - set_vbucket_state. This will be
used to mark that a VBucket should have it's state persisted.

Change-Id: I108befd70933962d262529ee230382e47c64e31a
Reviewed-on: http://review.couchbase.org/69149
Reviewed-by: Trond Norbye <trond.norbye@gmail.com>
Tested-by: buildbot <build@couchbase.com>
src/checkpoint.cc
src/item.cc
src/item.h
src/tapconnection.cc
src/tapconnection.h

index 0acc56f..1009f67 100644 (file)
@@ -1676,6 +1676,11 @@ queued_item CheckpointManager::createCheckpointItem(uint64_t id, uint16_t vbid,
         key = "dummy_key";
         bySeqno = lastBySeqno;
         break;
+    case queue_op::set_vbucket_state:
+        key = "set_vbucket_state";
+        bySeqno = lastBySeqno + 1;
+        break;
+
     default:
         throw std::invalid_argument("CheckpointManager::createCheckpointItem:"
                         "checkpoint_op (which is " +
index 694c8b5..ef2b939 100644 (file)
@@ -32,6 +32,7 @@ std::string to_string(queue_op op) {
         case queue_op::empty: return "empty";
         case queue_op::checkpoint_start: return "checkpoint_start";
         case queue_op::checkpoint_end: return "checkpoint_end";
+        case queue_op::set_vbucket_state: return "set_vbucket_state";
     }
     return "<" +
             std::to_string(static_cast<std::underlying_type<queue_op>::type>(op)) +
index e08646a..f1b7b7e 100644 (file)
@@ -74,6 +74,11 @@ enum class queue_op : uint8_t {
     /// (meta item) Marker for the end of a checkpoint. Only exists in closed
     /// checkpoints, where it is always the last item in the checkpoint.
     checkpoint_end,
+
+    /// (meta item) Marker to persist the VBucket's state (vbucket_state) to
+    /// disk. No data (value) associated with it, simply acts as a marker
+    /// to ensure a non-empty persistence queue.
+    set_vbucket_state,
 };
 
 /// Return a string representation of queue_op.
@@ -660,7 +665,20 @@ public:
      * Should this item be persisted?
      */
     bool shouldPersist() const {
-        return !isCheckPointMetaItem();
+        switch (op) {
+            case queue_op::set:
+            case queue_op::del:
+                return true;
+            case queue_op::flush:
+            case queue_op::empty:
+            case queue_op::checkpoint_start:
+            case queue_op::checkpoint_end:
+                return false;
+            case queue_op::set_vbucket_state:
+                return true;
+        }
+        // Silence GCC warning
+        return false;
     }
 
     /*
@@ -683,6 +701,7 @@ public:
             case queue_op::empty:
             case queue_op::checkpoint_start:
             case queue_op::checkpoint_end:
+            case queue_op::set_vbucket_state:
                 return true;
         }
         // Silence GCC warning
index f57ee91..cfeaccb 100644 (file)
@@ -1285,6 +1285,9 @@ queued_item TapProducer::nextFgFetched_UNLOCKED(bool &shouldPause) {
                     ++open_checkpoint_count;
                 }
                 break;
+            case queue_op::set_vbucket_state:
+                // Ignored by TAP
+                break;
             }
         }
 
index 8842775..e6171fd 100644 (file)
@@ -159,6 +159,9 @@ public:
         case queue_op::checkpoint_end:
             event_ = TAP_CHECKPOINT_END;
             break;
+        case queue_op::set_vbucket_state:
+            // Ignored by TAP
+            break;
         }
     }