]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-replay: Add --anonymize flag to rbd-replay-prep
authorAdam Crume <adamcrume@gmail.com>
Thu, 21 Aug 2014 16:41:39 +0000 (09:41 -0700)
committerAdam Crume <adamcrume@gmail.com>
Thu, 11 Sep 2014 23:47:56 +0000 (16:47 -0700)
Signed-off-by: Adam Crume <adamcrume@gmail.com>
doc/man/8/rbd-replay-prep.rst
man/rbd-replay-prep.8
src/rbd_replay/rbd-replay-prep.cc

index 9bc93be6ff48041ced02304ed3b5a6c709df589d..e71894af97f101bda19eed3d546753d3b68c9b08 100644 (file)
@@ -7,7 +7,7 @@
 Synopsis
 ========
 
-| **rbd-replay-prep** [ --window *seconds* ] *trace_dir* *replay_file*
+| **rbd-replay-prep** [ --window *seconds* ] [ --anonymize ] *trace_dir* *replay_file*
 
 
 Description
@@ -23,6 +23,10 @@ Options
 
    Requests further apart than 'seconds' seconds are assumed to be independent.
 
+.. option:: --anonymize
+
+   Anonymizes image and snap names.
+
 
 Examples
 ========
index 707fe73448c536f1ea4bedc41c6987861a1aca63..5b3c90102ccee1355bfc11ec9667ef6dd627b93e 100644 (file)
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "RBD-REPLAY-PREP" "8" "August 11, 2014" "dev" "Ceph"
+.TH "RBD-REPLAY-PREP" "8" "August 21, 2014" "dev" "Ceph"
 .SH NAME
 rbd-replay-prep \- prepare captured rados block device (RBD) workloads for replay
 .
@@ -59,7 +59,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 ..
 .SH SYNOPSIS
 .nf
-\fBrbd\-replay\-prep\fP [ \-\-window \fIseconds\fP ] \fItrace_dir\fP \fIreplay_file\fP
+\fBrbd\-replay\-prep\fP [ \-\-window \fIseconds\fP ] [ \-\-anonymize ] \fItrace_dir\fP \fIreplay_file\fP
 .fi
 .sp
 .SH DESCRIPTION
@@ -71,6 +71,11 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .B \-\-window seconds
 Requests further apart than \(aqseconds\(aq seconds are assumed to be independent.
 .UNINDENT
+.INDENT 0.0
+.TP
+.B \-\-anonymize
+Anonymizes image and snap names.
+.UNINDENT
 .SH EXAMPLES
 .sp
 To prepare workload1\-trace for replay:
index 63a5fda55ac49e82c81a8aaa28f4425402732403..4d0d1918467bbc48a9c2990afbf264ad7dc87c18 100644 (file)
@@ -85,8 +85,41 @@ private:
   uint64_t m_max_ts;
 };
 
+class AnonymizedImage {
+public:
+  void init(string image_name, int index) {
+    assert(m_image_name == "");
+    m_image_name = image_name;
+    ostringstream oss;
+    oss << "image" << index;
+    m_anonymized_image_name = oss.str();
+  }
+
+  string image_name() const {
+    return m_image_name;
+  }
+
+  pair<string, string> anonymize(string snap_name) {
+    if (snap_name == "") {
+      return pair<string, string>(m_anonymized_image_name, "");
+    }
+    string& anonymized_snap_name(m_snaps[snap_name]);
+    if (anonymized_snap_name == "") {
+      ostringstream oss;
+      oss << "snap" << m_snaps.size();
+      anonymized_snap_name = oss.str();
+    }
+    return pair<string, string>(m_anonymized_image_name, anonymized_snap_name);
+  }
+
+private:
+  string m_image_name;
+  string m_anonymized_image_name;
+  map<string, string> m_snaps;
+};
+
 static void usage(string prog) {
-  cout << "Usage: " << prog << " [ --window <seconds> ] <trace-input> <replay-output>" << endl;
+  cout << "Usage: " << prog << " [ --window <seconds> ] [ --anonymize ] <trace-input> <replay-output>" << endl;
 }
 
 __attribute__((noreturn)) static void usage_exit(string prog, string msg) {
@@ -104,7 +137,9 @@ public:
       m_recent_completions(io_set_t()),
       m_open_images(set<imagectx_id_t>()),
       m_ios(vector<IO::ptr>()),
-      m_pending_ios(map<uint64_t, IO::ptr>()) {
+      m_pending_ios(map<uint64_t, IO::ptr>()),
+      m_anonymize(false),
+      m_anonymized_images(map<string, AnonymizedImage>()) {
   }
 
   void run(vector<string> args) {
@@ -123,6 +158,8 @@ public:
        // TODO: test
        printf("Arg: '%s'\n", arg.c_str() + sizeof("--window="));
        m_window = (uint64_t)(1e9 * atof(arg.c_str() + sizeof("--window=")));
+      } else if (arg == "--anonymize") {
+       m_anonymize = true;
       } else if (arg == "-h" || arg == "--help") {
        usage(args[0]);
        exit(0);
@@ -335,7 +372,8 @@ private:
       bool readonly = fields.int64("read_only");
       imagectx_id_t imagectx = fields.uint64("imagectx");
       action_id_t ionum = next_id();
-      IO::ptr io(new OpenImageIO(ionum, ts, threadID, thread->pending_io(), imagectx, name, snap_name, readonly));
+      pair<string, string> aname(map_image_snap(name, snap_name));
+      IO::ptr io(new OpenImageIO(ionum, ts, threadID, thread->pending_io(), imagectx, aname.first, aname.second, readonly));
       io->add_dependencies(m_recent_completions);
       thread->issued_io(io, m_threads);
       m_ios.push_back(io);
@@ -443,6 +481,17 @@ private:
     m_recent_completions.insert(io);
   }
 
+  pair<string, string> map_image_snap(string image_name, string snap_name) {
+    if (!m_anonymize) {
+      return pair<string, string>(image_name, snap_name);
+    }
+    AnonymizedImage& m(m_anonymized_images[image_name]);
+    if (m.image_name() == "") {
+      m.init(image_name, m_anonymized_images.size());
+    }
+    return m.anonymize(snap_name);
+  }
+
   void require_image(uint64_t ts,
                     Thread::ptr thread,
                     imagectx_id_t imagectx,
@@ -454,7 +503,8 @@ private:
       return;
     }
     action_id_t ionum = next_id();
-    IO::ptr io(new OpenImageIO(ionum, ts - 2, thread->id(), thread->pending_io(), imagectx, name, snap_name, readonly));
+    pair<string, string> aname(map_image_snap(name, snap_name));
+    IO::ptr io(new OpenImageIO(ionum, ts - 2, thread->id(), thread->pending_io(), imagectx, aname.first, aname.second, readonly));
     io->add_dependencies(m_recent_completions);
     thread->issued_io(io, m_threads);
     m_ios.push_back(io);
@@ -473,6 +523,9 @@ private:
 
   // keyed by completion
   map<uint64_t, IO::ptr> m_pending_ios;
+
+  bool m_anonymize;
+  map<string, AnonymizedImage> m_anonymized_images;
 };
 
 int main(int argc, char** argv) {