initial code repo
[stor4nfv.git] / src / ceph / src / erasure-code / jerasure / ErasureCodeJerasure.h
diff --git a/src/ceph/src/erasure-code/jerasure/ErasureCodeJerasure.h b/src/ceph/src/erasure-code/jerasure/ErasureCodeJerasure.h
new file mode 100644 (file)
index 0000000..be9abc5
--- /dev/null
@@ -0,0 +1,260 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- 
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph distributed storage system
+ *
+ * Copyright (C) 2013, 2014 Cloudwatt <libre.licensing@cloudwatt.com>
+ * Copyright (C) 2014 Red Hat <contact@redhat.com>
+ *
+ * Author: Loic Dachary <loic@dachary.org>
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2.1 of the License, or (at your option) any later version.
+ * 
+ */
+
+#ifndef CEPH_ERASURE_CODE_JERASURE_H
+#define CEPH_ERASURE_CODE_JERASURE_H
+
+#include "erasure-code/ErasureCode.h"
+
+class ErasureCodeJerasure : public ErasureCode {
+public:
+  int k;
+  std::string DEFAULT_K;
+  int m;
+  std::string DEFAULT_M;
+  int w;
+  std::string DEFAULT_W;
+  const char *technique;
+  std::string rule_root;
+  std::string rule_failure_domain;
+  bool per_chunk_alignment;
+
+  explicit ErasureCodeJerasure(const char *_technique) :
+    k(0),
+    DEFAULT_K("2"),
+    m(0),
+    DEFAULT_M("1"),
+    w(0),
+    DEFAULT_W("8"),
+    technique(_technique),
+    per_chunk_alignment(false)
+  {}
+
+  ~ErasureCodeJerasure() override {}
+  
+  unsigned int get_chunk_count() const override {
+    return k + m;
+  }
+
+  unsigned int get_data_chunk_count() const override {
+    return k;
+  }
+
+  unsigned int get_chunk_size(unsigned int object_size) const override;
+
+  int encode_chunks(const std::set<int> &want_to_encode,
+                           std::map<int, bufferlist> *encoded) override;
+
+  int decode_chunks(const std::set<int> &want_to_read,
+                           const std::map<int, bufferlist> &chunks,
+                           std::map<int, bufferlist> *decoded) override;
+
+  int init(ErasureCodeProfile &profile, std::ostream *ss) override;
+
+  virtual void jerasure_encode(char **data,
+                               char **coding,
+                               int blocksize) = 0;
+  virtual int jerasure_decode(int *erasures,
+                               char **data,
+                               char **coding,
+                               int blocksize) = 0;
+  virtual unsigned get_alignment() const = 0;
+  virtual void prepare() = 0;
+  static bool is_prime(int value);
+protected:
+  virtual int parse(ErasureCodeProfile &profile, std::ostream *ss);
+};
+
+class ErasureCodeJerasureReedSolomonVandermonde : public ErasureCodeJerasure {
+public:
+  int *matrix;
+
+  ErasureCodeJerasureReedSolomonVandermonde() :
+    ErasureCodeJerasure("reed_sol_van"),
+    matrix(0)
+  {
+    DEFAULT_K = "7";
+    DEFAULT_M = "3";
+    DEFAULT_W = "8";
+  }
+  ~ErasureCodeJerasureReedSolomonVandermonde() override {
+    if (matrix)
+      free(matrix);
+  }
+
+  void jerasure_encode(char **data,
+                               char **coding,
+                               int blocksize) override;
+  int jerasure_decode(int *erasures,
+                               char **data,
+                               char **coding,
+                               int blocksize) override;
+  unsigned get_alignment() const override;
+  void prepare() override;
+private:
+  int parse(ErasureCodeProfile &profile, std::ostream *ss) override;
+};
+
+class ErasureCodeJerasureReedSolomonRAID6 : public ErasureCodeJerasure {
+public:
+  int *matrix;
+
+  ErasureCodeJerasureReedSolomonRAID6() :
+    ErasureCodeJerasure("reed_sol_r6_op"),
+    matrix(0)
+  {
+    DEFAULT_K = "7";
+    DEFAULT_W = "8";
+  }
+  ~ErasureCodeJerasureReedSolomonRAID6() override {
+    if (matrix)
+      free(matrix);
+  }
+
+  void jerasure_encode(char **data,
+                               char **coding,
+                               int blocksize) override;
+  int jerasure_decode(int *erasures,
+                               char **data,
+                               char **coding,
+                               int blocksize) override;
+  unsigned get_alignment() const override;
+  void prepare() override;
+private:
+  int parse(ErasureCodeProfile &profile, std::ostream *ss) override;
+};
+
+#define DEFAULT_PACKETSIZE "2048"
+
+class ErasureCodeJerasureCauchy : public ErasureCodeJerasure {
+public:
+  int *bitmatrix;
+  int **schedule;
+  int packetsize;
+
+  explicit ErasureCodeJerasureCauchy(const char *technique) :
+    ErasureCodeJerasure(technique),
+    bitmatrix(0),
+    schedule(0),
+    packetsize(0)
+  {
+    DEFAULT_K = "7";
+    DEFAULT_M = "3";
+    DEFAULT_W = "8";
+  }
+  ~ErasureCodeJerasureCauchy() override {
+    if (bitmatrix)
+      free(bitmatrix);
+    if (schedule)
+      free(schedule);
+  }
+
+  void jerasure_encode(char **data,
+                               char **coding,
+                               int blocksize) override;
+  int jerasure_decode(int *erasures,
+                               char **data,
+                               char **coding,
+                               int blocksize) override;
+  unsigned get_alignment() const override;
+  void prepare_schedule(int *matrix);
+private:
+  int parse(ErasureCodeProfile &profile, std::ostream *ss) override;
+};
+
+class ErasureCodeJerasureCauchyOrig : public ErasureCodeJerasureCauchy {
+public:
+  ErasureCodeJerasureCauchyOrig() :
+    ErasureCodeJerasureCauchy("cauchy_orig")
+  {}
+
+  void prepare() override;
+};
+
+class ErasureCodeJerasureCauchyGood : public ErasureCodeJerasureCauchy {
+public:
+  ErasureCodeJerasureCauchyGood() :
+    ErasureCodeJerasureCauchy("cauchy_good")
+  {}
+
+  void prepare() override;
+};
+
+class ErasureCodeJerasureLiberation : public ErasureCodeJerasure {
+public:
+  int *bitmatrix;
+  int **schedule;
+  int packetsize;
+
+  explicit ErasureCodeJerasureLiberation(const char *technique = "liberation") :
+    ErasureCodeJerasure(technique),
+    bitmatrix(0),
+    schedule(0),
+    packetsize(0)
+  {
+    DEFAULT_K = "2";
+    DEFAULT_M = "2";
+    DEFAULT_W = "7";
+  }
+  ~ErasureCodeJerasureLiberation() override;
+
+  void jerasure_encode(char **data,
+                               char **coding,
+                               int blocksize) override;
+  int jerasure_decode(int *erasures,
+                               char **data,
+                               char **coding,
+                               int blocksize) override;
+  unsigned get_alignment() const override;
+  virtual bool check_k(std::ostream *ss) const;
+  virtual bool check_w(std::ostream *ss) const;
+  virtual bool check_packetsize_set(std::ostream *ss) const;
+  virtual bool check_packetsize(std::ostream *ss) const;
+  virtual int revert_to_default(ErasureCodeProfile &profile,
+                               std::ostream *ss);
+  void prepare() override;
+private:
+  int parse(ErasureCodeProfile &profile, std::ostream *ss) override;
+};
+
+class ErasureCodeJerasureBlaumRoth : public ErasureCodeJerasureLiberation {
+public:
+  ErasureCodeJerasureBlaumRoth() :
+    ErasureCodeJerasureLiberation("blaum_roth")
+  {
+  }
+
+  bool check_w(std::ostream *ss) const override;
+  void prepare() override;
+};
+
+class ErasureCodeJerasureLiber8tion : public ErasureCodeJerasureLiberation {
+public:
+  ErasureCodeJerasureLiber8tion() :
+    ErasureCodeJerasureLiberation("liber8tion")
+  {
+    DEFAULT_K = "2";
+    DEFAULT_M = "2";
+    DEFAULT_W = "8";
+  }
+
+  void prepare() override;
+private:
+  int parse(ErasureCodeProfile &profile, std::ostream *ss) override;
+};
+
+#endif