1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph distributed storage system
6 * Copyright (C) 2013, 2014 Cloudwatt <libre.licensing@cloudwatt.com>
7 * Copyright (C) 2014 Red Hat <contact@redhat.com>
9 * Author: Loic Dachary <loic@dachary.org>
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
18 #ifndef CEPH_ERASURE_CODE_JERASURE_H
19 #define CEPH_ERASURE_CODE_JERASURE_H
21 #include "erasure-code/ErasureCode.h"
23 #define DEFAULT_RULESET_ROOT "default"
24 #define DEFAULT_RULESET_FAILURE_DOMAIN "host"
26 class ErasureCodeJerasure
: public ErasureCode
{
29 std::string DEFAULT_K
;
31 std::string DEFAULT_M
;
33 std::string DEFAULT_W
;
34 const char *technique
;
35 std::string ruleset_root
;
36 std::string ruleset_failure_domain
;
37 bool per_chunk_alignment
;
39 explicit ErasureCodeJerasure(const char *_technique
) :
46 technique(_technique
),
47 ruleset_root(DEFAULT_RULESET_ROOT
),
48 ruleset_failure_domain(DEFAULT_RULESET_FAILURE_DOMAIN
),
49 per_chunk_alignment(false)
52 ~ErasureCodeJerasure() override
{}
54 int create_ruleset(const std::string
&name
,
56 std::ostream
*ss
) const override
;
58 unsigned int get_chunk_count() const override
{
62 unsigned int get_data_chunk_count() const override
{
66 unsigned int get_chunk_size(unsigned int object_size
) const override
;
68 int encode_chunks(const std::set
<int> &want_to_encode
,
69 std::map
<int, bufferlist
> *encoded
) override
;
71 int decode_chunks(const std::set
<int> &want_to_read
,
72 const std::map
<int, bufferlist
> &chunks
,
73 std::map
<int, bufferlist
> *decoded
) override
;
75 int init(ErasureCodeProfile
&profile
, std::ostream
*ss
) override
;
77 virtual void jerasure_encode(char **data
,
80 virtual int jerasure_decode(int *erasures
,
84 virtual unsigned get_alignment() const = 0;
85 virtual void prepare() = 0;
86 static bool is_prime(int value
);
88 virtual int parse(ErasureCodeProfile
&profile
, std::ostream
*ss
);
91 class ErasureCodeJerasureReedSolomonVandermonde
: public ErasureCodeJerasure
{
95 ErasureCodeJerasureReedSolomonVandermonde() :
96 ErasureCodeJerasure("reed_sol_van"),
103 ~ErasureCodeJerasureReedSolomonVandermonde() override
{
108 void jerasure_encode(char **data
,
110 int blocksize
) override
;
111 int jerasure_decode(int *erasures
,
114 int blocksize
) override
;
115 unsigned get_alignment() const override
;
116 void prepare() override
;
118 int parse(ErasureCodeProfile
&profile
, std::ostream
*ss
) override
;
121 class ErasureCodeJerasureReedSolomonRAID6
: public ErasureCodeJerasure
{
125 ErasureCodeJerasureReedSolomonRAID6() :
126 ErasureCodeJerasure("reed_sol_r6_op"),
132 ~ErasureCodeJerasureReedSolomonRAID6() override
{
137 void jerasure_encode(char **data
,
139 int blocksize
) override
;
140 int jerasure_decode(int *erasures
,
143 int blocksize
) override
;
144 unsigned get_alignment() const override
;
145 void prepare() override
;
147 int parse(ErasureCodeProfile
&profile
, std::ostream
*ss
) override
;
150 #define DEFAULT_PACKETSIZE "2048"
152 class ErasureCodeJerasureCauchy
: public ErasureCodeJerasure
{
158 explicit ErasureCodeJerasureCauchy(const char *technique
) :
159 ErasureCodeJerasure(technique
),
168 ~ErasureCodeJerasureCauchy() override
{
175 void jerasure_encode(char **data
,
177 int blocksize
) override
;
178 int jerasure_decode(int *erasures
,
181 int blocksize
) override
;
182 unsigned get_alignment() const override
;
183 void prepare_schedule(int *matrix
);
185 int parse(ErasureCodeProfile
&profile
, std::ostream
*ss
) override
;
188 class ErasureCodeJerasureCauchyOrig
: public ErasureCodeJerasureCauchy
{
190 ErasureCodeJerasureCauchyOrig() :
191 ErasureCodeJerasureCauchy("cauchy_orig")
194 void prepare() override
;
197 class ErasureCodeJerasureCauchyGood
: public ErasureCodeJerasureCauchy
{
199 ErasureCodeJerasureCauchyGood() :
200 ErasureCodeJerasureCauchy("cauchy_good")
203 void prepare() override
;
206 class ErasureCodeJerasureLiberation
: public ErasureCodeJerasure
{
212 explicit ErasureCodeJerasureLiberation(const char *technique
= "liberation") :
213 ErasureCodeJerasure(technique
),
222 ~ErasureCodeJerasureLiberation() override
;
224 void jerasure_encode(char **data
,
226 int blocksize
) override
;
227 int jerasure_decode(int *erasures
,
230 int blocksize
) override
;
231 unsigned get_alignment() const override
;
232 virtual bool check_k(std::ostream
*ss
) const;
233 virtual bool check_w(std::ostream
*ss
) const;
234 virtual bool check_packetsize_set(std::ostream
*ss
) const;
235 virtual bool check_packetsize(std::ostream
*ss
) const;
236 virtual int revert_to_default(ErasureCodeProfile
&profile
,
238 void prepare() override
;
240 int parse(ErasureCodeProfile
&profile
, std::ostream
*ss
) override
;
243 class ErasureCodeJerasureBlaumRoth
: public ErasureCodeJerasureLiberation
{
245 ErasureCodeJerasureBlaumRoth() :
246 ErasureCodeJerasureLiberation("blaum_roth")
250 bool check_w(std::ostream
*ss
) const override
;
251 void prepare() override
;
254 class ErasureCodeJerasureLiber8tion
: public ErasureCodeJerasureLiberation
{
256 ErasureCodeJerasureLiber8tion() :
257 ErasureCodeJerasureLiberation("liber8tion")
264 void prepare() override
;
266 int parse(ErasureCodeProfile
&profile
, std::ostream
*ss
) override
;