]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
common/CDC: add abstract interface
authorSage Weil <sage@newdream.net>
Tue, 12 May 2020 17:33:04 +0000 (12:33 -0500)
committerSage Weil <sage@newdream.net>
Wed, 27 May 2020 12:47:27 +0000 (07:47 -0500)
Signed-off-by: Sage Weil <sage@newdream.net>
src/common/CDC.cc [new file with mode: 0644]
src/common/CDC.h [new file with mode: 0644]
src/common/CMakeLists.txt
src/common/rabin.h

diff --git a/src/common/CDC.cc b/src/common/CDC.cc
new file mode 100644 (file)
index 0000000..ee83738
--- /dev/null
@@ -0,0 +1,20 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include <random>
+
+#include "CDC.h"
+#include "rabin.h"
+
+std::unique_ptr<CDC> 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<CDC>(p);
+  }
+  return nullptr;
+}
diff --git a/src/common/CDC.h b/src/common/CDC.h
new file mode 100644 (file)
index 0000000..4a90afa
--- /dev/null
@@ -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 <vector>
+#include <string>
+
+#include "include/buffer.h"
+
+class CDC {
+public:
+  virtual ~CDC() = default;
+
+  virtual void calc_chunks(
+    ceph::buffer::list& inputdata,
+    std::vector<std::pair<uint64_t, uint64_t>> *chunks) = 0;
+
+  virtual void set_target_bits(int bits, int windowbits = 2) = 0;
+
+  static std::unique_ptr<CDC> create(
+    const std::string& type,
+    int bits,
+    int windowbits = 0);
+};
index b491e1d50ecbfad184acad4203a1608710f165fd..2f7e27f942fb8f2f77d3d076112496a9ab383975 100644 (file)
@@ -16,6 +16,7 @@ set(common_srcs
   BackTrace.cc
   ConfUtils.cc
   Cycles.cc
+  CDC.cc
   DecayCounter.cc
   Finisher.cc
   Formatter.cc
index 163610ee19761c7ffac229c94574d959b7a9b9e4..607928a510ca5605cf33ed2d72c8e4bfa8764737 100644 (file)
 #include <utility>
 #include <vector>
 
+#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<uint64_t> rabin_mask,
@@ -48,6 +49,12 @@ public:
     rabin_mask = _rabin_mask;
   }
 
+  void calc_chunks(
+    ceph::buffer::list& inputdata,
+    std::vector<std::pair<uint64_t, uint64_t>> *chunks) override {
+    do_rabin_chunks(inputdata, *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);
@@ -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));
   }