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