CernVM-FS  2.13.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
chunk_detector.h
Go to the documentation of this file.
1 
5 #ifndef CVMFS_INGESTION_CHUNK_DETECTOR_H_
6 #define CVMFS_INGESTION_CHUNK_DETECTOR_H_
7 
8 #include <gtest/gtest_prod.h>
9 #include <stdint.h>
10 
11 #include <algorithm>
12 #include <cstdlib>
13 
14 class BlockItem;
15 
21  public:
23  virtual ~ChunkDetector() { }
24  uint64_t FindNextCutMark(BlockItem *block);
25 
26  virtual bool MightFindChunks(uint64_t size) const = 0;
27 
28  protected:
29  virtual uint64_t DoFindNextCutMark(BlockItem *block) = 0;
30 
36  virtual uint64_t DoCut(uint64_t offset) {
37  last_cut_ = offset;
38  return offset;
39  }
40 
45  virtual uint64_t NoCut(uint64_t /* offset */) { return 0; }
46 
47  uint64_t last_cut() const { return last_cut_; }
48  uint64_t offset() const { return offset_; }
49 
50  private:
51  uint64_t last_cut_;
52  uint64_t offset_;
53 };
54 
55 
61  public:
62  explicit StaticOffsetDetector(uint64_t s) : chunk_size_(s) { }
63  bool MightFindChunks(uint64_t size) const { return size > chunk_size_; }
64 
65  protected:
66  virtual uint64_t DoFindNextCutMark(BlockItem *buffer);
67 
68  private:
69  const uint64_t chunk_size_;
70 };
71 
72 
89 class Xor32Detector : public ChunkDetector {
90  FRIEND_TEST(T_ChunkDetectors, Xor32);
91 
92  public:
93  Xor32Detector(const uint64_t minimal_chunk_size,
94  const uint64_t average_chunk_size,
95  const uint64_t maximal_chunk_size);
96 
97  bool MightFindChunks(const uint64_t size) const {
98  return size > minimal_chunk_size_;
99  }
100 
101  protected:
102  virtual uint64_t DoFindNextCutMark(BlockItem *buffer);
103 
104  virtual uint64_t DoCut(const uint64_t offset) {
105  xor32_ = 0;
106  xor32_ptr_ = offset;
107  return ChunkDetector::DoCut(offset);
108  }
109 
110  virtual uint64_t NoCut(const uint64_t offset) {
111  xor32_ptr_ = offset;
112  return ChunkDetector::NoCut(offset);
113  }
114 
115  inline void xor32(const unsigned char byte) { xor32_ = (xor32_ << 1) ^ byte; }
116 
117  inline bool CheckThreshold() {
118  return abs(static_cast<int32_t>(xor32_) - kMagicNumber) < threshold_;
119  }
120 
121  private:
122  // xor32 only depends on a window of the last 32 bytes in the data stream
123  static const unsigned kXor32Window = 32;
124  static const int32_t kMagicNumber;
125 
126  const uint64_t minimal_chunk_size_;
127  const uint64_t average_chunk_size_;
128  const uint64_t maximal_chunk_size_;
129  const int32_t threshold_;
130 
131  uint64_t xor32_ptr_;
132  uint32_t xor32_;
133 };
134 
135 #endif // CVMFS_INGESTION_CHUNK_DETECTOR_H_
virtual uint64_t DoFindNextCutMark(BlockItem *buffer)
void xor32(const unsigned char byte)
const uint64_t chunk_size_
virtual uint64_t DoCut(const uint64_t offset)
bool MightFindChunks(const uint64_t size) const
const uint64_t maximal_chunk_size_
uint64_t offset_
static const int32_t kMagicNumber
virtual uint64_t NoCut(const uint64_t offset)
uint64_t last_cut_
static const unsigned kXor32Window
FRIEND_TEST(T_ChunkDetectors, Xor32)
virtual uint64_t DoFindNextCutMark(BlockItem *buffer)
uint64_t xor32_ptr_
const uint64_t minimal_chunk_size_
const int32_t threshold_
bool MightFindChunks(uint64_t size) const
uint64_t FindNextCutMark(BlockItem *block)
virtual uint64_t NoCut(uint64_t)
Xor32Detector(const uint64_t minimal_chunk_size, const uint64_t average_chunk_size, const uint64_t maximal_chunk_size)
uint64_t offset() const
virtual ~ChunkDetector()
virtual uint64_t DoCut(uint64_t offset)
static void size_t size
Definition: smalloc.h:54
StaticOffsetDetector(uint64_t s)
virtual bool MightFindChunks(uint64_t size) const =0
bool CheckThreshold()
uint64_t last_cut() const
const uint64_t average_chunk_size_
virtual uint64_t DoFindNextCutMark(BlockItem *block)=0