From: Adam Crume Date: Thu, 21 Aug 2014 16:41:39 +0000 (-0700) Subject: rbd-replay: Add --anonymize flag to rbd-replay-prep X-Git-Tag: v0.88~176^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3911354d613e845cc565a999f492e1502906fd73;p=ceph.git rbd-replay: Add --anonymize flag to rbd-replay-prep Signed-off-by: Adam Crume --- diff --git a/doc/man/8/rbd-replay-prep.rst b/doc/man/8/rbd-replay-prep.rst index 9bc93be6ff48..e71894af97f1 100644 --- a/doc/man/8/rbd-replay-prep.rst +++ b/doc/man/8/rbd-replay-prep.rst @@ -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 ======== diff --git a/man/rbd-replay-prep.8 b/man/rbd-replay-prep.8 index 707fe73448c5..5b3c90102cce 100644 --- a/man/rbd-replay-prep.8 +++ b/man/rbd-replay-prep.8 @@ -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: diff --git a/src/rbd_replay/rbd-replay-prep.cc b/src/rbd_replay/rbd-replay-prep.cc index 63a5fda55ac4..4d0d1918467b 100644 --- a/src/rbd_replay/rbd-replay-prep.cc +++ b/src/rbd_replay/rbd-replay-prep.cc @@ -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 anonymize(string snap_name) { + if (snap_name == "") { + return pair(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(m_anonymized_image_name, anonymized_snap_name); + } + +private: + string m_image_name; + string m_anonymized_image_name; + map m_snaps; +}; + static void usage(string prog) { - cout << "Usage: " << prog << " [ --window ] " << endl; + cout << "Usage: " << prog << " [ --window ] [ --anonymize ] " << 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()), m_ios(vector()), - m_pending_ios(map()) { + m_pending_ios(map()), + m_anonymize(false), + m_anonymized_images(map()) { } void run(vector 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 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 map_image_snap(string image_name, string snap_name) { + if (!m_anonymize) { + return pair(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 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 m_pending_ios; + + bool m_anonymize; + map m_anonymized_images; }; int main(int argc, char** argv) {