]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
common/TrackedOp: add const char* and string variants of event
authorSage Weil <sage@redhat.com>
Thu, 15 Dec 2016 23:14:03 +0000 (18:14 -0500)
committerSage Weil <sage@redhat.com>
Fri, 27 Jan 2017 15:30:44 +0000 (10:30 -0500)
This avoids the full std::string (copy) for most events.  Wrap it up
into an Event class to hide some of the guts.

Signed-off-by: Sage Weil <sage@redhat.com>
src/common/TrackedOp.cc
src/common/TrackedOp.h
src/mds/Mutation.cc
src/mds/Server.cc
src/mon/MonOpRequest.h
src/mon/PaxosService.h
src/mon/mon_types.h
src/osd/OpRequest.cc
src/osd/OpRequest.h
src/osd/ReplicatedBackend.cc

index de607180263890ce5095de062b7464cc39fc991f..0a29cf2aa54225487a9f93ec4860ed5663b07601 100644 (file)
@@ -338,12 +338,26 @@ void TrackedOp::mark_event(const string &event)
   utime_t now = ceph_clock_now();
   {
     Mutex::Locker l(lock);
-    events.push_back(make_pair(now, event));
+    events.push_back(Event(now, event));
   }
   tracker->mark_event(this, event.c_str());
   _event_marked();
 }
 
+void TrackedOp::mark_event(const char *event)
+{
+  if (!state)
+    return;
+
+  utime_t now = ceph_clock_now(g_ceph_context);
+  {
+    Mutex::Locker l(lock);
+    events.push_back(Event(now, event));
+  }
+  tracker->mark_event(this, event);
+  _event_marked();
+}
+
 void TrackedOp::dump(utime_t now, Formatter *f) const
 {
   // Ignore if still in the constructor
index d4247530e5a1e64afe25e4be665221cb79127efd..df1a8bea3569270322f9e1812d573d525c3fffe2 100644 (file)
@@ -144,7 +144,36 @@ protected:
   std::atomic_int nref = {0};  ///< ref count
 
   utime_t initiated_at;
-  list<pair<utime_t, string> > events; /// list of events and their times
+
+  struct Event {
+    utime_t stamp;
+    string str;
+    const char *cstr = nullptr;
+
+    Event(utime_t t, const string& s) : stamp(t), str(s) {}
+    Event(utime_t t, const char *s) : stamp(t), cstr(s) {}
+
+    int compare(const char *s) const {
+      if (cstr)
+       return strcmp(cstr, s);
+      else
+       return str.compare(s);
+    }
+
+    const char *c_str() const {
+      if (cstr)
+       return cstr;
+      else
+       return str.c_str();
+    }
+
+    void dump(Formatter *f) const {
+      f->dump_stream("time") << stamp;
+      f->dump_string("event", c_str());
+    }
+  };
+
+  list<Event> events; /// list of events and their times
   mutable Mutex lock; /// to protect the events list
   string current; /// the current state the event is in
   uint64_t seq; /// a unique value set by the OpTracker
@@ -210,21 +239,25 @@ public:
 
   double get_duration() const {
     Mutex::Locker l(lock);
-    if (!events.empty() && events.rbegin()->second.compare("done") == 0)
-      return events.rbegin()->first - get_initiated();
+    if (!events.empty() && events.rbegin()->compare("done") == 0)
+      return events.rbegin()->stamp - get_initiated();
     else
       return ceph_clock_now() - get_initiated();
   }
 
   void mark_event(const string &event);
+  void mark_event(const char *event);
+
   virtual const char *state_string() const {
     Mutex::Locker l(lock);
-    return events.rbegin()->second.c_str();
+    return events.rbegin()->c_str();
   }
+
   void dump(utime_t now, Formatter *f) const;
+
   void tracking_start() {
     if (tracker->register_inflight_op(this)) {
-      events.push_back(make_pair(initiated_at, "initiated"));
+      events.push_back(Event(initiated_at, "initiated"));
       state = STATE_LIVE;
     }
   }
index 812d1a7a05aaaf4762ee587318910fe3476bab33..a8bd18d3709322ee9c41b05367922dc90d271ea3 100644 (file)
@@ -368,13 +368,8 @@ void MDRequestImpl::_dump(Formatter *f) const
   {
     f->open_array_section("events");
     Mutex::Locker l(lock);
-    for (list<pair<utime_t, string> >::const_iterator i = events.begin();
-         i != events.end();
-         ++i) {
-      f->open_object_section("event");
-      f->dump_stream("time") << i->first;
-      f->dump_string("event", i->second);
-      f->close_section();
+    for (auto& i : events) {
+      f->dump_object("event", i);
     }
     f->close_section(); // events
   }
index dff75670230a56dbb928b553b00995eaa7e97c02..a32511656801ea6961207f3a4c6a9ad683a86708 100644 (file)
@@ -1022,7 +1022,7 @@ void Server::submit_mdlog_entry(LogEvent *le, MDSLogContextBase *fin, MDRequestR
   if (mdr) {
     string event_str("submit entry: ");
     event_str += event;
-    mdr->mark_event(event_str);
+    mdr->mark_event_string(event_str);
   } 
   mdlog->submit_entry(le, fin);
 }
index 2080b606e5690916c102d9e9676186df18da9e08..af7b23f6bb56662d7ba43262f1df42aee3e5ce34 100644 (file)
@@ -42,7 +42,7 @@ struct MonOpRequest : public TrackedOp {
   void mark_svc_event(const string &service, const string &event) {
     string s = service;
     s.append(":").append(event);
-    mark_event(s);
+    mark_event_string(s);
   }
 
   void mark_logmon_event(const string &event) {
@@ -112,12 +112,8 @@ private:
     {
       f->open_array_section("events");
       Mutex::Locker l(lock);
-      for (list<pair<utime_t,string> >::const_iterator i = events.begin();
-           i != events.end(); ++i) {
-        f->open_object_section("event");
-        f->dump_stream("time") << i->first;
-        f->dump_string("event", i->second);
-        f->close_section();
+      for (auto& i : events) {
+       f->dump_object("event", i);
       }
       f->close_section();
       f->open_object_section("info");
index bb550d1ca07302cba3dc62a891e6037a86dd5265..95ce338131db32e12a808a9320b6df23e797d17a 100644 (file)
@@ -541,7 +541,7 @@ public:
    */
   void wait_for_finished_proposal(MonOpRequestRef op, Context *c) {
     if (op)
-      op->mark_event(service_name + ":wait_for_finished_proposal");
+      op->mark_event_string(service_name + ":wait_for_finished_proposal");
     waiting_for_finished_proposal.push_back(c);
   }
   void wait_for_finished_proposal_ctx(Context *c) {
@@ -556,7 +556,7 @@ public:
    */
   void wait_for_active(MonOpRequestRef op, Context *c) {
     if (op)
-      op->mark_event(service_name + ":wait_for_active");
+      op->mark_event_string(service_name + ":wait_for_active");
 
     if (!is_proposing()) {
       paxos->wait_for_active(op, c);
@@ -583,7 +583,7 @@ public:
      * happens to be readable at that specific point in time.
      */
     if (op)
-      op->mark_event(service_name + ":wait_for_readable");
+      op->mark_event_string(service_name + ":wait_for_readable");
 
     if (is_proposing() ||
        ver > get_last_committed() ||
@@ -591,7 +591,7 @@ public:
       wait_for_finished_proposal(op, c);
     else {
       if (op)
-        op->mark_event(service_name + ":wait_for_readable/paxos");
+        op->mark_event_string(service_name + ":wait_for_readable/paxos");
 
       paxos->wait_for_readable(op, c);
     }
@@ -609,7 +609,7 @@ public:
    */
   void wait_for_writeable(MonOpRequestRef op, Context *c) {
     if (op)
-      op->mark_event(service_name + ":wait_for_writeable");
+      op->mark_event_string(service_name + ":wait_for_writeable");
 
     if (is_proposing())
       wait_for_finished_proposal(op, c);
index b4bc0a64fd1c4f320673ccb61984f04cc34205b9..8b5aa68b51184f494bf39735bf88cb41c37a5568 100644 (file)
@@ -231,7 +231,7 @@ struct C_MonOp : public Context
 
   void mark_op_event(const string &event) {
     if (op)
-      op->mark_event(event);
+      op->mark_event_string(event);
   }
 
   virtual void _finish(int r) = 0;
index 3c2c32ea140c5951d96cc141caf578b119292925..099ca5f3d454bb7d34f894e9a4c6f87d65dd994b 100644 (file)
@@ -63,13 +63,8 @@ void OpRequest::_dump(Formatter *f) const
   {
     f->open_array_section("events");
     Mutex::Locker l(lock);
-    for (list<pair<utime_t, string> >::const_iterator i = events.begin();
-        i != events.end();
-        ++i) {
-      f->open_object_section("event");
-      f->dump_stream("time") << i->first;
-      f->dump_string("event", i->second);
-      f->close_section();
+    for (auto& i : events) {
+      f->dump_object("event", i);
     }
     f->close_section();
   }
@@ -143,7 +138,7 @@ void OpRequest::set_skip_handle_cache() { set_rmw_flags(CEPH_OSD_RMW_FLAG_SKIP_H
 void OpRequest::set_skip_promote() { set_rmw_flags(CEPH_OSD_RMW_FLAG_SKIP_PROMOTE); }
 void OpRequest::set_force_rwordered() { set_rmw_flags(CEPH_OSD_RMW_FLAG_RWORDERED); }
 
-void OpRequest::mark_flag_point(uint8_t flag, const string& s) {
+void OpRequest::mark_flag_point(uint8_t flag, const char *s) {
 #ifdef WITH_LTTNG
   uint8_t old_flags = hit_flag_points;
 #endif
@@ -151,6 +146,18 @@ void OpRequest::mark_flag_point(uint8_t flag, const string& s) {
   current = s;
   hit_flag_points |= flag;
   latest_flag_point = flag;
+  tracepoint(oprequest, mark_flag_point, reqid.name._type,
+            reqid.name._num, reqid.tid, reqid.inc, rmw_flags,
+            flag, s, old_flags, hit_flag_points);
+}
+
+void OpRequest::mark_flag_point_string(uint8_t flag, const string& s) {
+#ifdef WITH_LTTNG
+  uint8_t old_flags = hit_flag_points;
+#endif
+  mark_event_string(s);
+  hit_flag_points |= flag;
+  latest_flag_point = flag;
   tracepoint(oprequest, mark_flag_point, reqid.name._type,
             reqid.name._num, reqid.tid, reqid.inc, rmw_flags,
             flag, s.c_str(), old_flags, hit_flag_points);
index d92042e50b1001c29c72a20681fcd639f7467a94..f4b27ad45f4fe77c4c64c2e73ed6434e93cab5ab 100644 (file)
@@ -170,13 +170,13 @@ public:
     mark_flag_point(flag_reached_pg, "reached_pg");
   }
   void mark_delayed(const string& s) {
-    mark_flag_point(flag_delayed, s);
+    mark_flag_point_string(flag_delayed, s);
   }
   void mark_started() {
     mark_flag_point(flag_started, "started");
   }
   void mark_sub_op_sent(const string& s) {
-    mark_flag_point(flag_sub_op_sent, s);
+    mark_flag_point_string(flag_sub_op_sent, s);
   }
   void mark_commit_sent() {
     mark_flag_point(flag_commit_sent, "commit_sent");
@@ -197,7 +197,8 @@ public:
 
 private:
   void set_rmw_flags(int flags);
-  void mark_flag_point(uint8_t flag, const string& s);
+  void mark_flag_point(uint8_t flag, const char *s);
+  void mark_flag_point_string(uint8_t flag, const string& s);
 };
 
 typedef OpRequest::Ref OpRequestRef;
index 175af3dd9b3358562e3f22817319057826dd48cc..6af8b333d65ac17b91ee2c7187fb138444af10e7 100644 (file)
@@ -701,14 +701,14 @@ void ReplicatedBackend::sub_op_modify_reply(OpRequestRef op)
       if (ip_op.op) {
         ostringstream ss;
         ss << "sub_op_commit_rec from " << from;
-       ip_op.op->mark_event(ss.str());
+       ip_op.op->mark_event_string(ss.str());
       }
     } else {
       assert(ip_op.waiting_for_applied.count(from));
       if (ip_op.op) {
         ostringstream ss;
         ss << "sub_op_applied_rec from " << from;
-       ip_op.op->mark_event(ss.str());
+       ip_op.op->mark_event_string(ss.str());
       }
     }
     ip_op.waiting_for_applied.erase(from);