From: Adam Crume Date: Wed, 6 Aug 2014 23:00:40 +0000 (-0700) Subject: rbd-replay: Switch ImageNameMap to using rbd_loc X-Git-Tag: v0.86~231^2~30 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6f79f1320afa517d99f1a3a7222ffdd87f5f86bc;p=ceph.git rbd-replay: Switch ImageNameMap to using rbd_loc Signed-off-by: Adam Crume --- diff --git a/src/rbd_replay/ImageNameMap.cc b/src/rbd_replay/ImageNameMap.cc index 6331e5a58b7c..336f7c6aad47 100644 --- a/src/rbd_replay/ImageNameMap.cc +++ b/src/rbd_replay/ImageNameMap.cc @@ -21,17 +21,12 @@ using namespace std; using namespace rbd_replay; -static ImageNameMap::Name bad_mapping_abort(ImageNameMap::Name input, string output) { - assertf(false, "Bad value returned from mapping. Image: '%s', snap: '%s', output: '%s'", input.first.c_str(), input.second.c_str(), output.c_str()); +static ImageName bad_mapping_abort(ImageName input, string output) { + assertf(false, "Bad value returned from mapping. Image: '%s', snap: '%s', output: '%s'", input.image().c_str(), input.snap().c_str(), output.c_str()); } ImageNameMap::ImageNameMap() - : m_name("((?:[^@\\\\]|\\\\.)*)@((?:[^@\\\\]|\\\\.)*)"), - m_escaped_at("\\\\@"), - m_escaped_backslash("\\\\\\\\"), - m_at("@"), - m_backslash("\\\\"), - m_bad_mapping_fallback(bad_mapping_abort) { + : m_bad_mapping_fallback(bad_mapping_abort) { } bool ImageNameMap::parse_mapping(string mapping_string, Mapping *mapping) const { @@ -42,37 +37,11 @@ void ImageNameMap::add_mapping(Mapping mapping) { m_map.add_mapping(mapping); } -string ImageNameMap::unescape_at(string s) const { - s = boost::regex_replace(s, m_escaped_at, "@"); - return boost::regex_replace(s, m_escaped_backslash, "\\\\"); -} - -string ImageNameMap::escape_at(string s) const { - string result = boost::regex_replace(s, m_backslash, "\\\\"); - return boost::regex_replace(result, m_at, "\\\\@"); -} - -bool ImageNameMap::parse_name(string name_string, Name *name) const { - boost::smatch what; - if (boost::regex_match(name_string, what, m_name)) { - string image(unescape_at(what[1])); - string snap(unescape_at(what[2])); - *name = Name(image, snap); - return true; - } else { - return false; - } -} - -string ImageNameMap::format_name(ImageNameMap::Name name) const { - return escape_at(name.first) + "@" + escape_at(name.second); -} - -ImageNameMap::Name ImageNameMap::map(ImageNameMap::Name name) const { - string in_string(format_name(name)); +ImageName ImageNameMap::map(const ImageName& name) const { + string in_string(name.str()); string out_string(m_map.map(in_string)); - Name out; - if (!parse_name(out_string, &out)) { + ImageName out; + if (!out.parse(out_string)) { return m_bad_mapping_fallback(name, out_string); } return out; diff --git a/src/rbd_replay/ImageNameMap.hpp b/src/rbd_replay/ImageNameMap.hpp index 36570481eaec..c360db7f0ee4 100644 --- a/src/rbd_replay/ImageNameMap.hpp +++ b/src/rbd_replay/ImageNameMap.hpp @@ -20,6 +20,7 @@ #include #include #include +#include "ImageName.hpp" #include "NameMap.hpp" namespace rbd_replay { @@ -28,9 +29,7 @@ class ImageNameMap { public: typedef std::pair Mapping; - typedef std::pair Name; - - typedef boost::function BadMappingFallback; + typedef boost::function BadMappingFallback; ImageNameMap(); @@ -38,34 +37,13 @@ public: void add_mapping(Mapping mapping); - bool parse_name(std::string name_string, Name *name) const; - - std::string format_name(Name name) const; - - Name map(Name name) const; + rbd_replay::ImageName map(const rbd_replay::ImageName& name) const; void set_bad_mapping_fallback(BadMappingFallback bad_mapping_fallback); private: - std::string escape_at(std::string s) const; - - std::string unescape_at(std::string s) const; - NameMap m_map; - // Split "a@b" into "a" and "b", allowing for escaped at sign - boost::regex m_name; - - // We don't have to worry about an even number of backslahes followed by an at sign, - // because that at sign would have already been matched and removed. - boost::regex m_escaped_at; - - boost::regex m_escaped_backslash; - - boost::regex m_at; - - boost::regex m_backslash; - BadMappingFallback m_bad_mapping_fallback; }; diff --git a/src/rbd_replay/Replayer.cc b/src/rbd_replay/Replayer.cc index 54b61e1ef749..eeb40297571f 100644 --- a/src/rbd_replay/Replayer.cc +++ b/src/rbd_replay/Replayer.cc @@ -128,8 +128,8 @@ bool Worker::readonly() const { return m_replayer.readonly(); } -pair Worker::map_image_name(string image_name, string snap_name) const { - return m_replayer.image_name_map().map(pair(image_name, snap_name)); +ImageName Worker::map_image_name(string image_name, string snap_name) const { + return m_replayer.image_name_map().map(ImageName("", image_name, snap_name)); } diff --git a/src/rbd_replay/Replayer.hpp b/src/rbd_replay/Replayer.hpp index 55654e08c513..f16d8e39215f 100644 --- a/src/rbd_replay/Replayer.hpp +++ b/src/rbd_replay/Replayer.hpp @@ -56,7 +56,7 @@ public: bool readonly() const; - std::pair map_image_name(std::string image_name, std::string snap_name) const; + rbd_replay::ImageName map_image_name(std::string image_name, std::string snap_name) const; private: void run(); diff --git a/src/rbd_replay/actions.cc b/src/rbd_replay/actions.cc index d48ccef3d8d0..cf12ba349d39 100644 --- a/src/rbd_replay/actions.cc +++ b/src/rbd_replay/actions.cc @@ -330,18 +330,17 @@ void OpenImageAction::perform(ActionCtx &worker) { worker.add_pending(io); librbd::Image *image = new librbd::Image(); librbd::RBD *rbd = worker.rbd(); - pair name(worker.map_image_name(m_name, m_snap_name)); + ImageName name(worker.map_image_name(m_name, m_snap_name)); int r; if (m_readonly || worker.readonly()) { - r = rbd->open_read_only(*worker.ioctx(), *image, name.first.c_str(), name.second.c_str()); + r = rbd->open_read_only(*worker.ioctx(), *image, name.image().c_str(), name.snap().c_str()); } else { - r = rbd->open(*worker.ioctx(), *image, name.first.c_str(), name.second.c_str()); + r = rbd->open(*worker.ioctx(), *image, name.image().c_str(), name.snap().c_str()); } if (r) { cerr << "Unable to open image '" << m_name << "' with snap '" << m_snap_name - << "' (mapped to '" << name.first - << "' and '" << name.second + << "' (mapped to '" << name.str() << "') and readonly " << m_readonly << ": (" << -r << ") " << strerror(-r) << std::endl; exit(1); diff --git a/src/rbd_replay/actions.hpp b/src/rbd_replay/actions.hpp index c384f62ad92c..f3f365203ae4 100644 --- a/src/rbd_replay/actions.hpp +++ b/src/rbd_replay/actions.hpp @@ -18,6 +18,7 @@ #include #include "include/rbd/librbd.hpp" #include "Deser.hpp" +#include "ImageName.hpp" namespace rbd_replay { @@ -68,7 +69,7 @@ public: virtual void stop() = 0; - virtual std::pair map_image_name(std::string image_name, std::string snap_name) const = 0; + virtual rbd_replay::ImageName map_image_name(std::string image_name, std::string snap_name) const = 0; }; diff --git a/src/rbd_replay/rbd-replay.cc b/src/rbd_replay/rbd-replay.cc index b1e3cb586da3..a48c4fea52ca 100644 --- a/src/rbd_replay/rbd-replay.cc +++ b/src/rbd_replay/rbd-replay.cc @@ -45,14 +45,13 @@ static void usage(const char* program) { cout << std::endl; cout << "Image mapping rules:" << std::endl; cout << "A rule of image1@snap1=image2@snap2 would map snap1 of image1 to snap2 of" << std::endl; - cout << "image2. Regular expressions are used, so image@snap_(.*)=image_$1@ would map" << std::endl; - cout << "image@snap_1 to image_1@. (Note that an un-snapshotted image has the empty" << std::endl; - cout << "string for the snapshot name.)" << std::endl; + cout << "image2. Regular expressions are used, so image@snap_(.*)=image_$1 would map" << std::endl; + cout << "image@snap_1 to image_1." << std::endl; } -static ImageNameMap::Name bad_mapping(ImageNameMap::Name input, string output) { - dout(0) << "Bad value returned from mapping. Image: '" << input.first << "', snap '" << input.second << "', output: '" << output << "'. Using image: '" << output << ", snap ''." << dendl; - return ImageNameMap::Name(output, ""); +static ImageName bad_mapping(ImageName input, string output) { + dout(0) << "Bad value returned from mapping. Input: '" << input.str() << "', output: '" << output << "'. Using image: '" << output << ", snap ''." << dendl; + return ImageName("", output, ""); } int main(int argc, const char **argv) { diff --git a/src/test/test_rbd_replay.cc b/src/test/test_rbd_replay.cc index e41a6b09a891..d8b3a664970c 100644 --- a/src/test/test_rbd_replay.cc +++ b/src/test/test_rbd_replay.cc @@ -25,12 +25,12 @@ using rbd_replay::ImageNameMap; using rbd_replay::NameMap; using rbd_replay::rbd_loc; -std::ostream& operator<<(std::ostream& o, const ImageNameMap::Name& name) { - return o << "('" << name.first << "', '" << name.second << "')"; +std::ostream& operator<<(std::ostream& o, const ImageName& name) { + return o << "('" << name.pool() << "', '" << name.image() << "', '" << name.snap() << "')"; } -static ImageNameMap::Name bad_mapping(ImageNameMap::Name input, std::string output) { - return ImageNameMap::Name("xxx", "xxx"); +static ImageName bad_mapping(ImageName input, std::string output) { + return ImageName("xxx", "xxx", "xxx"); } static void add_mapping(ImageNameMap *map, std::string mapping_string) { @@ -68,7 +68,6 @@ TEST(RBDReplay, Deser) { } TEST(RBDReplay, ImageNameMap) { - typedef ImageNameMap::Name Name; ImageNameMap m; m.set_bad_mapping_fallback(bad_mapping); add_mapping(&m, "x@y=y@x"); @@ -77,14 +76,14 @@ TEST(RBDReplay, ImageNameMap) { add_mapping(&m, "a\\\\@b@c=d@e"); add_mapping(&m, "a@b\\\\@c=f@g"); add_mapping(&m, "image@snap_(.*)=image_$1@"); - add_mapping(&m, "bad@=@@@"); - EXPECT_EQ(Name("y", "x"), m.map(Name("x", "y"))); - EXPECT_EQ(Name("h", "i"), m.map(Name("a=b", "c"))); - EXPECT_EQ(Name("j", "k"), m.map(Name("a", "b=c"))); - EXPECT_EQ(Name("d", "e"), m.map(Name("a@b", "c"))); - EXPECT_EQ(Name("f", "g"), m.map(Name("a", "b@c"))); - EXPECT_EQ(Name("image_1", ""), m.map(Name("image", "snap_1"))); - EXPECT_EQ(Name("xxx", "xxx"), m.map(Name("bad", ""))); + add_mapping(&m, "bad=@@@"); + EXPECT_EQ(ImageName("", "y", "x"), m.map(ImageName("", "x", "y"))); + EXPECT_EQ(ImageName("", "h", "i"), m.map(ImageName("", "a=b", "c"))); + EXPECT_EQ(ImageName("", "j", "k"), m.map(ImageName("", "a", "b=c"))); + EXPECT_EQ(ImageName("", "d", "e"), m.map(ImageName("", "a@b", "c"))); + EXPECT_EQ(ImageName("", "f", "g"), m.map(ImageName("", "a", "b@c"))); + EXPECT_EQ(ImageName("", "image_1", ""), m.map(ImageName("", "image", "snap_1"))); + EXPECT_EQ(ImageName("xxx", "xxx", "xxx"), m.map(ImageName("", "bad", ""))); } TEST(RBDReplay, NameMap) {