]> git.proxmox.com Git - ceph.git/blob - ceph/src/erasure-code/clay/ErasureCodeClay.h
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / erasure-code / clay / ErasureCodeClay.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 /*
4 * Ceph - scalable distributed file system
5 *
6 * Copyright (C) 2018 Indian Institute of Science <office.ece@iisc.ac.in>
7 *
8 * Author: Myna Vajha <mynaramana@gmail.com>
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
14 *
15 */
16
17 #ifndef CEPH_ERASURE_CODE_CLAY_H
18 #define CEPH_ERASURE_CODE_CLAY_H
19
20 #include "include/err.h"
21 #include "include/buffer_fwd.h"
22 #include "erasure-code/ErasureCode.h"
23
24 class ErasureCodeClay final : public ceph::ErasureCode {
25 public:
26 std::string DEFAULT_K{"4"};
27 std::string DEFAULT_M{"2"};
28 std::string DEFAULT_W{"8"};
29 int k = 0, m = 0, d = 0, w = 8;
30 int q = 0, t = 0, nu = 0;
31 int sub_chunk_no = 0;
32
33 std::map<int, ceph::bufferlist> U_buf;
34
35 struct ScalarMDS {
36 ceph::ErasureCodeInterfaceRef erasure_code;
37 ceph::ErasureCodeProfile profile;
38 };
39 ScalarMDS mds;
40 ScalarMDS pft;
41 const std::string directory;
42
43 explicit ErasureCodeClay(const std::string& dir)
44 : directory(dir)
45 {}
46
47 ~ErasureCodeClay() override;
48
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 int get_sub_chunk_count() override {
58 return sub_chunk_no;
59 }
60
61 unsigned int get_chunk_size(unsigned int object_size) const override;
62
63 int minimum_to_decode(const std::set<int> &want_to_read,
64 const std::set<int> &available,
65 std::map<int, std::vector<std::pair<int, int>>> *minimum) override;
66
67 int decode(const std::set<int> &want_to_read,
68 const std::map<int, ceph::bufferlist> &chunks,
69 std::map<int, ceph::bufferlist> *decoded, int chunk_size) override;
70
71 int encode_chunks(const std::set<int> &want_to_encode,
72 std::map<int, ceph::bufferlist> *encoded) override;
73
74 int decode_chunks(const std::set<int> &want_to_read,
75 const std::map<int, ceph::bufferlist> &chunks,
76 std::map<int, ceph::bufferlist> *decoded) override;
77
78 int init(ceph::ErasureCodeProfile &profile, std::ostream *ss) override;
79
80 int is_repair(const std::set<int> &want_to_read,
81 const std::set<int> &available_chunks);
82
83 int get_repair_sub_chunk_count(const std::set<int> &want_to_read);
84
85 virtual int parse(ceph::ErasureCodeProfile &profile, std::ostream *ss);
86
87 private:
88 int minimum_to_repair(const std::set<int> &want_to_read,
89 const std::set<int> &available_chunks,
90 std::map<int, std::vector<std::pair<int, int>>> *minimum);
91
92 int repair(const std::set<int> &want_to_read,
93 const std::map<int, ceph::bufferlist> &chunks,
94 std::map<int, ceph::bufferlist> *recovered, int chunk_size);
95
96 int decode_layered(std::set<int>& erased_chunks, std::map<int, ceph::bufferlist>* chunks);
97
98 int repair_one_lost_chunk(std::map<int, ceph::bufferlist> &recovered_data, std::set<int> &aloof_nodes,
99 std::map<int, ceph::bufferlist> &helper_data, int repair_blocksize,
100 std::vector<std::pair<int,int>> &repair_sub_chunks_ind);
101
102 void get_repair_subchunks(const int &lost_node,
103 std::vector<std::pair<int, int>> &repair_sub_chunks_ind);
104
105 int decode_erasures(const std::set<int>& erased_chunks, int z,
106 std::map<int, ceph::bufferlist>* chunks, int sc_size);
107
108 int decode_uncoupled(const std::set<int>& erasures, int z, int ss_size);
109
110 void set_planes_sequential_decoding_order(int* order, std::set<int>& erasures);
111
112 void recover_type1_erasure(std::map<int, ceph::bufferlist>* chunks, int x, int y, int z,
113 int* z_vec, int sc_size);
114
115 void get_uncoupled_from_coupled(std::map<int, ceph::bufferlist>* chunks, int x, int y, int z,
116 int* z_vec, int sc_size);
117
118 void get_coupled_from_uncoupled(std::map<int, ceph::bufferlist>* chunks, int x, int y, int z,
119 int* z_vec, int sc_size);
120
121 void get_plane_vector(int z, int* z_vec);
122
123 int get_max_iscore(std::set<int>& erased_chunks);
124 };
125
126 #endif