Bitcoin
log_reader.h
Go to the documentation of this file.
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 #ifndef STORAGE_LEVELDB_DB_LOG_READER_H_
6 #define STORAGE_LEVELDB_DB_LOG_READER_H_
7 
8 #include <stdint.h>
9 
10 #include "db/log_format.h"
11 #include "leveldb/slice.h"
12 #include "leveldb/status.h"
13 
14 namespace leveldb {
15 
16 class SequentialFile;
17 
18 namespace log {
19 
20 class Reader {
21  public:
22  // Interface for reporting errors.
23  class Reporter {
24  public:
25  virtual ~Reporter();
26 
27  // Some corruption was detected. "size" is the approximate number
28  // of bytes dropped due to the corruption.
29  virtual void Corruption(size_t bytes, const Status& status) = 0;
30  };
31 
32  // Create a reader that will return log records from "*file".
33  // "*file" must remain live while this Reader is in use.
34  //
35  // If "reporter" is non-NULL, it is notified whenever some data is
36  // dropped due to a detected corruption. "*reporter" must remain
37  // live while this Reader is in use.
38  //
39  // If "checksum" is true, verify checksums if available.
40  //
41  // The Reader will start reading at the first record located at physical
42  // position >= initial_offset within the file.
43  Reader(SequentialFile* file, Reporter* reporter, bool checksum,
44  uint64_t initial_offset);
45 
46  ~Reader();
47 
48  // Read the next record into *record. Returns true if read
49  // successfully, false if we hit end of the input. May use
50  // "*scratch" as temporary storage. The contents filled in *record
51  // will only be valid until the next mutating operation on this
52  // reader or the next mutation to *scratch.
53  bool ReadRecord(Slice* record, std::string* scratch);
54 
55  // Returns the physical offset of the last record returned by ReadRecord.
56  //
57  // Undefined before the first call to ReadRecord.
59 
60  private:
63  bool const checksum_;
64  char* const backing_store_;
66  bool eof_; // Last Read() indicated EOF by returning < kBlockSize
67 
68  // Offset of the last record returned by ReadRecord.
70  // Offset of the first location past the end of buffer_.
72 
73  // Offset at which to start looking for the first record to return
75 
76  // True if we are resynchronizing after a seek (initial_offset_ > 0). In
77  // particular, a run of kMiddleType and kLastType records can be silently
78  // skipped in this mode
79  bool resyncing_;
80 
81  // Extend record types with the following special values
82  enum {
84  // Returned whenever we find an invalid physical record.
85  // Currently there are three situations in which this happens:
86  // * The record has an invalid CRC (ReadPhysicalRecord reports a drop)
87  // * The record is a 0-length record (No drop is reported)
88  // * The record is below constructor's initial_offset (No drop is reported)
90  };
91 
92  // Skips all blocks that are completely before "initial_offset_".
93  //
94  // Returns true on success. Handles reporting.
95  bool SkipToInitialBlock();
96 
97  // Return type, or one of the preceding special values
98  unsigned int ReadPhysicalRecord(Slice* result);
99 
100  // Reports dropped bytes to the reporter.
101  // buffer_ must be updated to remove the dropped bytes prior to invocation.
102  void ReportCorruption(uint64_t bytes, const char* reason);
103  void ReportDrop(uint64_t bytes, const Status& reason);
104 
105  // No copying allowed
106  Reader(const Reader&);
107  void operator=(const Reader&);
108 };
109 
110 } // namespace log
111 } // namespace leveldb
112 
113 #endif // STORAGE_LEVELDB_DB_LOG_READER_H_
Definition: env.h:170
Definition: autocompact_test.cc:11
virtual ~Reporter()
Definition: log_reader.cc:15
Definition: log_reader.h:20
bool const checksum_
Definition: log_reader.h:63
Reader(SequentialFile *file, Reporter *reporter, bool checksum, uint64_t initial_offset)
Definition: log_reader.cc:18
Reporter *const reporter_
Definition: log_reader.h:62
void operator=(const Reader &)
uint64_t last_record_offset_
Definition: log_reader.h:69
bool ReadRecord(Slice *record, std::string *scratch)
Definition: log_reader.cc:60
bool SkipToInitialBlock()
Definition: log_reader.cc:36
uint64_t end_of_buffer_offset_
Definition: log_reader.h:71
unsigned long long uint64_t
Definition: stdint.h:22
SequentialFile *const file_
Definition: log_reader.h:61
Definition: slice.h:25
char *const backing_store_
Definition: log_reader.h:64
def checksum(v)
Definition: base58.py:82
unsigned int ReadPhysicalRecord(Slice *result)
Definition: log_reader.cc:199
bool resyncing_
Definition: log_reader.h:79
file
Definition: linearize-hashes.py:138
bool eof_
Definition: log_reader.h:66
uint64_t const initial_offset_
Definition: log_reader.h:74
Definition: log_reader.h:83
virtual void Corruption(size_t bytes, const Status &status)=0
Definition: status.h:21
Slice buffer_
Definition: log_reader.h:65
Definition: log_reader.h:23
Definition: log_reader.h:89
uint64_t LastRecordOffset()
Definition: log_reader.cc:184
~Reader()
Definition: log_reader.cc:32
void ReportCorruption(uint64_t bytes, const char *reason)
Definition: log_reader.cc:188
void ReportDrop(uint64_t bytes, const Status &reason)
Definition: log_reader.cc:192
static const int kMaxRecordType
Definition: log_format.h:25