]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
common/TrackedOp: use string_view interface
authorPatrick Donnelly <pdonnell@redhat.com>
Fri, 11 Jan 2019 20:28:42 +0000 (12:28 -0800)
committerPatrick Donnelly <pdonnell@redhat.com>
Fri, 11 Jan 2019 22:58:51 +0000 (14:58 -0800)
Also, don't store pointers to strings outside. The interface was written to
optimize for string literals but this is structurally unsafe programming.

Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
src/common/TrackedOp.cc
src/common/TrackedOp.h
src/mds/Server.cc
src/mds/Server.h
src/mon/MonOpRequest.h
src/mon/PaxosService.h
src/osd/OpRequest.cc
src/osd/OpRequest.h
src/osd/ReplicatedBackend.cc

index b561101afd6a95505b54484942899d5af30ef6d9..975e58a226013327a8a35d3b859f6e284a328aa5 100644 (file)
@@ -390,7 +390,7 @@ bool OpTracker::check_ops_in_flight(std::string* summary,
     ss << "slow request " << age << " seconds old, received at "
        << op.get_initiated() << ": " << op.get_desc()
        << " currently "
-        << (op.current ? op.current : op.state_string());
+       << op.state_string();
     warnings.push_back(ss.str());
     // only those that have been shown will backoff
     op.warn_interval_multiplier *= 2;
@@ -434,7 +434,7 @@ void OpTracker::get_age_ms_histogram(pow2_hist_t *h)
 #undef dout_context
 #define dout_context tracker->cct
 
-void TrackedOp::mark_event_string(const string &event, utime_t stamp)
+void TrackedOp::mark_event(std::string_view event, utime_t stamp)
 {
   if (!state)
     return;
@@ -442,25 +442,6 @@ void TrackedOp::mark_event_string(const string &event, utime_t stamp)
   {
     std::lock_guard l(lock);
     events.emplace_back(stamp, event);
-    current = events.back().c_str();
-  }
-  dout(6) << " seq: " << seq
-         << ", time: " << stamp
-         << ", event: " << event
-         << ", op: " << get_desc()
-         << dendl;
-  _event_marked();
-}
-
-void TrackedOp::mark_event(const char *event, utime_t stamp)
-{
-  if (!state)
-    return;
-
-  {
-    std::lock_guard l(lock);
-    events.emplace_back(stamp, event);
-    current = event;
   }
   dout(6) << " seq: " << seq
          << ", time: " << stamp
index 8c6c37b9e9eedaf0d0dedb0484203f7cef0cb0c7..71072070bbe407d0af3fd57a9ab5e192ac737600 100644 (file)
@@ -234,35 +234,26 @@ protected:
 
   struct Event {
     utime_t stamp;
-    string str;
-    const char *cstr = nullptr;
+    std::string str;
 
-    Event(utime_t t, const string& s) : stamp(t), str(s) {}
-    Event(utime_t t, const char *s) : stamp(t), cstr(s) {}
+    Event(utime_t t, std::string_view s) : stamp(t), str(s) {}
 
     int compare(const char *s) const {
-      if (cstr)
-       return strcmp(cstr, s);
-      else
-       return str.compare(s);
+      return str.compare(s);
     }
 
     const char *c_str() const {
-      if (cstr)
-       return cstr;
-      else
-       return str.c_str();
+      return str.c_str();
     }
 
     void dump(Formatter *f) const {
       f->dump_stream("time") << stamp;
-      f->dump_string("event", c_str());
+      f->dump_string("event", str);
     }
   };
 
   vector<Event> events;    ///< list of events and their times
   mutable ceph::mutex lock = ceph::make_mutex("TrackedOp::lock"); ///< to protect the events list
-  const char *current = 0; ///< the current state the event is in
   uint64_t seq = 0;        ///< a unique value set by the OpTracker
 
   uint32_t warn_interval_multiplier = 1; //< limits output of a given op warning
@@ -374,18 +365,15 @@ public:
       return ceph_clock_now() - get_initiated();
   }
 
-  void mark_event_string(const string &event,
-                        utime_t stamp=ceph_clock_now());
-  void mark_event(const char *event,
-                 utime_t stamp=ceph_clock_now());
+  void mark_event(std::string_view event, utime_t stamp=ceph_clock_now());
 
   void mark_nowarn() {
     warn_interval_multiplier = 0;
   }
 
-  virtual const char *state_string() const {
+  virtual std::string_view state_string() const {
     std::lock_guard l(lock);
-    return events.rbegin()->c_str();
+    return events.empty() ? std::string_view() : std::string_view(events.rbegin()->str);
   }
 
   void dump(utime_t now, Formatter *f) const;
index 0171b3b2eb339ca5a2b3a3a676b76868ee5ecc02..5188c3d2a6bde6f01fa420969fbe60d2d1b8da8c 100644 (file)
@@ -1599,12 +1599,12 @@ void Server::journal_and_reply(MDRequestRef& mdr, CInode *in, CDentry *dn, LogEv
 }
 
 void Server::submit_mdlog_entry(LogEvent *le, MDSLogContextBase *fin, MDRequestRef& mdr,
-                                const char *event)
+                                std::string_view event)
 {
   if (mdr) {
     string event_str("submit entry: ");
     event_str += event;
-    mdr->mark_event_string(event_str);
+    mdr->mark_event(event_str);
   } 
   mdlog->submit_entry(le, fin);
 }
index dbd82ef3e3ee4512f700dbc78a95ca7d72a39f94..d49d653abfeb86dd8accdbfa501d3a5a2aa1bb07 100644 (file)
@@ -173,7 +173,7 @@ public:
   void journal_and_reply(MDRequestRef& mdr, CInode *tracei, CDentry *tracedn,
                         LogEvent *le, MDSLogContextBase *fin);
   void submit_mdlog_entry(LogEvent *le, MDSLogContextBase *fin,
-                          MDRequestRef& mdr, const char *evt);
+                          MDRequestRef& mdr, std::string_view event);
   void dispatch_client_request(MDRequestRef& mdr);
   void perf_gather_op_latency(const MClientRequest::const_ref &req, utime_t lat);
   void early_reply(MDRequestRef& mdr, CInode *tracei, CDentry *tracedn);
index 5c1d6eeacc7d8e8110970fe35a03c4466cb8b156..6b0fdf3e49becb6ab05f180007cf712b9d6c99fe 100644 (file)
@@ -41,7 +41,7 @@ struct MonOpRequest : public TrackedOp {
   void mark_svc_event(const string &service, const string &event) {
     string s = service;
     s.append(":").append(event);
-    mark_event_string(s);
+    mark_event(s);
   }
 
   void mark_logmon_event(const string &event) {
@@ -217,7 +217,7 @@ struct C_MonOp : public Context
 
   void mark_op_event(const string &event) {
     if (op)
-      op->mark_event_string(event);
+      op->mark_event(event);
   }
 
   virtual void _finish(int r) = 0;
index d1b96b9a191aa515c04bc2d9ad521b9dba69fde4..36d39ad799b72ea85660a2d09846dd5ea9cb167b 100644 (file)
@@ -543,7 +543,7 @@ public:
    */
   void wait_for_finished_proposal(MonOpRequestRef op, Context *c) {
     if (op)
-      op->mark_event_string(service_name + ":wait_for_finished_proposal");
+      op->mark_event(service_name + ":wait_for_finished_proposal");
     waiting_for_finished_proposal.push_back(c);
   }
   void wait_for_finished_proposal_ctx(Context *c) {
@@ -558,7 +558,7 @@ public:
    */
   void wait_for_active(MonOpRequestRef op, Context *c) {
     if (op)
-      op->mark_event_string(service_name + ":wait_for_active");
+      op->mark_event(service_name + ":wait_for_active");
 
     if (!is_proposing()) {
       paxos->wait_for_active(op, c);
@@ -585,7 +585,7 @@ public:
      * happens to be readable at that specific point in time.
      */
     if (op)
-      op->mark_event_string(service_name + ":wait_for_readable");
+      op->mark_event(service_name + ":wait_for_readable");
 
     if (is_proposing() ||
        ver > get_last_committed() ||
@@ -593,7 +593,7 @@ public:
       wait_for_finished_proposal(op, c);
     else {
       if (op)
-        op->mark_event_string(service_name + ":wait_for_readable/paxos");
+        op->mark_event(service_name + ":wait_for_readable/paxos");
 
       paxos->wait_for_readable(op, c);
     }
@@ -611,7 +611,7 @@ public:
    */
   void wait_for_writeable(MonOpRequestRef op, Context *c) {
     if (op)
-      op->mark_event_string(service_name + ":wait_for_writeable");
+      op->mark_event(service_name + ":wait_for_writeable");
 
     if (is_proposing())
       wait_for_finished_proposal(op, c);
index a33c1391abef6881648a1022de152c3a50ddd266..35ff7f28d9e9d93c3d6b850754a8f534e6c94d41 100644 (file)
@@ -151,7 +151,7 @@ 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);
+  mark_event(s);
   hit_flag_points |= flag;
   latest_flag_point = flag;
   tracepoint(oprequest, mark_flag_point, reqid.name._type,
index 5bfb730f5d001f69ab36b1c9f123117e02a80cb7..184d26acc2914f2750fa24a070e5bd41c5985f40 100644 (file)
@@ -121,7 +121,7 @@ public:
     }
   }
 
-  const char *state_string() const override {
+  std::string_view state_string() const override {
     switch(latest_flag_point) {
     case flag_queued_for_pg: return "queued for pg";
     case flag_reached_pg: return "reached pg";
index a06c4f4448eacc7c6d9dd500be795f98526ddb5f..18532fd96874e6416a35501970ca0be864aef1e4 100644 (file)
@@ -566,7 +566,7 @@ void ReplicatedBackend::do_repop_reply(OpRequestRef op)
       ceph_assert(ip_op.waiting_for_commit.count(from));
       ip_op.waiting_for_commit.erase(from);
       if (ip_op.op) {
-       ip_op.op->mark_event_string("sub_op_commit_rec");
+       ip_op.op->mark_event("sub_op_commit_rec");
        ip_op.op->pg_trace.event("sub_op_commit_rec");
       }
     } else {