CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
StorageAccount.cc
Go to the documentation of this file.
2 #include <boost/thread/mutex.hpp>
3 #include <sstream>
4 #include <unistd.h>
5 
8 
9 static double timeRealNanoSecs (void) {
10 #if _POSIX_TIMERS > 0
11  struct timespec tm;
12  if (clock_gettime(CLOCK_REALTIME, &tm) == 0)
13  return tm.tv_sec * 1e9 + tm.tv_nsec;
14 #else
15  struct timeval tm;
16  if (gettimeofday(&tm, 0) == 0)
17  return tm.tv_sec * 1e9 + tm.tv_usec * 1e3;
18 #endif
19  return 0;
20 }
21 
22 static std::string i2str(int i) {
23  std::ostringstream t;
24  t << i;
25  return t.str();
26 }
27 
28 static std::string d2str(double d) {
29  std::ostringstream t;
30  t << d;
31  return t.str();
32 }
33 
34 std::string
35 StorageAccount::summaryText (bool banner /*=false*/) {
36  bool first = true;
37  std::ostringstream os;
38  if (banner)
39  os << "stats: class/operation/attempts/successes/amount/time-total/time-min/time-max\n";
40  for (StorageStats::iterator i = s_stats.begin (); i != s_stats.end(); ++i)
41  for (OperationStats::iterator j = i->second->begin (); j != i->second->end (); ++j, first = false)
42  os << (first ? "" : "; ")
43  << i->first << '/'
44  << j->first << '='
45  << j->second.attempts << '/'
46  << j->second.successes << '/'
47  << (j->second.amount / 1024 / 1024) << "MB/"
48  << (j->second.timeTotal / 1000 / 1000) << "ms/"
49  << (j->second.timeMin / 1000 / 1000) << "ms/"
50  << (j->second.timeMax / 1000 / 1000) << "ms";
51 
52  return os.str ();
53 }
54 
55 std::string
57  bool first = true;
58  std::ostringstream os;
59  os << "<storage-timing-summary>\n";
60  for (StorageStats::iterator i = s_stats.begin (); i != s_stats.end(); ++i)
61  for (OperationStats::iterator j = i->second->begin (); j != i->second->end (); ++j, first = false)
62  os << " <counter-value subsystem='" << i->first
63  << "' counter-name='" << j->first
64  << "' num-operations='" << j->second.attempts
65  << "' num-successful-operations='" << j->second.successes
66  << "' total-megabytes='" << (j->second.amount / 1024 / 1024)
67  << "' total-msecs='" << (j->second.timeTotal / 1000 / 1000)
68  << "' min-msecs='" << (j->second.timeMin / 1000 / 1000)
69  << "' max-msecs='" << (j->second.timeMax / 1000 / 1000) << "'/>\n";
70  os << "</storage-timing-summary>";
71  return os.str ();
72 }
73 
74 void
75 StorageAccount::fillSummary(std::map<std::string, std::string>& summary) {
76  int const oneM = 1000 * 1000;
77  int const oneMeg = 1024 * 1024;
78  for (StorageStats::iterator i = s_stats.begin (); i != s_stats.end(); ++i) {
79  for (OperationStats::iterator j = i->second->begin(); j != i->second->end(); ++j) {
80  std::ostringstream os;
81  os << "Timing-" << i->first << "-" << j->first << "-";
82  summary.insert(std::make_pair(os.str() + "numOperations", i2str(j->second.attempts)));
83  summary.insert(std::make_pair(os.str() + "numSuccessfulOperations", i2str(j->second.successes)));
84  summary.insert(std::make_pair(os.str() + "totalMegabytes", d2str(j->second.amount / oneMeg)));
85  summary.insert(std::make_pair(os.str() + "totalMsecs", d2str(j->second.timeTotal / oneM)));
86  summary.insert(std::make_pair(os.str() + "minMsecs", d2str(j->second.timeMin / oneM)));
87  summary.insert(std::make_pair(os.str() + "maxMsecs", d2str(j->second.timeMax / oneM)));
88  }
89  }
90 }
91 
94 { return s_stats; }
95 
97 StorageAccount::counter (const std::string &storageClass, const std::string &operation) {
98  boost::mutex::scoped_lock lock (s_mutex);
99  boost::shared_ptr<OperationStats> &opstats = s_stats [storageClass];
100  if (!opstats) opstats.reset(new OperationStats);
101 
102  OperationStats::iterator pos = opstats->find (operation);
103  if (pos == opstats->end ()) {
104  Counter x = { 0, 0, 0, 0, 0 };
105  pos = opstats->insert (OperationStats::value_type (operation, x)).first;
106  }
107 
108  return pos->second;
109 }
110 
112  : m_counter (counter),
113  m_start (timeRealNanoSecs ())
114 {
115  boost::mutex::scoped_lock lock (s_mutex);
117 }
118 
119 void
120 StorageAccount::Stamp::tick (double amount) const
121 {
122  boost::mutex::scoped_lock lock (s_mutex);
123  double elapsed = timeRealNanoSecs () - m_start;
124  m_counter.successes++;
125  m_counter.amount += amount;
126  m_counter.timeTotal += elapsed;
127  if (elapsed < m_counter.timeMin || m_counter.successes == 1)
128  m_counter.timeMin = elapsed;
129  if (elapsed > m_counter.timeMax)
130  m_counter.timeMax = elapsed;
131 }
int i
Definition: DBlmapReader.cc:9
static double timeRealNanoSecs(void)
static void fillSummary(std::map< std::string, std::string > &summary)
static boost::mutex mutex
Definition: LHEProxy.cc:11
std::map< std::string, Counter > OperationStats
static const StorageStats & summary(void)
Container::value_type value_type
StorageAccount::StorageStats s_stats
std::map< std::string, boost::shared_ptr< OperationStats > > StorageStats
static std::string d2str(double d)
int j
Definition: DBlmapReader.cc:9
bool first
Definition: L1TdeRCT.cc:79
static std::string i2str(int i)
static std::string summaryXML(void)
void tick(double amount=0.) const
static Counter & counter(const std::string &storageClass, const std::string &operation)
Stamp(Counter &counter)
static std::string summaryText(bool banner=false)
boost::mutex s_mutex