You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kvrocks.apache.org by hu...@apache.org on 2022/09/27 01:41:19 UTC

[incubator-kvrocks] branch unstable updated: Return from HRANGE if key wasn't found (#923)

This is an automated email from the ASF dual-hosted git repository.

hulk pushed a commit to branch unstable
in repository https://gitbox.apache.org/repos/asf/incubator-kvrocks.git


The following commit(s) were added to refs/heads/unstable by this push:
     new 31ded36  Return from HRANGE if key wasn't found (#923)
31ded36 is described below

commit 31ded36ad97ca3ca4e3d1a33b2dd4cde0990817e
Author: Yaroslav <to...@gmail.com>
AuthorDate: Tue Sep 27 04:41:14 2022 +0300

    Return from HRANGE if key wasn't found (#923)
---
 src/redis_hash.cc            | 4 +++-
 tests/cppunit/t_hash_test.cc | 9 ++++++++-
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/redis_hash.cc b/src/redis_hash.cc
index 7faadbc..968eed1 100644
--- a/src/redis_hash.cc
+++ b/src/redis_hash.cc
@@ -286,6 +286,7 @@ rocksdb::Status Hash::Range(const Slice &user_key, const Slice &start, const Sli
   AppendNamespacePrefix(user_key, &ns_key);
   HashMetadata metadata(false);
   rocksdb::Status s = GetMetadata(ns_key, &metadata);
+  if (!s.ok()) return s.IsNotFound() ? rocksdb::Status::OK() : s;
   limit = std::min(static_cast<int64_t>(metadata.size), limit);
   std::string start_key, stop_key;
   InternalKey(ns_key, start, metadata.version, storage_->IsSlotIdEncoded()).Encode(&start_key);
@@ -299,7 +300,7 @@ rocksdb::Status Hash::Range(const Slice &user_key, const Slice &start, const Sli
 
   auto iter = DBUtil::UniqueIterator(db_, read_options);
   iter->Seek(start_key);
-  for (int i = 0; iter->Valid() && i <= limit - 1; i++) {
+  for (int64_t i = 0; iter->Valid() && i <= limit - 1; ++i) {
     FieldValue tmp_field_value;
     InternalKey ikey(iter->key(), storage_->IsSlotIdEncoded());
     tmp_field_value.field = ikey.GetSubKey().ToString();
@@ -309,6 +310,7 @@ rocksdb::Status Hash::Range(const Slice &user_key, const Slice &start, const Sli
   }
   return rocksdb::Status::OK();
 }
+
 rocksdb::Status Hash::GetAll(const Slice &user_key, std::vector<FieldValue> *field_values, HashFetchType type) {
   field_values->clear();
 
diff --git a/tests/cppunit/t_hash_test.cc b/tests/cppunit/t_hash_test.cc
index 9ff9b9f..33deda7 100644
--- a/tests/cppunit/t_hash_test.cc
+++ b/tests/cppunit/t_hash_test.cc
@@ -190,4 +190,11 @@ TEST_F(RedisHashTest, HRange) {
     EXPECT_EQ("key2", result[2].field);
     hash->Del(key_);
   }
-}
\ No newline at end of file
+}
+
+TEST_F(RedisHashTest, HRangeNonExistingKey) {
+  std::vector<FieldValue> result;
+  auto s = hash->Range("non-existing-key", "any-start-key", "any-end-key", 10, &result);
+  EXPECT_TRUE(s.ok());
+  EXPECT_EQ(result.size(), 0);
+}