]> git.proxmox.com Git - ceph.git/blame - ceph/src/erasure-code/jerasure/ErasureCodeJerasure.h
update sources to v12.2.3
[ceph.git] / ceph / src / erasure-code / jerasure / ErasureCodeJerasure.h
CommitLineData
7c673cae
FG
1// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2// vim: ts=8 sw=2 smarttab
3/*
4 * Ceph distributed storage system
5 *
6 * Copyright (C) 2013, 2014 Cloudwatt <libre.licensing@cloudwatt.com>
7 * Copyright (C) 2014 Red Hat <contact@redhat.com>
8 *
9 * Author: Loic Dachary <loic@dachary.org>
10 *
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.
15 *
16 */
17
18#ifndef CEPH_ERASURE_CODE_JERASURE_H
19#define CEPH_ERASURE_CODE_JERASURE_H
20
21#include "erasure-code/ErasureCode.h"
22
7c673cae
FG
23class ErasureCodeJerasure : public ErasureCode {
24public:
25 int k;
26 std::string DEFAULT_K;
27 int m;
28 std::string DEFAULT_M;
29 int w;
30 std::string DEFAULT_W;
31 const char *technique;
224ce89b
WB
32 std::string rule_root;
33 std::string rule_failure_domain;
7c673cae
FG
34 bool per_chunk_alignment;
35
36 explicit ErasureCodeJerasure(const char *_technique) :
37 k(0),
38 DEFAULT_K("2"),
39 m(0),
40 DEFAULT_M("1"),
41 w(0),
42 DEFAULT_W("8"),
43 technique(_technique),
7c673cae
FG
44 per_chunk_alignment(false)
45 {}
46
47 ~ErasureCodeJerasure() override {}
48
7c673cae
FG
49 unsigned int get_chunk_count() const override {
50 return k + m;
51 }
52
53 unsigned int get_data_chunk_count() const override {
54 return k;
55 }
56
57 unsigned int get_chunk_size(unsigned int object_size) const override;
58
31f18b77
FG
59 int encode_chunks(const std::set<int> &want_to_encode,
60 std::map<int, bufferlist> *encoded) override;
7c673cae 61
31f18b77
FG
62 int decode_chunks(const std::set<int> &want_to_read,
63 const std::map<int, bufferlist> &chunks,
64 std::map<int, bufferlist> *decoded) override;
7c673cae 65
31f18b77 66 int init(ErasureCodeProfile &profile, std::ostream *ss) override;
7c673cae
FG
67
68 virtual void jerasure_encode(char **data,
69 char **coding,
70 int blocksize) = 0;
71 virtual int jerasure_decode(int *erasures,
72 char **data,
73 char **coding,
74 int blocksize) = 0;
75 virtual unsigned get_alignment() const = 0;
76 virtual void prepare() = 0;
77 static bool is_prime(int value);
78protected:
31f18b77 79 virtual int parse(ErasureCodeProfile &profile, std::ostream *ss);
7c673cae
FG
80};
81
82class ErasureCodeJerasureReedSolomonVandermonde : public ErasureCodeJerasure {
83public:
84 int *matrix;
85
86 ErasureCodeJerasureReedSolomonVandermonde() :
87 ErasureCodeJerasure("reed_sol_van"),
88 matrix(0)
89 {
90 DEFAULT_K = "7";
91 DEFAULT_M = "3";
92 DEFAULT_W = "8";
93 }
94 ~ErasureCodeJerasureReedSolomonVandermonde() override {
95 if (matrix)
96 free(matrix);
97 }
98
99 void jerasure_encode(char **data,
100 char **coding,
101 int blocksize) override;
102 int jerasure_decode(int *erasures,
103 char **data,
104 char **coding,
105 int blocksize) override;
106 unsigned get_alignment() const override;
107 void prepare() override;
108private:
31f18b77 109 int parse(ErasureCodeProfile &profile, std::ostream *ss) override;
7c673cae
FG
110};
111
112class ErasureCodeJerasureReedSolomonRAID6 : public ErasureCodeJerasure {
113public:
114 int *matrix;
115
116 ErasureCodeJerasureReedSolomonRAID6() :
117 ErasureCodeJerasure("reed_sol_r6_op"),
118 matrix(0)
119 {
120 DEFAULT_K = "7";
121 DEFAULT_W = "8";
122 }
123 ~ErasureCodeJerasureReedSolomonRAID6() override {
124 if (matrix)
125 free(matrix);
126 }
127
128 void jerasure_encode(char **data,
129 char **coding,
130 int blocksize) override;
131 int jerasure_decode(int *erasures,
132 char **data,
133 char **coding,
134 int blocksize) override;
135 unsigned get_alignment() const override;
136 void prepare() override;
137private:
31f18b77 138 int parse(ErasureCodeProfile &profile, std::ostream *ss) override;
7c673cae
FG
139};
140
141#define DEFAULT_PACKETSIZE "2048"
142
143class ErasureCodeJerasureCauchy : public ErasureCodeJerasure {
144public:
145 int *bitmatrix;
146 int **schedule;
147 int packetsize;
148
149 explicit ErasureCodeJerasureCauchy(const char *technique) :
150 ErasureCodeJerasure(technique),
151 bitmatrix(0),
152 schedule(0),
153 packetsize(0)
154 {
155 DEFAULT_K = "7";
156 DEFAULT_M = "3";
157 DEFAULT_W = "8";
158 }
b32b8144 159 ~ErasureCodeJerasureCauchy() override;
7c673cae
FG
160
161 void jerasure_encode(char **data,
162 char **coding,
163 int blocksize) override;
164 int jerasure_decode(int *erasures,
165 char **data,
166 char **coding,
167 int blocksize) override;
168 unsigned get_alignment() const override;
169 void prepare_schedule(int *matrix);
170private:
31f18b77 171 int parse(ErasureCodeProfile &profile, std::ostream *ss) override;
7c673cae
FG
172};
173
174class ErasureCodeJerasureCauchyOrig : public ErasureCodeJerasureCauchy {
175public:
176 ErasureCodeJerasureCauchyOrig() :
177 ErasureCodeJerasureCauchy("cauchy_orig")
178 {}
179
180 void prepare() override;
181};
182
183class ErasureCodeJerasureCauchyGood : public ErasureCodeJerasureCauchy {
184public:
185 ErasureCodeJerasureCauchyGood() :
186 ErasureCodeJerasureCauchy("cauchy_good")
187 {}
188
189 void prepare() override;
190};
191
192class ErasureCodeJerasureLiberation : public ErasureCodeJerasure {
193public:
194 int *bitmatrix;
195 int **schedule;
196 int packetsize;
197
198 explicit ErasureCodeJerasureLiberation(const char *technique = "liberation") :
199 ErasureCodeJerasure(technique),
200 bitmatrix(0),
201 schedule(0),
202 packetsize(0)
203 {
204 DEFAULT_K = "2";
205 DEFAULT_M = "2";
206 DEFAULT_W = "7";
207 }
208 ~ErasureCodeJerasureLiberation() override;
209
210 void jerasure_encode(char **data,
211 char **coding,
212 int blocksize) override;
213 int jerasure_decode(int *erasures,
214 char **data,
215 char **coding,
216 int blocksize) override;
217 unsigned get_alignment() const override;
31f18b77
FG
218 virtual bool check_k(std::ostream *ss) const;
219 virtual bool check_w(std::ostream *ss) const;
220 virtual bool check_packetsize_set(std::ostream *ss) const;
221 virtual bool check_packetsize(std::ostream *ss) const;
7c673cae 222 virtual int revert_to_default(ErasureCodeProfile &profile,
31f18b77 223 std::ostream *ss);
7c673cae
FG
224 void prepare() override;
225private:
31f18b77 226 int parse(ErasureCodeProfile &profile, std::ostream *ss) override;
7c673cae
FG
227};
228
229class ErasureCodeJerasureBlaumRoth : public ErasureCodeJerasureLiberation {
230public:
231 ErasureCodeJerasureBlaumRoth() :
232 ErasureCodeJerasureLiberation("blaum_roth")
233 {
234 }
235
31f18b77 236 bool check_w(std::ostream *ss) const override;
7c673cae
FG
237 void prepare() override;
238};
239
240class ErasureCodeJerasureLiber8tion : public ErasureCodeJerasureLiberation {
241public:
242 ErasureCodeJerasureLiber8tion() :
243 ErasureCodeJerasureLiberation("liber8tion")
244 {
245 DEFAULT_K = "2";
246 DEFAULT_M = "2";
247 DEFAULT_W = "8";
248 }
249
250 void prepare() override;
251private:
31f18b77 252 int parse(ErasureCodeProfile &profile, std::ostream *ss) override;
7c673cae
FG
253};
254
255#endif