]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/erasure-code/ErasureCode.cc
update sources to v12.1.1
[ceph.git] / ceph / src / erasure-code / ErasureCode.cc
index 353ab4f0d8e68afd83d6328463fc430d18d702eb..c37adedb6c79a3c788910569cc754122688c560e 100644 (file)
 
 #include "common/strtol.h"
 #include "include/buffer.h"
+#include "crush/CrushWrapper.h"
+#include "osd/osd_types.h"
 
 using namespace std;
 
 const unsigned ErasureCode::SIMD_ALIGN = 32;
 
+#define DEFAULT_RULE_ROOT "default"
+#define DEFAULT_RULE_FAILURE_DOMAIN "host"
+
+int ErasureCode::init(
+  ErasureCodeProfile &profile,
+  std::ostream *ss)
+{
+  int err = 0;
+  err |= to_string("crush-root", profile,
+                  &rule_root,
+                  DEFAULT_RULE_ROOT, ss);
+  err |= to_string("crush-failure-domain", profile,
+                  &rule_failure_domain,
+                  DEFAULT_RULE_FAILURE_DOMAIN, ss);
+  err |= to_string("crush-device-class", profile,
+                  &rule_device_class,
+                  "", ss);
+  if (err)
+    return err;
+  _profile = profile;
+  return 0;
+}
+
+int ErasureCode::create_rule(
+  const std::string &name,
+  CrushWrapper &crush,
+  std::ostream *ss) const
+{
+  int ruleid = crush.add_simple_rule(
+    name,
+    rule_root,
+    rule_failure_domain,
+    rule_device_class,
+    "indep",
+    pg_pool_t::TYPE_ERASURE,
+    ss);
+
+  if (ruleid < 0)
+    return ruleid;
+
+  crush.set_rule_mask_max_size(ruleid, get_chunk_count());
+  return ruleid;
+}
+
 int ErasureCode::sanity_check_k(int k, ostream *ss)
 {
   if (k < 2) {