From: Sage Weil Date: Thu, 10 Aug 2017 22:13:40 +0000 (-0400) Subject: osd/OSDMap: add parse_osd_id_list helper X-Git-Tag: v12.1.4~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0badbec829f1411461a5cb08b086c3f60cfb6017;p=ceph.git osd/OSDMap: add parse_osd_id_list helper Signed-off-by: Sage Weil (cherry picked from commit 6fc33a046ba880e42302c3ff54b69747df47b9a2) --- diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 718c69223ef3..99a768897c14 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -4641,3 +4641,23 @@ void OSDMap::check_health(health_check_map_t *checks) const } } } + +int OSDMap::parse_osd_id_list(const vector& ls, set *out, + ostream *ss) const +{ + out->clear(); + for (auto i = ls.begin(); i != ls.end(); ++i) { + if (i == ls.begin() && + (*i == "any" || *i == "all" || *i == "*")) { + get_all_osds(*out); + break; + } + long osd = parse_osd_id(i->c_str(), ss); + if (osd < 0) { + *ss << "invalid osd id '" << *i << "'"; + return -EINVAL; + } + out->insert(osd); + } + return 0; +} diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index 268c420152ec..e676bff0a72c 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -1369,6 +1369,10 @@ public: bool check_new_blacklist_entries() const { return new_blacklist_entries; } void check_health(health_check_map_t *checks) const; + + int parse_osd_id_list(const vector& ls, + set *out, + ostream *ss) const; }; WRITE_CLASS_ENCODER_FEATURES(OSDMap) WRITE_CLASS_ENCODER_FEATURES(OSDMap::Incremental) diff --git a/src/test/osd/TestOSDMap.cc b/src/test/osd/TestOSDMap.cc index 8aa31e616118..f94f7402a5e7 100644 --- a/src/test/osd/TestOSDMap.cc +++ b/src/test/osd/TestOSDMap.cc @@ -446,6 +446,44 @@ TEST_F(OSDMapTest, PrimaryAffinity) { } } +TEST_F(OSDMapTest, parse_osd_id_list) { + set_up_map(); + set out; + set all; + osdmap.get_all_osds(all); + + ASSERT_EQ(0, osdmap.parse_osd_id_list({"osd.0"}, &out, &cout)); + ASSERT_EQ(1, out.size()); + ASSERT_EQ(0, *out.begin()); + + ASSERT_EQ(0, osdmap.parse_osd_id_list({"1"}, &out, &cout)); + ASSERT_EQ(1, out.size()); + ASSERT_EQ(1, *out.begin()); + + ASSERT_EQ(0, osdmap.parse_osd_id_list({"osd.0","osd.1"}, &out, &cout)); + ASSERT_EQ(2, out.size()); + ASSERT_EQ(0, *out.begin()); + ASSERT_EQ(1, *out.rbegin()); + + ASSERT_EQ(0, osdmap.parse_osd_id_list({"osd.0","1"}, &out, &cout)); + ASSERT_EQ(2, out.size()); + ASSERT_EQ(0, *out.begin()); + ASSERT_EQ(1, *out.rbegin()); + + ASSERT_EQ(0, osdmap.parse_osd_id_list({"*"}, &out, &cout)); + ASSERT_EQ(all.size(), out.size()); + ASSERT_EQ(all, out); + + ASSERT_EQ(0, osdmap.parse_osd_id_list({"all"}, &out, &cout)); + ASSERT_EQ(all, out); + + ASSERT_EQ(0, osdmap.parse_osd_id_list({"any"}, &out, &cout)); + ASSERT_EQ(all, out); + + ASSERT_EQ(-EINVAL, osdmap.parse_osd_id_list({"foo"}, &out, &cout)); + ASSERT_EQ(-EINVAL, osdmap.parse_osd_id_list({"-12"}, &out, &cout)); +} + TEST(PGTempMap, basic) { PGTempMap m; @@ -461,3 +499,4 @@ TEST(PGTempMap, basic) ASSERT_EQ(m.find(b), m.end()); ASSERT_EQ(998u, m.size()); } +