LCOV - code coverage report
Current view: top level - src/leveldb/db - version_edit.cc (source / functions) Hit Total Coverage
Test: coverage.lcov Lines: 131 209 62.7 %
Date: 2022-04-21 14:51:19 Functions: 5 6 83.3 %
Legend: Modified by patch:
Lines: hit not hit | Branches: + taken - not taken # not executed

Not modified by patch:
Lines: hit not hit | Branches: + taken - not taken # not executed
Branches: 56 94 59.6 %

           Branch data     Line data    Source code
#       1                 :            : // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
#       2                 :            : // Use of this source code is governed by a BSD-style license that can be
#       3                 :            : // found in the LICENSE file. See the AUTHORS file for names of contributors.
#       4                 :            : 
#       5                 :            : #include "db/version_edit.h"
#       6                 :            : 
#       7                 :            : #include "db/version_set.h"
#       8                 :            : #include "util/coding.h"
#       9                 :            : 
#      10                 :            : namespace leveldb {
#      11                 :            : 
#      12                 :            : // Tag numbers for serialized VersionEdit.  These numbers are written to
#      13                 :            : // disk and should not be changed.
#      14                 :            : enum Tag {
#      15                 :            :   kComparator = 1,
#      16                 :            :   kLogNumber = 2,
#      17                 :            :   kNextFileNumber = 3,
#      18                 :            :   kLastSequence = 4,
#      19                 :            :   kCompactPointer = 5,
#      20                 :            :   kDeletedFile = 6,
#      21                 :            :   kNewFile = 7,
#      22                 :            :   // 8 was used for large value refs
#      23                 :            :   kPrevLogNumber = 9
#      24                 :            : };
#      25                 :            : 
#      26                 :      12189 : void VersionEdit::Clear() {
#      27                 :      12189 :   comparator_.clear();
#      28                 :      12189 :   log_number_ = 0;
#      29                 :      12189 :   prev_log_number_ = 0;
#      30                 :      12189 :   last_sequence_ = 0;
#      31                 :      12189 :   next_file_number_ = 0;
#      32                 :      12189 :   has_comparator_ = false;
#      33                 :      12189 :   has_log_number_ = false;
#      34                 :      12189 :   has_prev_log_number_ = false;
#      35                 :      12189 :   has_next_file_number_ = false;
#      36                 :      12189 :   has_last_sequence_ = false;
#      37                 :      12189 :   deleted_files_.clear();
#      38                 :      12189 :   new_files_.clear();
#      39                 :      12189 : }
#      40                 :            : 
#      41                 :       5713 : void VersionEdit::EncodeTo(std::string* dst) const {
#      42         [ +  + ]:       5713 :   if (has_comparator_) {
#      43                 :       3411 :     PutVarint32(dst, kComparator);
#      44                 :       3411 :     PutLengthPrefixedSlice(dst, comparator_);
#      45                 :       3411 :   }
#      46         [ +  + ]:       5713 :   if (has_log_number_) {
#      47                 :       3522 :     PutVarint32(dst, kLogNumber);
#      48                 :       3522 :     PutVarint64(dst, log_number_);
#      49                 :       3522 :   }
#      50         [ +  + ]:       5713 :   if (has_prev_log_number_) {
#      51                 :       2302 :     PutVarint32(dst, kPrevLogNumber);
#      52                 :       2302 :     PutVarint64(dst, prev_log_number_);
#      53                 :       2302 :   }
#      54         [ +  + ]:       5713 :   if (has_next_file_number_) {
#      55                 :       3522 :     PutVarint32(dst, kNextFileNumber);
#      56                 :       3522 :     PutVarint64(dst, next_file_number_);
#      57                 :       3522 :   }
#      58         [ +  + ]:       5713 :   if (has_last_sequence_) {
#      59                 :       3522 :     PutVarint32(dst, kLastSequence);
#      60                 :       3522 :     PutVarint64(dst, last_sequence_);
#      61                 :       3522 :   }
#      62                 :            : 
#      63         [ +  + ]:       6002 :   for (size_t i = 0; i < compact_pointers_.size(); i++) {
#      64                 :        289 :     PutVarint32(dst, kCompactPointer);
#      65                 :        289 :     PutVarint32(dst, compact_pointers_[i].first);  // level
#      66                 :        289 :     PutLengthPrefixedSlice(dst, compact_pointers_[i].second.Encode());
#      67                 :        289 :   }
#      68                 :            : 
#      69         [ +  + ]:       5713 :   for (const auto& deleted_file_kvp : deleted_files_) {
#      70                 :        421 :     PutVarint32(dst, kDeletedFile);
#      71                 :        421 :     PutVarint32(dst, deleted_file_kvp.first);   // level
#      72                 :        421 :     PutVarint64(dst, deleted_file_kvp.second);  // file number
#      73                 :        421 :   }
#      74                 :            : 
#      75         [ +  + ]:       7658 :   for (size_t i = 0; i < new_files_.size(); i++) {
#      76                 :       1945 :     const FileMetaData& f = new_files_[i].second;
#      77                 :       1945 :     PutVarint32(dst, kNewFile);
#      78                 :       1945 :     PutVarint32(dst, new_files_[i].first);  // level
#      79                 :       1945 :     PutVarint64(dst, f.number);
#      80                 :       1945 :     PutVarint64(dst, f.file_size);
#      81                 :       1945 :     PutLengthPrefixedSlice(dst, f.smallest.Encode());
#      82                 :       1945 :     PutLengthPrefixedSlice(dst, f.largest.Encode());
#      83                 :       1945 :   }
#      84                 :       5713 : }
#      85                 :            : 
#      86                 :       2550 : static bool GetInternalKey(Slice* input, InternalKey* dst) {
#      87                 :       2550 :   Slice str;
#      88         [ +  - ]:       2550 :   if (GetLengthPrefixedSlice(input, &str)) {
#      89                 :       2550 :     return dst->DecodeFrom(str);
#      90                 :       2550 :   } else {
#      91                 :          0 :     return false;
#      92                 :          0 :   }
#      93                 :       2550 : }
#      94                 :            : 
#      95                 :       1675 : static bool GetLevel(Slice* input, int* level) {
#      96                 :       1675 :   uint32_t v;
#      97 [ +  - ][ +  - ]:       1675 :   if (GetVarint32(input, &v) && v < config::kNumLevels) {
#      98                 :       1675 :     *level = v;
#      99                 :       1675 :     return true;
#     100                 :       1675 :   } else {
#     101                 :          0 :     return false;
#     102                 :          0 :   }
#     103                 :       1675 : }
#     104                 :            : 
#     105                 :       3237 : Status VersionEdit::DecodeFrom(const Slice& src) {
#     106                 :       3237 :   Clear();
#     107                 :       3237 :   Slice input = src;
#     108                 :       3237 :   const char* msg = nullptr;
#     109                 :       3237 :   uint32_t tag;
#     110                 :            : 
#     111                 :            :   // Temporary storage for parsing
#     112                 :       3237 :   int level;
#     113                 :       3237 :   uint64_t number;
#     114                 :       3237 :   FileMetaData f;
#     115                 :       3237 :   Slice str;
#     116                 :       3237 :   InternalKey key;
#     117                 :            : 
#     118 [ +  - ][ +  + ]:      14941 :   while (msg == nullptr && GetVarint32(&input, &tag)) {
#     119                 :      11704 :     switch (tag) {
#     120         [ +  + ]:       2193 :       case kComparator:
#     121         [ +  - ]:       2193 :         if (GetLengthPrefixedSlice(&input, &str)) {
#     122                 :       2193 :           comparator_ = str.ToString();
#     123                 :       2193 :           has_comparator_ = true;
#     124                 :       2193 :         } else {
#     125                 :          0 :           msg = "comparator name";
#     126                 :          0 :         }
#     127                 :       2193 :         break;
#     128                 :            : 
#     129         [ +  + ]:       2264 :       case kLogNumber:
#     130         [ +  - ]:       2264 :         if (GetVarint64(&input, &log_number_)) {
#     131                 :       2264 :           has_log_number_ = true;
#     132                 :       2264 :         } else {
#     133                 :          0 :           msg = "log number";
#     134                 :          0 :         }
#     135                 :       2264 :         break;
#     136                 :            : 
#     137         [ +  + ]:       1044 :       case kPrevLogNumber:
#     138         [ +  - ]:       1044 :         if (GetVarint64(&input, &prev_log_number_)) {
#     139                 :       1044 :           has_prev_log_number_ = true;
#     140                 :       1044 :         } else {
#     141                 :          0 :           msg = "previous log number";
#     142                 :          0 :         }
#     143                 :       1044 :         break;
#     144                 :            : 
#     145         [ +  + ]:       2264 :       case kNextFileNumber:
#     146         [ +  - ]:       2264 :         if (GetVarint64(&input, &next_file_number_)) {
#     147                 :       2264 :           has_next_file_number_ = true;
#     148                 :       2264 :         } else {
#     149                 :          0 :           msg = "next file number";
#     150                 :          0 :         }
#     151                 :       2264 :         break;
#     152                 :            : 
#     153         [ +  + ]:       2264 :       case kLastSequence:
#     154         [ +  - ]:       2264 :         if (GetVarint64(&input, &last_sequence_)) {
#     155                 :       2264 :           has_last_sequence_ = true;
#     156                 :       2264 :         } else {
#     157                 :          0 :           msg = "last sequence number";
#     158                 :          0 :         }
#     159                 :       2264 :         break;
#     160                 :            : 
#     161         [ +  + ]:        212 :       case kCompactPointer:
#     162 [ +  - ][ +  - ]:        212 :         if (GetLevel(&input, &level) && GetInternalKey(&input, &key)) {
#     163                 :        212 :           compact_pointers_.push_back(std::make_pair(level, key));
#     164                 :        212 :         } else {
#     165                 :          0 :           msg = "compaction pointer";
#     166                 :          0 :         }
#     167                 :        212 :         break;
#     168                 :            : 
#     169         [ +  + ]:        294 :       case kDeletedFile:
#     170 [ +  - ][ +  - ]:        294 :         if (GetLevel(&input, &level) && GetVarint64(&input, &number)) {
#     171                 :        294 :           deleted_files_.insert(std::make_pair(level, number));
#     172                 :        294 :         } else {
#     173                 :          0 :           msg = "deleted file";
#     174                 :          0 :         }
#     175                 :        294 :         break;
#     176                 :            : 
#     177         [ +  + ]:       1169 :       case kNewFile:
#     178 [ +  - ][ +  - ]:       1169 :         if (GetLevel(&input, &level) && GetVarint64(&input, &f.number) &&
#     179         [ +  - ]:       1169 :             GetVarint64(&input, &f.file_size) &&
#     180         [ +  - ]:       1169 :             GetInternalKey(&input, &f.smallest) &&
#     181         [ +  - ]:       1169 :             GetInternalKey(&input, &f.largest)) {
#     182                 :       1169 :           new_files_.push_back(std::make_pair(level, f));
#     183                 :       1169 :         } else {
#     184                 :          0 :           msg = "new-file entry";
#     185                 :          0 :         }
#     186                 :       1169 :         break;
#     187                 :            : 
#     188         [ -  + ]:          0 :       default:
#     189                 :          0 :         msg = "unknown tag";
#     190                 :          0 :         break;
#     191                 :      11704 :     }
#     192                 :      11704 :   }
#     193                 :            : 
#     194 [ +  - ][ -  + ]:       3237 :   if (msg == nullptr && !input.empty()) {
#     195                 :          0 :     msg = "invalid tag";
#     196                 :          0 :   }
#     197                 :            : 
#     198                 :       3237 :   Status result;
#     199         [ -  + ]:       3237 :   if (msg != nullptr) {
#     200                 :          0 :     result = Status::Corruption("VersionEdit", msg);
#     201                 :          0 :   }
#     202                 :       3237 :   return result;
#     203                 :       3237 : }
#     204                 :            : 
#     205                 :          0 : std::string VersionEdit::DebugString() const {
#     206                 :          0 :   std::string r;
#     207                 :          0 :   r.append("VersionEdit {");
#     208         [ #  # ]:          0 :   if (has_comparator_) {
#     209                 :          0 :     r.append("\n  Comparator: ");
#     210                 :          0 :     r.append(comparator_);
#     211                 :          0 :   }
#     212         [ #  # ]:          0 :   if (has_log_number_) {
#     213                 :          0 :     r.append("\n  LogNumber: ");
#     214                 :          0 :     AppendNumberTo(&r, log_number_);
#     215                 :          0 :   }
#     216         [ #  # ]:          0 :   if (has_prev_log_number_) {
#     217                 :          0 :     r.append("\n  PrevLogNumber: ");
#     218                 :          0 :     AppendNumberTo(&r, prev_log_number_);
#     219                 :          0 :   }
#     220         [ #  # ]:          0 :   if (has_next_file_number_) {
#     221                 :          0 :     r.append("\n  NextFile: ");
#     222                 :          0 :     AppendNumberTo(&r, next_file_number_);
#     223                 :          0 :   }
#     224         [ #  # ]:          0 :   if (has_last_sequence_) {
#     225                 :          0 :     r.append("\n  LastSeq: ");
#     226                 :          0 :     AppendNumberTo(&r, last_sequence_);
#     227                 :          0 :   }
#     228         [ #  # ]:          0 :   for (size_t i = 0; i < compact_pointers_.size(); i++) {
#     229                 :          0 :     r.append("\n  CompactPointer: ");
#     230                 :          0 :     AppendNumberTo(&r, compact_pointers_[i].first);
#     231                 :          0 :     r.append(" ");
#     232                 :          0 :     r.append(compact_pointers_[i].second.DebugString());
#     233                 :          0 :   }
#     234         [ #  # ]:          0 :   for (const auto& deleted_files_kvp : deleted_files_) {
#     235                 :          0 :     r.append("\n  DeleteFile: ");
#     236                 :          0 :     AppendNumberTo(&r, deleted_files_kvp.first);
#     237                 :          0 :     r.append(" ");
#     238                 :          0 :     AppendNumberTo(&r, deleted_files_kvp.second);
#     239                 :          0 :   }
#     240         [ #  # ]:          0 :   for (size_t i = 0; i < new_files_.size(); i++) {
#     241                 :          0 :     const FileMetaData& f = new_files_[i].second;
#     242                 :          0 :     r.append("\n  AddFile: ");
#     243                 :          0 :     AppendNumberTo(&r, new_files_[i].first);
#     244                 :          0 :     r.append(" ");
#     245                 :          0 :     AppendNumberTo(&r, f.number);
#     246                 :          0 :     r.append(" ");
#     247                 :          0 :     AppendNumberTo(&r, f.file_size);
#     248                 :          0 :     r.append(" ");
#     249                 :          0 :     r.append(f.smallest.DebugString());
#     250                 :          0 :     r.append(" .. ");
#     251                 :          0 :     r.append(f.largest.DebugString());
#     252                 :          0 :   }
#     253                 :          0 :   r.append("\n}\n");
#     254                 :          0 :   return r;
#     255                 :          0 : }
#     256                 :            : 
#     257                 :            : }  // namespace leveldb

Generated by: LCOV version 0-eol-96201-ge66f56f4af6a