X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Ferasure-code%2Fjerasure%2FErasureCodeJerasure.h;fp=src%2Fceph%2Fsrc%2Ferasure-code%2Fjerasure%2FErasureCodeJerasure.h;h=be9abc5615fa6e2faed8f54c46b7df1037a2994c;hb=812ff6ca9fcd3e629e49d4328905f33eee8ca3f5;hp=0000000000000000000000000000000000000000;hpb=15280273faafb77777eab341909a3f495cf248d9;p=stor4nfv.git diff --git a/src/ceph/src/erasure-code/jerasure/ErasureCodeJerasure.h b/src/ceph/src/erasure-code/jerasure/ErasureCodeJerasure.h new file mode 100644 index 0000000..be9abc5 --- /dev/null +++ b/src/ceph/src/erasure-code/jerasure/ErasureCodeJerasure.h @@ -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 + * Copyright (C) 2014 Red Hat + * + * Author: Loic Dachary + * + * 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 &want_to_encode, + std::map *encoded) override; + + int decode_chunks(const std::set &want_to_read, + const std::map &chunks, + std::map *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