MB-16663: Return only non-deleted keys in CMD_GET_KEYS 05/56505/4
authorManu Dhundi <manu@couchbase.com>
Wed, 28 Oct 2015 22:27:15 +0000 (15:27 -0700)
committerChiyoung Seo <chiyoung@couchbase.com>
Wed, 28 Oct 2015 23:21:08 +0000 (23:21 +0000)
When ns_server issues CMD_GET_KEYS, ep-engine should return only
the non deleted keys. For this couch-kvstore should to pass the flag
COUCHSTORE_NO_DELETES to the function couchstore_all_docs.

Change-Id: Iba13f9fb09a8d46f58df246a0d109120cc035871
Reviewed-on: http://review.couchbase.org/56505
Tested-by: buildbot <build@couchbase.com>
Reviewed-by: Chiyoung Seo <chiyoung@couchbase.com>
src/couch-kvstore/couch-kvstore.cc
tests/ep_testsuite.cc

index 7c856ad..bb29402 100644 (file)
@@ -2413,7 +2413,7 @@ CouchKVStore::getAllKeys(uint16_t vbid, std::string &start_key, uint32_t count,
         ref.buf = (char*) start_key.c_str();
         ref.size = start_key.size();
         AllKeysCtx ctx(cb, count);
-        errCode = couchstore_all_docs(db, &ref, COUCHSTORE_NO_OPTIONS,
+        errCode = couchstore_all_docs(db, &ref, COUCHSTORE_NO_DELETES,
                                       populateAllKeys,
                                       static_cast<void *>(&ctx));
         closeDatabaseHandle(db);
index 63a8421..23966df 100644 (file)
@@ -9028,48 +9028,55 @@ static enum test_result test_not_my_vbucket_with_cluster_config(ENGINE_HANDLE *h
 
 static enum test_result test_all_keys_api(ENGINE_HANDLE *h, ENGINE_HANDLE_V1 *h1) {
     std::vector<std::string> keys;
-    for (int i = 0; i < 100; ++i) {
-        std::stringstream ss;
-        ss << "key_" << i;
-        std::string key(ss.str());
+    const int start_key_idx = 10, del_key_idx = 12, num_keys = 5,
+              total_keys = 100;
+
+    for (uint32_t i = 0; i < total_keys; ++i) {
+        std::string key("key_" + std::to_string(i));
         keys.push_back(key);
     }
     std::vector<std::string>::iterator it;
     for (it = keys.begin(); it != keys.end(); ++it) {
         item *itm;
-        check(store(h, h1, NULL, OPERATION_SET, it->c_str(), it->c_str(),
-                    &itm, 0, 0) == ENGINE_SUCCESS, "Failed to store a value");
+        checkeq(ENGINE_SUCCESS, store(h, h1, NULL, OPERATION_SET, it->c_str(),
+                                      it->c_str(), &itm, 0, 0),
+                "Failed to store a value");
         h1->release(h, NULL, itm);
     }
+    std::string del_key("key_" + std::to_string(del_key_idx));
+    checkeq(ENGINE_SUCCESS, del(h, h1, del_key.c_str(), 0, 0),
+            "Failed to delete key");
     wait_for_flusher_to_settle(h, h1);
-    check(get_int_stat(h, h1, "curr_items") == 100,
-            "Item count should've been 100");
+    checkeq(total_keys - 1, get_int_stat(h, h1, "curr_items"),
+            "Item count mismatch");
 
-    const char key[] = "key_10";
-    const uint16_t keylen = strlen(key);
-    uint32_t count = htonl(5);
+    std::string start_key("key_" + std::to_string(start_key_idx));
+    const uint16_t keylen = start_key.length();
+    uint32_t count = htonl(num_keys);
 
     protocol_binary_request_header *pkt1 =
         createPacket(CMD_GET_KEYS, 0, 0, reinterpret_cast<char*>(&count),
-                     sizeof(count), key, keylen, NULL, 0, 0x00);
+                     sizeof(count), start_key.c_str(), keylen, NULL, 0, 0x00);
 
-    check(h1->unknown_command(h, NULL, pkt1, add_response) == ENGINE_SUCCESS,
+    checkeq(ENGINE_SUCCESS, h1->unknown_command(h, NULL, pkt1, add_response),
             "Failed to get all_keys, sort: ascending");
     free(pkt1);
 
-    //Check the keys.
-    size_t start_num = 10;
+    /* Check the keys. */
     size_t offset = 0;
-    for (size_t i = 0; i < 5; ++i) {
+    /* Since we have one deleted key, we must go till num_keys + 1 */
+    for (size_t i = 0; i < num_keys + 1; ++i) {
+        if (del_key_idx == start_key_idx + i) {
+            continue;
+        }
         uint16_t len;
         memcpy(&len, last_body.data() + offset, sizeof(uint16_t));
         len = ntohs(len);
         checkeq(keylen, len, "Key length mismatch in all_docs response");
-        std::stringstream ss;
-        ss << "key_" << start_num++;
+        std::string key("key_" + std::to_string(start_key_idx + i));
         offset += sizeof(uint16_t);
-        check(last_body.compare(offset, keylen, ss.str().c_str())
-              == 0, "Key mismatch in all_keys response");
+        checkeq(0, last_body.compare(offset, keylen, key.c_str()),
+                "Key mismatch in all_keys response");
         offset += keylen;
     }