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

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


The following commit(s) were added to refs/heads/unstable by this push:
     new 4cd4ab75 Make output slice of Metadata::Decode available (#1738)
4cd4ab75 is described below

commit 4cd4ab75948dff1ea76e4f9e24f18633d55380e9
Author: Twice <[email protected]>
AuthorDate: Tue Sep 5 08:51:41 2023 +0900

    Make output slice of Metadata::Decode available (#1738)
---
 src/storage/redis_metadata.cc | 113 +++++++++++++++++-------------------------
 src/storage/redis_metadata.h  |  22 +++++---
 2 files changed, 60 insertions(+), 75 deletions(-)

diff --git a/src/storage/redis_metadata.cc b/src/storage/redis_metadata.cc
index ee0df37f..b3c2aab3 100644
--- a/src/storage/redis_metadata.cc
+++ b/src/storage/redis_metadata.cc
@@ -153,27 +153,29 @@ Metadata::Metadata(RedisType type, bool generate_version, 
bool use_64bit_common_
       version(generate_version ? generateVersion() : 0),
       size(0) {}
 
-rocksdb::Status Metadata::Decode(Slice input) {
-  if (!GetFixed8(&input, &flags)) {
+rocksdb::Status Metadata::Decode(Slice *input) {
+  if (!GetFixed8(input, &flags)) {
     return rocksdb::Status::InvalidArgument(kErrMetadataTooShort);
   }
 
-  if (!GetExpire(&input)) {
+  if (!GetExpire(input)) {
     return rocksdb::Status::InvalidArgument(kErrMetadataTooShort);
   }
 
   if (Type() != kRedisString) {
-    if (input.size() < 8 + CommonEncodedSize()) {
+    if (input->size() < 8 + CommonEncodedSize()) {
       return rocksdb::Status::InvalidArgument(kErrMetadataTooShort);
     }
-    GetFixed64(&input, &version);
-    GetFixedCommon(&input, &size);
+    GetFixed64(input, &version);
+    GetFixedCommon(input, &size);
   }
 
   return rocksdb::Status::OK();
 }
 
-void Metadata::Encode(std::string *dst) {
+rocksdb::Status Metadata::Decode(Slice input) { return Decode(&input); }
+
+void Metadata::Encode(std::string *dst) const {
   PutFixed8(dst, flags);
   PutExpire(dst);
   if (Type() != kRedisString) {
@@ -317,29 +319,27 @@ bool Metadata::Expired() const { return 
ExpireAt(util::GetTimeStampMS()); }
 ListMetadata::ListMetadata(bool generate_version)
     : Metadata(kRedisList, generate_version), head(UINT64_MAX / 2), tail(head) 
{}
 
-void ListMetadata::Encode(std::string *dst) {
+void ListMetadata::Encode(std::string *dst) const {
   Metadata::Encode(dst);
   PutFixed64(dst, head);
   PutFixed64(dst, tail);
 }
 
-rocksdb::Status ListMetadata::Decode(Slice input) {
-  GetFixed8(&input, &flags);
-  GetExpire(&input);
-  if (Type() != kRedisString) {
-    if (input.size() < 8 + CommonEncodedSize()) return 
rocksdb::Status::InvalidArgument(kErrMetadataTooShort);
-    GetFixed64(&input, &version);
-    GetFixedCommon(&input, &size);
+rocksdb::Status ListMetadata::Decode(Slice *input) {
+  if (auto s = Metadata::Decode(input); !s.ok()) {
+    return s;
   }
   if (Type() == kRedisList) {
-    if (input.size() < 8 + 8) return 
rocksdb::Status::InvalidArgument(kErrMetadataTooShort);
-    GetFixed64(&input, &head);
-    GetFixed64(&input, &tail);
+    if (input->size() < 8 + 8) {
+      return rocksdb::Status::InvalidArgument(kErrMetadataTooShort);
+    }
+    GetFixed64(input, &head);
+    GetFixed64(input, &tail);
   }
   return rocksdb::Status::OK();
 }
 
-void StreamMetadata::Encode(std::string *dst) {
+void StreamMetadata::Encode(std::string *dst) const {
   Metadata::Encode(dst);
 
   PutFixed64(dst, last_generated_id.ms);
@@ -361,50 +361,40 @@ void StreamMetadata::Encode(std::string *dst) {
   PutFixed64(dst, group_number);
 }
 
-rocksdb::Status StreamMetadata::Decode(Slice input) {
-  if (!GetFixed8(&input, &flags)) {
-    return rocksdb::Status::InvalidArgument(kErrMetadataTooShort);
-  }
-  if (!GetExpire(&input)) {
-    return rocksdb::Status::InvalidArgument(kErrMetadataTooShort);
-  }
-
-  if (input.size() < 8 + CommonEncodedSize()) {
-    return rocksdb::Status::InvalidArgument(kErrMetadataTooShort);
+rocksdb::Status StreamMetadata::Decode(Slice *input) {
+  if (auto s = Metadata::Decode(input); !s.ok()) {
+    return s;
   }
 
-  GetFixed64(&input, &version);
-  GetFixedCommon(&input, &size);
-
-  if (input.size() < 88) {
+  if (input->size() < 8 * 11) {
     return rocksdb::Status::InvalidArgument(kErrMetadataTooShort);
   }
 
-  GetFixed64(&input, &last_generated_id.ms);
-  GetFixed64(&input, &last_generated_id.seq);
+  GetFixed64(input, &last_generated_id.ms);
+  GetFixed64(input, &last_generated_id.seq);
 
-  GetFixed64(&input, &recorded_first_entry_id.ms);
-  GetFixed64(&input, &recorded_first_entry_id.seq);
+  GetFixed64(input, &recorded_first_entry_id.ms);
+  GetFixed64(input, &recorded_first_entry_id.seq);
 
-  GetFixed64(&input, &max_deleted_entry_id.ms);
-  GetFixed64(&input, &max_deleted_entry_id.seq);
+  GetFixed64(input, &max_deleted_entry_id.ms);
+  GetFixed64(input, &max_deleted_entry_id.seq);
 
-  GetFixed64(&input, &first_entry_id.ms);
-  GetFixed64(&input, &first_entry_id.seq);
+  GetFixed64(input, &first_entry_id.ms);
+  GetFixed64(input, &first_entry_id.seq);
 
-  GetFixed64(&input, &last_entry_id.ms);
-  GetFixed64(&input, &last_entry_id.seq);
+  GetFixed64(input, &last_entry_id.ms);
+  GetFixed64(input, &last_entry_id.seq);
 
-  GetFixed64(&input, &entries_added);
+  GetFixed64(input, &entries_added);
 
-  if (input.size() >= 8) {
-    GetFixed64(&input, &group_number);
+  if (input->size() >= 8) {
+    GetFixed64(input, &group_number);
   }
 
   return rocksdb::Status::OK();
 }
 
-void BloomChainMetadata::Encode(std::string *dst) {
+void BloomChainMetadata::Encode(std::string *dst) const {
   Metadata::Encode(dst);
 
   PutFixed16(dst, n_filters);
@@ -415,32 +405,21 @@ void BloomChainMetadata::Encode(std::string *dst) {
   PutFixed32(dst, bloom_bytes);
 }
 
-rocksdb::Status BloomChainMetadata::Decode(Slice bytes) {
-  Slice input(bytes);
-  if (!GetFixed8(&input, &flags)) {
-    return rocksdb::Status::InvalidArgument(kErrMetadataTooShort);
-  }
-  if (!GetExpire(&input)) {
-    return rocksdb::Status::InvalidArgument(kErrMetadataTooShort);
+rocksdb::Status BloomChainMetadata::Decode(Slice *input) {
+  if (auto s = Metadata::Decode(input); !s.ok()) {
+    return s;
   }
 
-  if (input.size() < 8 + CommonEncodedSize()) {
-    return rocksdb::Status::InvalidArgument(kErrMetadataTooShort);
-  }
-
-  GetFixed64(&input, &version);
-  GetFixedCommon(&input, &size);
-
-  if (input.size() < 20) {
+  if (input->size() < 20) {
     return rocksdb::Status::InvalidArgument(kErrMetadataTooShort);
   }
 
-  GetFixed16(&input, &n_filters);
-  GetFixed16(&input, &expansion);
+  GetFixed16(input, &n_filters);
+  GetFixed16(input, &expansion);
 
-  GetFixed32(&input, &base_capacity);
-  GetDouble(&input, &error_rate);
-  GetFixed32(&input, &bloom_bytes);
+  GetFixed32(input, &base_capacity);
+  GetDouble(input, &error_rate);
+  GetFixed32(input, &bloom_bytes);
 
   return rocksdb::Status::OK();
 }
diff --git a/src/storage/redis_metadata.h b/src/storage/redis_metadata.h
index 068df149..ea8ca9a4 100644
--- a/src/storage/redis_metadata.h
+++ b/src/storage/redis_metadata.h
@@ -144,8 +144,11 @@ class Metadata {
   timeval Time() const;
   bool Expired() const;
   bool ExpireAt(uint64_t expired_ts) const;
-  virtual void Encode(std::string *dst);
-  virtual rocksdb::Status Decode(Slice input);
+
+  virtual void Encode(std::string *dst) const;
+  virtual rocksdb::Status Decode(Slice *input);
+  rocksdb::Status Decode(Slice input);
+
   bool operator==(const Metadata &that) const;
   virtual ~Metadata() = default;
 
@@ -184,8 +187,9 @@ class ListMetadata : public Metadata {
   uint64_t tail;
   explicit ListMetadata(bool generate_version = true);
 
-  void Encode(std::string *dst) override;
-  rocksdb::Status Decode(Slice input) override;
+  void Encode(std::string *dst) const override;
+  using Metadata::Decode;
+  rocksdb::Status Decode(Slice *input) override;
 };
 
 class StreamMetadata : public Metadata {
@@ -200,8 +204,9 @@ class StreamMetadata : public Metadata {
 
   explicit StreamMetadata(bool generate_version = true) : 
Metadata(kRedisStream, generate_version) {}
 
-  void Encode(std::string *dst) override;
-  rocksdb::Status Decode(Slice input) override;
+  void Encode(std::string *dst) const override;
+  using Metadata::Decode;
+  rocksdb::Status Decode(Slice *input) override;
 };
 
 class BloomChainMetadata : public Metadata {
@@ -239,8 +244,9 @@ class BloomChainMetadata : public Metadata {
 
   explicit BloomChainMetadata(bool generate_version = true) : 
Metadata(kRedisBloomFilter, generate_version) {}
 
-  void Encode(std::string *dst) override;
-  rocksdb::Status Decode(Slice bytes) override;
+  void Encode(std::string *dst) const override;
+  using Metadata::Decode;
+  rocksdb::Status Decode(Slice *bytes) override;
 
   /// Get the total capacity of the bloom chain (the sum capacity of all 
sub-filters)
   ///

Reply via email to