initial code repo
[stor4nfv.git] / src / ceph / src / erasure-code / shec / ErasureCodeShec.h
diff --git a/src/ceph/src/erasure-code/shec/ErasureCodeShec.h b/src/ceph/src/erasure-code/shec/ErasureCodeShec.h
new file mode 100644 (file)
index 0000000..073644e
--- /dev/null
@@ -0,0 +1,147 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2014 FUJITSU LIMITED
+ * Copyright (C) 2013, 2014 Cloudwatt <libre.licensing@cloudwatt.com>
+ * Copyright (C) 2014 Red Hat <contact@redhat.com>
+ *
+ * Author: Takanori Nakao <nakao.takanori@jp.fujitsu.com>
+ * Author: Takeshi Miyamae <miyamae.takeshi@jp.fujitsu.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_SHEC_H
+#define CEPH_ERASURE_CODE_SHEC_H
+
+#include "erasure-code/ErasureCode.h"
+#include "ErasureCodeShecTableCache.h"
+
+class ErasureCodeShec : public ErasureCode {
+
+public:
+  enum {
+    MULTIPLE = 0,
+    SINGLE = 1
+  };
+
+  ErasureCodeShecTableCache &tcache;
+  int k;
+  int DEFAULT_K;
+  int m;
+  int DEFAULT_M;
+  int c;
+  int DEFAULT_C;
+  int w;
+  int DEFAULT_W;
+  int technique;
+  int *matrix;
+
+  ErasureCodeShec(const int _technique,
+                 ErasureCodeShecTableCache &_tcache) :
+    tcache(_tcache),
+    k(0),
+    DEFAULT_K(4),
+    m(0),
+    DEFAULT_M(3),
+    c(0),
+    DEFAULT_C(2),
+    w(0),
+    DEFAULT_W(8),
+    technique(_technique),
+    matrix(0)
+  {}
+
+  ~ErasureCodeShec() 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 minimum_to_decode(const set<int> &want_to_read,
+                               const set<int> &available_chunks,
+                               set<int> *minimum) override;
+
+  int minimum_to_decode_with_cost(const set<int> &want_to_read,
+                                         const map<int, int> &available,
+                                         set<int> *minimum) override;
+
+  int encode(const set<int> &want_to_encode,
+                    const bufferlist &in,
+                    map<int, bufferlist> *encoded) override;
+  int encode_chunks(const set<int> &want_to_encode,
+                           map<int, bufferlist> *encoded) override;
+
+  int decode(const set<int> &want_to_read,
+                    const map<int, bufferlist> &chunks,
+                    map<int, bufferlist> *decoded) override;
+  int decode_chunks(const set<int> &want_to_read,
+                           const map<int, bufferlist> &chunks,
+                           map<int, bufferlist> *decoded) override;
+
+  int init(ErasureCodeProfile &profile, ostream *ss) override;
+  virtual void shec_encode(char **data,
+                          char **coding,
+                          int blocksize) = 0;
+  virtual int shec_decode(int *erasures,
+                         int *avails,
+                         char **data,
+                         char **coding,
+                         int blocksize) = 0;
+  virtual unsigned get_alignment() const = 0;
+  virtual void prepare() = 0;
+
+  virtual int shec_matrix_decode(int *erased, int *avails,
+                                 char **data_ptrs, char **coding_ptrs, int size);
+  virtual int* shec_reedsolomon_coding_matrix(int is_single);
+
+private:
+  virtual int parse(const ErasureCodeProfile &profile) = 0;
+
+  virtual double shec_calc_recovery_efficiency1(int k, int m1, int m2, int c1, int c2);
+  virtual int shec_make_decoding_matrix(bool prepare,
+                                        int *want, int *avails,
+                                        int *decoding_matrix,
+                                        int *dm_row, int *dm_column,
+                                        int *minimum);
+};
+
+class ErasureCodeShecReedSolomonVandermonde : public ErasureCodeShec {
+public:
+
+  ErasureCodeShecReedSolomonVandermonde(ErasureCodeShecTableCache &_tcache,
+                                       int technique = MULTIPLE) :
+    ErasureCodeShec(technique, _tcache)
+  {}
+
+  ~ErasureCodeShecReedSolomonVandermonde() override {
+  }
+
+  void shec_encode(char **data,
+                          char **coding,
+                          int blocksize) override;
+  int shec_decode(int *erasures,
+                         int *avails,
+                         char **data,
+                         char **coding,
+                         int blocksize) override;
+  unsigned get_alignment() const override;
+  void prepare() override;
+private:
+  int parse(const ErasureCodeProfile &profile) override;
+};
+
+#endif