]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-replay: Switch ImageNameMap to using rbd_loc
authorAdam Crume <adamcrume@gmail.com>
Wed, 6 Aug 2014 23:00:40 +0000 (16:00 -0700)
committerSage Weil <sage@redhat.com>
Thu, 21 Aug 2014 17:57:32 +0000 (10:57 -0700)
Signed-off-by: Adam Crume <adamcrume@gmail.com>
src/rbd_replay/ImageNameMap.cc
src/rbd_replay/ImageNameMap.hpp
src/rbd_replay/Replayer.cc
src/rbd_replay/Replayer.hpp
src/rbd_replay/actions.cc
src/rbd_replay/actions.hpp
src/rbd_replay/rbd-replay.cc
src/test/test_rbd_replay.cc

index 6331e5a58b7c07facb978161ecf62333aca0f2a6..336f7c6aad47a2d12dce5e1de8b3b02f957a3376 100644 (file)
@@ -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;
index 36570481eaec82ff6912823891af20d530daa187..c360db7f0ee44896a1ef8c94051192a2260a39dd 100644 (file)
@@ -20,6 +20,7 @@
 #include <vector>
 #include <boost/function.hpp>
 #include <boost/regex.hpp>
+#include "ImageName.hpp"
 #include "NameMap.hpp"
 
 namespace rbd_replay {
@@ -28,9 +29,7 @@ class ImageNameMap {
 public:
   typedef std::pair<boost::regex, std::string> Mapping;
 
-  typedef std::pair<std::string, std::string> Name;
-
-  typedef boost::function<Name (Name input, std::string output)> BadMappingFallback;
+  typedef boost::function<rbd_replay::ImageName (const rbd_replay::ImageName& input, std::string output)> 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;
 };
 
index 54b61e1ef7493178e98ea99aa3bb35f4968c5f32..eeb40297571fb845a6da0971abe35c4ffb7c680c 100644 (file)
@@ -128,8 +128,8 @@ bool Worker::readonly() const {
   return m_replayer.readonly();
 }
 
-pair<string, string> Worker::map_image_name(string image_name, string snap_name) const {
-  return m_replayer.image_name_map().map(pair<string,string>(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));
 }
 
 
index 55654e08c51343ed103bf2decbfd50f2194a786f..f16d8e39215f9d36137508dd4739a49945cdf39d 100644 (file)
@@ -56,7 +56,7 @@ public:
 
   bool readonly() const;
 
-  std::pair<std::string, std::string> 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();
index d48ccef3d8d07806c91bd4baf860f8129b8f5f0d..cf12ba349d39c342aa9286f1c499de9b75e74d3b 100644 (file)
@@ -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<string, string> 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);
index c384f62ad92cef96d229f17a565adc9a4cf0b734..f3f365203ae4461466fde99ae541d102063a52c2 100644 (file)
@@ -18,6 +18,7 @@
 #include <boost/shared_ptr.hpp>
 #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<std::string, std::string> 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;
 };
 
 
index b1e3cb586da3e86ea73fd70d5b8140db15f2cae2..a48c4fea52cae13405e4cf6dfe7ee1fc6710a772 100644 (file)
@@ -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) {
index e41a6b09a891657accbc851fa05d7b8910f3d619..d8b3a664970c73f00aeb741f66734df9535b5f36 100644 (file)
@@ -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) {