From d1d603cd94328ce09cae983501774e42a9bef6a7 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 12 May 2020 12:33:04 -0500 Subject: [PATCH] common/CDC: add abstract interface Signed-off-by: Sage Weil --- src/common/CDC.cc | 20 ++++++++++++++++++++ src/common/CDC.h | 25 +++++++++++++++++++++++++ src/common/CMakeLists.txt | 1 + src/common/rabin.h | 14 ++++++++++++-- 4 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 src/common/CDC.cc create mode 100644 src/common/CDC.h diff --git a/src/common/CDC.cc b/src/common/CDC.cc new file mode 100644 index 0000000000000..ee83738fea3b7 --- /dev/null +++ b/src/common/CDC.cc @@ -0,0 +1,20 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include + +#include "CDC.h" +#include "rabin.h" + +std::unique_ptr CDC::create( + const std::string& type, + int bits, + int windowbits) +{ + if (type == "rabin") { + auto p = new RabinChunk(); + p->set_target_bits(bits, windowbits); + return std::unique_ptr(p); + } + return nullptr; +} diff --git a/src/common/CDC.h b/src/common/CDC.h new file mode 100644 index 0000000000000..4a90afa3a471a --- /dev/null +++ b/src/common/CDC.h @@ -0,0 +1,25 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#pragma once + +#include +#include + +#include "include/buffer.h" + +class CDC { +public: + virtual ~CDC() = default; + + virtual void calc_chunks( + ceph::buffer::list& inputdata, + std::vector> *chunks) = 0; + + virtual void set_target_bits(int bits, int windowbits = 2) = 0; + + static std::unique_ptr create( + const std::string& type, + int bits, + int windowbits = 0); +}; diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index b491e1d50ecbf..2f7e27f942fb8 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -16,6 +16,7 @@ set(common_srcs BackTrace.cc ConfUtils.cc Cycles.cc + CDC.cc DecayCounter.cc Finisher.cc Formatter.cc diff --git a/src/common/rabin.h b/src/common/rabin.h index 163610ee19761..607928a510ca5 100644 --- a/src/common/rabin.h +++ b/src/common/rabin.h @@ -19,9 +19,10 @@ #include #include +#include "CDC.h" #include "include/buffer_fwd.h" -class RabinChunk { +class RabinChunk : public CDC { public: RabinChunk(uint32_t window_size, uint32_t rabin_prime, uint64_t mod_prime, uint64_t pow, std::vector rabin_mask, @@ -48,6 +49,12 @@ public: rabin_mask = _rabin_mask; } + void calc_chunks( + ceph::buffer::list& inputdata, + std::vector> *chunks) override { + do_rabin_chunks(inputdata, *chunks); + } + int do_rabin_chunks(ceph::buffer::list& inputdata, std::vector>& chunks, uint64_t min=0, uint64_t max=0); @@ -76,8 +83,11 @@ public: } // most users should use this - void set_target_bits(int bits, int windowbits = 2) { + void set_target_bits(int bits, int windowbits=0) override { set_numbits(bits); + if (!windowbits) { + windowbits = 2; + } set_min_chunk(1 << (bits - windowbits)); set_max_chunk(1 << (bits + windowbits)); } -- 2.39.5