public:
virtual ~CDC() = default;
+ /// calculate chunk boundaries as vector of (offset, length) pairs
virtual void calc_chunks(
const bufferlist& inputdata,
- std::vector<std::pair<uint64_t, uint64_t>> *chunks) = 0;
+ std::vector<std::pair<uint64_t, uint64_t>> *chunks) const = 0;
+ /// set target chunk size as a power of 2, and number of bits for hard min/max
virtual void set_target_bits(int bits, int windowbits = 2) = 0;
static std::unique_ptr<CDC> create(
size_t& pos,
size_t max, // how much to read
uint64_t& fp, // fingerprint
- uint64_t mask, uint64_t *table)
+ uint64_t mask, const uint64_t *table)
{
while (pos < max) {
if (*pp == *pe) {
void FastCDC::calc_chunks(
const bufferlist& bl,
- std::vector<std::pair<uint64_t, uint64_t>> *chunks)
+ std::vector<std::pair<uint64_t, uint64_t>> *chunks) const
{
if (bl.length() == 0) {
return;
void calc_chunks(
const bufferlist& bl,
- std::vector<std::pair<uint64_t, uint64_t>> *chunks) override;
+ std::vector<std::pair<uint64_t, uint64_t>> *chunks) const override;
};
void FixedCDC::calc_chunks(
const bufferlist& bl,
- std::vector<std::pair<uint64_t, uint64_t>> *chunks)
+ std::vector<std::pair<uint64_t, uint64_t>> *chunks) const
{
size_t len = bl.length();
if (!len) {
}
void calc_chunks(
const bufferlist& bl,
- std::vector<std::pair<uint64_t, uint64_t>> *chunks) override;
+ std::vector<std::pair<uint64_t, uint64_t>> *chunks) const override;
};
#include "rabin.h"
-uint64_t RabinChunk::gen_rabin_hash(char* chunk_data, uint64_t off, uint64_t len) {
+uint64_t RabinChunk::gen_rabin_hash(char* chunk_data, uint64_t off, uint64_t len) const {
uint64_t roll_sum = 0;
uint64_t data_len = len;
if (data_len == 0) {
return roll_sum;
}
-bool RabinChunk::end_of_chunk(const uint64_t fp , int numbits) {
+bool RabinChunk::end_of_chunk(const uint64_t fp , int numbits) const {
return ((fp & rabin_mask[numbits]) == 0) ;
}
int RabinChunk::do_rabin_chunks(ceph::buffer::list& inputdata,
std::vector<std::pair<uint64_t, uint64_t>>& chunks,
- uint64_t min_val, uint64_t max_val)
+ uint64_t min_val, uint64_t max_val) const
{
char *ptr = inputdata.c_str();
uint64_t data_size = inputdata.length();
void calc_chunks(
const ceph::buffer::list& inputdata,
- std::vector<std::pair<uint64_t, uint64_t>> *chunks) override {
+ std::vector<std::pair<uint64_t, uint64_t>> *chunks) const override {
bufferlist b = inputdata;
do_rabin_chunks(b, *chunks);
}
int do_rabin_chunks(ceph::buffer::list& inputdata,
std::vector<std::pair<uint64_t, uint64_t>>& chunks,
- uint64_t min=0, uint64_t max=0);
- uint64_t gen_rabin_hash(char* chunk_data, uint64_t off, uint64_t len = 0);
+ uint64_t min=0, uint64_t max=0) const;
+ uint64_t gen_rabin_hash(char* chunk_data, uint64_t off, uint64_t len = 0) const;
void set_window_size(uint32_t size) { window_size = size; }
void set_rabin_prime(uint32_t r_prime) { rabin_prime = r_prime; }
void set_mod_prime(uint64_t m_prime) { mod_prime = m_prime; }
}
private:
- bool end_of_chunk(const uint64_t fp , int numbits);
+ bool end_of_chunk(const uint64_t fp , int numbits) const;
uint32_t window_size;
uint32_t rabin_prime;