diff options
Diffstat (limited to 'src/erasure-code/jerasure/ErasureCodeJerasure.h')
-rw-r--r-- | src/erasure-code/jerasure/ErasureCodeJerasure.h | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/src/erasure-code/jerasure/ErasureCodeJerasure.h b/src/erasure-code/jerasure/ErasureCodeJerasure.h new file mode 100644 index 000000000..2272e0aad --- /dev/null +++ b/src/erasure-code/jerasure/ErasureCodeJerasure.h @@ -0,0 +1,255 @@ +// -*- 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 ceph::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, ceph::buffer::list> *encoded) override; + + int decode_chunks(const std::set<int> &want_to_read, + const std::map<int, ceph::buffer::list> &chunks, + std::map<int, ceph::buffer::list> *decoded) override; + + int init(ceph::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(ceph::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(ceph::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_M = "2"; + 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(ceph::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; + + 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(ceph::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(ceph::ErasureCodeProfile& profile, + std::ostream *ss); + void prepare() override; +private: + int parse(ceph::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(ceph::ErasureCodeProfile& profile, std::ostream *ss) override; +}; + +#endif |