From ffb601150a4766f85801a9e177e5ae7a85bb007d Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 30 Jun 2017 16:55:02 -0400 Subject: [PATCH] erasure-code/lrc: implement crush-device-class property Signed-off-by: Sage Weil --- src/erasure-code/lrc/ErasureCodeLrc.cc | 17 +++++++++++++++++ src/erasure-code/lrc/ErasureCodeLrc.h | 1 + 2 files changed, 18 insertions(+) diff --git a/src/erasure-code/lrc/ErasureCodeLrc.cc b/src/erasure-code/lrc/ErasureCodeLrc.cc index 6a1080ea3c7..05cd6ed7580 100644 --- a/src/erasure-code/lrc/ErasureCodeLrc.cc +++ b/src/erasure-code/lrc/ErasureCodeLrc.cc @@ -56,6 +56,20 @@ int ErasureCodeLrc::create_rule(const string &name, return -ENOENT; } int root = crush.get_item_id(rule_root); + if (rule_device_class.size()) { + if (!crush.class_exists(rule_device_class)) { + *ss << "device class " << rule_device_class << " does not exist"; + return -ENOENT; + } + int c = crush.get_class_id(rule_device_class); + if (crush.class_bucket.count(root) == 0 || + crush.class_bucket[root].count(c) == 0) { + *ss << "root item " << rule_root << " has no devices with class " + << rule_device_class; + return -EINVAL; + } + root = crush.class_bucket[root][c]; + } int rule = 0; int rno = 0; @@ -393,6 +407,9 @@ int ErasureCodeLrc::parse_rule(ErasureCodeProfile &profile, err |= to_string("crush-root", profile, &rule_root, "default", ss); + err |= to_string("crush-device-class", profile, + &rule_device_class, + "", ss); if (profile.count("crush-steps") != 0) { rule_steps.clear(); diff --git a/src/erasure-code/lrc/ErasureCodeLrc.h b/src/erasure-code/lrc/ErasureCodeLrc.h index a92bff23986..3cd6c849e08 100644 --- a/src/erasure-code/lrc/ErasureCodeLrc.h +++ b/src/erasure-code/lrc/ErasureCodeLrc.h @@ -63,6 +63,7 @@ public: unsigned int chunk_count; unsigned int data_chunk_count; std::string rule_root; + std::string rule_device_class; struct Step { Step(std::string _op, std::string _type, int _n) : op(_op), -- 2.39.5