otsdaq  3.10.00
SupervisorInfo.cc
1 #include "otsdaq/SupervisorInfo/SupervisorInfo.h"
2 
3 using namespace ots;
4 
5 const std::string SupervisorInfo::APP_STATUS_UNKNOWN = "UNKNOWN";
6 const std::string SupervisorInfo::APP_STATUS_NOT_MONITORED = "Not Monitored";
7 
8 //=====================================================================================
9 void SupervisorInfo::setStatus(const std::string& status,
10  const unsigned int progress,
11  const std::string& detail,
12  const int64_t availableLogSpaceKB,
13  const int64_t availableDataSpaceKB)
14 {
16  if(status != SupervisorInfo::APP_STATUS_UNKNOWN)
17  {
18  lastStatusTime_ = time(0);
19  if(status_ != status)
20  lastStatusChangeTime_ = time(0);
21  }
22  status_ = status;
23  progress_ = progress;
24  detail_ = detail;
25  SupervisorInfo::emplaceAvailableSpace(availableLogSpaceKB, availableLogSpaceKB_);
26  SupervisorInfo::emplaceAvailableSpace(availableDataSpaceKB, availableDataSpaceKB_);
27 } // end setStatus()
28 
29 //=====================================================================================
30 void SupervisorInfo::setSubappStatus(const std::string& name,
31  const std::string& status,
32  const unsigned int progress,
33  const std::string& detail,
34  const int64_t availableLogSpaceKB,
35  const int64_t availableDataSpaceKB)
36 {
37  subapps_[name].name = name;
38  if(status !=
40  APP_STATUS_UNKNOWN) // if unknown, then do not consider it a status update
41  {
42  subapps_.at(name).lastStatusTime = time(0);
43  if(subapps_.at(name).status != status)
44  subapps_.at(name).lastStatusChangeTime = time(0);
45  }
46  subapps_.at(name).status = status;
47  subapps_.at(name).progress = progress;
48  subapps_.at(name).detail = detail;
49  SupervisorInfo::emplaceAvailableSpace(availableLogSpaceKB,
50  subapps_.at(name).availableLogSpaceKB_);
51  SupervisorInfo::emplaceAvailableSpace(availableDataSpaceKB,
52  subapps_.at(name).availableDataSpaceKB_);
53 } // end setSubappStatus()
54 
55 //=====================================================================================
56 void SupervisorInfo::copySubappStatus(const SubappInfo& info)
57 {
58  subapps_[info.name] = info;
59 } // end setSubappStatus()
60 
61 //=====================================================================================
62 std::string SupervisorInfo::extractHostname(const std::string& URL)
63 {
64  //__COUTV__(URL);
65  size_t i = URL.find("://");
66  if(i == std::string::npos)
67  i = 0;
68  else
69  i += 3;
70  //__COUTV__(i);
71  size_t j = URL.find(":", i);
72  if(j != std::string::npos)
73  j -= i;
74  //__COUTV__(j);
75  //__COUTV__(URL.substr(i,j));
76  return URL.substr(i, j);
77 } // end extractHostname
78 
79 //=====================================================================================
80 std::string SupervisorInfo::serializeSubappInfos(std::vector<SubappInfo> infos)
81 {
82  std::ostringstream ostr;
83  for(auto& info : infos)
84  {
85  ostr << info.name << "\n";
86  ostr << info.detail << "\n";
87  ostr << info.progress << "\n";
88  ostr << info.status << "\n";
89  ostr << info.lastStatusTime << "\n";
90  ostr << info.lastStatusChangeTime << "\n";
91  ostr << info.url << "\n";
92  ostr << info.class_name << "\n";
93  }
94  return ostr.str();
95 } //end serializeSubappInfos()
96 
97 //=====================================================================================
98 std::vector<SupervisorInfo::SubappInfo> SupervisorInfo::deserializeSubappInfos(
99  std::string info_string)
100 {
101  std::vector<SubappInfo> infos;
102  std::istringstream istr(info_string);
103  std::string line;
104  while(std::getline(istr, line))
105  {
106  SubappInfo thisInfo;
107  thisInfo.name = line;
108  std::getline(istr, line);
109  thisInfo.detail = line;
110  std::getline(istr, line);
111  std::istringstream converter(line);
112  converter >> thisInfo.progress;
113  std::getline(istr, line);
114  thisInfo.status = line;
115  std::getline(istr, line);
116  converter = std::istringstream(line);
117  converter >> thisInfo.lastStatusTime;
118  std::getline(istr, line);
119  converter = std::istringstream(line);
120  converter >> thisInfo.lastStatusChangeTime;
121  std::getline(istr, line);
122  thisInfo.url = line;
123  std::getline(istr, line);
124  thisInfo.class_name = line;
125  infos.push_back(thisInfo);
126  }
127 
128  return infos;
129 } //end deserializeSubappInfos()
130 
131 //=====================================================================================
134 void SupervisorInfo::emplaceAvailableSpace(
135  const int64_t availableSpaceKB,
136  std::deque<std::pair<time_t, int64_t>>& availableSpaceDeque)
137 {
138  if(availableSpaceKB > 0) //only insert valid values
139  {
140  __GEN_COUTVS__(40, availableSpaceKB);
141  time_t now = time(0);
142  //newer values at front
143  availableSpaceDeque.emplace_front(now, availableSpaceKB); // to position 0
144 
145  //keep closest to 3.75 without going over for next 2 values
146  if(availableSpaceDeque.size() > 2)
147  {
148  if(now - availableSpaceDeque.at(2).first > 225) //3.75 minutes
149  availableSpaceDeque.erase(availableSpaceDeque.begin() + 2);
150  else //erase newer value
151  availableSpaceDeque.erase(availableSpaceDeque.begin() + 1);
152 
153  // fill with values up to 10 to init the deque
154  while(availableSpaceDeque.size() < 10)
155  availableSpaceDeque.emplace_back(availableSpaceDeque.at(1));
156  }
157 
158  //now starting at position 2, keep 2 values per interval:
159  // the +1 is always best, if over interval by too much, then replace with newer value
160  // and take next best value from shorter interval
161  for(size_t i = 8; i > 0 && i + 1 < availableSpaceDeque.size(); i -= 2)
162  {
163  if(now - availableSpaceDeque.at(i + 1).first >
164  (1 << (i / 2)) * 225 + (1 << (i / 2)) * 225 / 2) //1.5x interval
165  {
166  //too old, so replace with newer value
167  availableSpaceDeque[i + 1] = availableSpaceDeque[i];
168  availableSpaceDeque[i] = availableSpaceDeque[i - 1];
169  }
170  if(availableSpaceDeque[i + 1].first == availableSpaceDeque[i].first &&
171  availableSpaceDeque[i].first != availableSpaceDeque[i - 1].first)
172  {
173  //same time, so shift up newer value
174  availableSpaceDeque[i] = availableSpaceDeque[i - 1];
175  }
176  } //end main loop
177 
178  if(TTEST(1))
179  {
180  __SS__ << "Available space deque: ";
181  size_t i = 0;
182  for(auto& val : availableSpaceDeque)
183  {
184  ss << i << ":(t=" << val.first << ", KBs=" << val.second
185  << ", dt=" << now - val.first << " < "
186  << ((1 << (i / 2)) * 225 + (1 << (i / 2)) * 225 / 2) << ", KBps="
187  << (val.second - availableSpaceKB) * 1.0f / (1 + now - val.first)
188  << ") ";
189  ++i;
190  }
191  __COUTS__(40) << mfSubject_ << " " << &availableSpaceDeque << " " << ss.str()
192  << __E__ << getLogUsageRateLastHourKBps() << " KB/s";
193  }
194  }
195 } //end emplaceAvailableSpace()
void setStatus(const std::string &status, const unsigned int progress, const std::string &detail="", const int64_t availableLogSpaceKB=0, const int64_t availableDataSpaceKB=0)
Setters ----------------—.
defines used also by OtsConfigurationWizardSupervisor