]> git-server-git.apps.pok.os.sepia.ceph.com Git - rocksdb.git/commitdiff
Adding Sanity checks in Get and Iterator->value for ttl 1.5.9.1.fb
authorMayank Agarwal <amayank@fb.com>
Fri, 10 May 2013 00:33:27 +0000 (17:33 -0700)
committerMayank Agarwal <amayank@fb.com>
Fri, 10 May 2013 01:25:52 +0000 (18:25 -0700)
Summary: The 2 checks added will increase reliabilty and help in debugging

Test Plan: make ttl_test;./ttl_test

Reviewers: vamsi, dhruba, sheki, haobo

Reviewed By: vamsi

Differential Revision: https://reviews.facebook.net/D10713

utilities/ttl/db_ttl.cc
utilities/ttl/db_ttl.h

index c24719582cc46948b5e1afc479da1c76f0fb4c90..a1ea38a1436cb51eeaa4442e6d582902676cd8d0 100644 (file)
@@ -53,7 +53,7 @@ class TtlIterator : public Iterator {
   }
 
   Slice value() const {
-    assert(iter_->value().size() >= (unsigned)ts_len_);
+    assert(DBWithTTL::SanityCheckTimestamp(iter_->value().ToString()).ok());
     Slice trimmed_value = iter_->value();
     trimmed_value.size_ -= ts_len_;
     return trimmed_value;
@@ -130,6 +130,22 @@ Status DBWithTTL::AppendTS(const Slice& val, std::string& val_with_ts) {
   return st;
 }
 
+// Returns corruption if the length of the string is lesser than timestamp, or
+// timestamp refers to a time lesser than ttl-feature release time
+Status DBWithTTL::SanityCheckTimestamp(const std::string& str) {
+  if (str.length() < (unsigned)kTSLength) {
+    return Status::Corruption("Error: value's length less than timestamp's\n");
+  }
+  // Checks that TS is not lesser than kMinTimestamp
+  // Gaurds against corruption & normal database opened incorrectly in ttl mode
+  int32_t timestamp_value =
+    DecodeFixed32(str.data() + str.size() - kTSLength);
+  if (timestamp_value < kMinTimestamp){
+    return Status::Corruption("Error: Timestamp < ttl feature release time!\n");
+  }
+  return Status::OK();
+}
+
 // Checks if the string is stale or not according to TTl provided
 bool DBWithTTL::IsStale(const Slice& value, int32_t ttl) {
   if (ttl <= 0) { // Data is fresh if TTL is non-positive
@@ -151,9 +167,6 @@ bool DBWithTTL::IsStale(const Slice& value, int32_t ttl) {
 // Strips the TS from the end of the string
 Status DBWithTTL::StripTS(std::string* str) {
   Status st;
-  if (str->length() < (unsigned)kTSLength) {
-    return Status::IOError("Error: value's length less than timestamp's\n");
-  }
   // Erasing characters which hold the TS
   str->erase(str->length() - kTSLength, kTSLength);
   return st;
@@ -178,6 +191,10 @@ Status DBWithTTL::Get(const ReadOptions& options,
   if (!st.ok()) {
     return st;
   }
+  st = SanityCheckTimestamp(*value);
+  if (!st.ok()) {
+    return st;
+  }
   return StripTS(value);
 }
 
index e20c46e7c43abb6c66fcc26e6ffcc3fa055745b2..e02472db8605d720fd45fe565eb94555a3f7a6cd 100644 (file)
@@ -76,12 +76,16 @@ class DBWithTTL : public DB {
 
   static Status AppendTS(const Slice& val, std::string& val_with_ts);
 
+  static Status SanityCheckTimestamp(const std::string& str);
+
   static Status StripTS(std::string* str);
 
   static Status GetCurrentTime(int32_t& curtime);
 
   static const int32_t kTSLength = sizeof(int32_t); // size of timestamp
 
+  static const int32_t kMinTimestamp = 1368146402; // 05/09/2013:5:40PM
+
  private:
   DB* db_;
   int32_t ttl_;