11 #include <sys/param.h>
12 #include <sys/mount.h>
14 #include <sys/statfs.h>
23 #include <boost/bind.hpp>
24 #include <boost/regex.hpp>
40 updateInterval_(updateInterval),
42 numberOfCopyWorkers_(-1),
43 numberOfInjectWorkers_(-1),
45 latchedSataBeastStatus_(-1)
64 pathName <<
"/" << std::setfill(
'0') << std::setw(2) <<
i;
79 if ( pathname.empty() )
return;
82 diskUsage->pathName = pathname;
90 for ( DiskWritingParams::OtherDiskPaths::const_iterator
106 rmParams_ = rmParams;
115 alarmParams_ = alarmParams;
136 for ( DiskUsagePtrList::const_iterator it =
diskUsageList_.begin(),
142 diskUsageStats->diskSize = (*it)->diskSize;
143 diskUsageStats->absDiskUsage = (*it)->absDiskUsage;
144 diskUsageStats->relDiskUsage = (*it)->relDiskUsage;
145 diskUsageStats->pathName = (*it)->pathName;
146 diskUsageStats->alarmState = (*it)->alarmState;
168 for ( DiskUsagePtrList::const_iterator it =
diskUsageList_.begin(),
173 (*it)->absDiskUsage = -1;
174 (*it)->relDiskUsage = -1;
182 infoSpaceItems.push_back(std::make_pair(
"copyWorkers", &
copyWorkers_));
183 infoSpaceItems.push_back(std::make_pair(
"injectWorkers", &
injectWorkers_));
184 infoSpaceItems.push_back(std::make_pair(
"sataBeastStatus", &
sataBeastStatus_));
185 infoSpaceItems.push_back(std::make_pair(
"numberOfDisks", &
numberOfDisks_));
186 infoSpaceItems.push_back(std::make_pair(
"diskPaths", &
diskPaths_));
187 infoSpaceItems.push_back(std::make_pair(
"totalDiskSpace", &
totalDiskSpace_));
188 infoSpaceItems.push_back(std::make_pair(
"usedDiskSpace", &
usedDiskSpace_));
211 const size_t infospaceCount =
diskPaths_.size();
213 if ( statsCount != infospaceCount )
220 for (
size_t i=0;
i < statsCount; ++
i)
250 int retVal = statfs(diskUsage->pathName.c_str(), &buf);
253 int retVal = statfs64(diskUsage->pathName.c_str(), &buf);
256 unsigned int blksize = buf.f_bsize;
257 diskUsage->diskSize =
258 static_cast<double>(buf.f_blocks * blksize) / 1024 / 1024 / 1024;
259 diskUsage->absDiskUsage =
260 diskUsage->diskSize -
261 static_cast<double>(buf.f_bavail * blksize) / 1024 / 1024 / 1024;
262 diskUsage->relDiskUsage = (100 * (diskUsage->absDiskUsage / diskUsage->diskSize));
276 diskUsage->diskSize = -1;
277 diskUsage->absDiskUsage = -1;
278 diskUsage->relDiskUsage = -1;
292 msg =
"Cannot access " + diskUsage->pathName +
". Is it mounted?";
297 msg =
"Failed to retrieve disk space information for " + diskUsage->pathName +
":"
301 XCEPT_DECLARE(stor::exception::DiskSpaceAlarm, ex, msg);
315 XCEPT_DECLARE(stor::exception::DiskSpaceAlarm, ex, diskUsage->toString());
316 alarmHandler_->raiseAlarm(diskUsage->pathName, diskUsage->alarmState, ex);
323 DiskWritingParams::OtherDiskPaths::const_iterator
begin =
325 DiskWritingParams::OtherDiskPaths::const_iterator
end =
327 if (
std::find(begin, end, diskUsage->pathName) != end )
return;
330 XCEPT_RAISE(stor::exception::DiskSpaceAlarm, diskUsage->toString());
364 const std::string alarmName =
"CopyWorkers";
368 std::ostringstream
msg;
370 " running CopyWorkers, but found " <<
372 XCEPT_DECLARE(stor::exception::CopyWorkers, ex, msg.str());
406 const std::string alarmName =
"InjectWorkers";
410 std::ostringstream
msg;
412 " running InjectWorkers, but found " <<
414 XCEPT_DECLARE(stor::exception::InjectWorkers, ex, msg.str());
430 SATABeasts::const_iterator it = sataBeasts.begin(),
431 itEnd= sataBeasts.end();
451 in.open(
"/proc/mounts" );
453 if ( ! in.is_open() )
return false;
456 while( getline(in,line) )
458 size_t pos = line.find(
"sata");
459 if ( pos != std::string::npos )
461 std::ostringstream
host;
463 << std::setw(2) << std::setfill(
'0')
464 << line.substr(pos+4,1)
466 << std::setw(2) << std::setfill(
'0')
467 << line.substr(pos+5,1);
468 sataBeasts.insert(host.str());
471 return !sataBeasts.empty();
479 XCEPT_DECLARE(stor::exception::SataBeast, ex,
480 "Failed to connect to SATA beast " + sataBeast);
490 const std::string& sataBeast,
491 const std::string& hostSuffix
498 if ( rmParams_.sataUser_.empty() )
return true;
502 "http://" + sataBeast + hostSuffix +
"/status.asp",rmParams_.sataUser_,
506 if (returnCode == CURLE_OK)
508 updateSataBeastStatus(sataBeast, std::string(&content[0]));
513 std::ostringstream
msg;
514 msg <<
"Failed to connect to SATA controller "
515 << sataBeast << hostSuffix
516 <<
" with user name '" << rmParams_.sataUser_
517 <<
"': " << std::string(&content[0]);
518 XCEPT_DECLARE(stor::exception::SataBeast, ex, msg.str());
528 const std::string& sataBeast,
529 const std::string& content
532 boost::regex failedEntry(
">([^<]* has failed[^<]*)");
533 boost::regex failedDisk(
"Hard disk([[:digit:]]+)");
534 boost::regex failedController(
"RAID controller ([[:digit:]]+)");
535 boost::match_results<std::string::const_iterator> matchedEntry, matchedCause;
536 boost::match_flag_type
flags = boost::match_default;
538 std::string::const_iterator start = content.begin();
539 std::string::const_iterator
end = content.end();
541 unsigned int newSataBeastStatus = 0;
543 while( regex_search(start, end, matchedEntry, failedEntry, flags) )
545 std::string errorMsg = matchedEntry[1];
546 XCEPT_DECLARE(stor::exception::SataBeast, ex, sataBeast+
": "+errorMsg);
550 if ( regex_search(errorMsg, matchedCause, failedDisk) )
553 ++newSataBeastStatus;
555 else if ( regex_search(errorMsg, matchedCause, failedController) )
558 newSataBeastStatus += 100;
563 newSataBeastStatus += 1000;
567 start = matchedEntry[0].second;
569 flags |= boost::match_prev_avail;
570 flags |= boost::match_not_bob;
573 latchedSataBeastStatus_ = newSataBeastStatus;
575 if (latchedSataBeastStatus_ == 0)
576 alarmHandler_->revokeAlarm(sataBeast);
584 return !fnmatch(
"[1-9]*", dir->d_name, 0);
587 bool matchUid(
const std::string&
filename,
const uid_t& uid)
589 struct stat filestat;
590 int result = stat(filename.c_str(), &filestat);
591 return (result == 0 && filestat.st_uid == uid);
594 bool isMaster(
const char*
pid)
600 std::ostringstream statfile;
601 statfile <<
"/proc/" << pid <<
"/stat";
602 snprintf(buf, 32, statfile.str().c_str(),
pid);
603 if ( (fd = open(buf, O_RDONLY, 0) ) == -1 )
return false;
604 int num =
read(fd, buf,
sizeof buf - 1);
605 if(num<80)
return false;
607 char*
tmp = strrchr(buf,
')');
608 num = sscanf(tmp + 4,
611 return ( num == 1 && ppid == 1 );
614 bool grep(
const std::string& cmdline,
const std::string&
name)
618 in.open( cmdline.c_str() );
624 while( getline(in,tmp,
'\0') )
632 return ( line.find(name) != std::string::npos );
639 const std::string& processName,
644 struct dirent **namelist;
650 n = scandir(
"/proc", &namelist,
filter, 0);
652 if (n < 0)
return -1;
656 std::ostringstream cmdline;
657 cmdline <<
"/proc/" << namelist[
n]->d_name <<
"/cmdline";
659 if ( grep(cmdline.str(), processName) &&
660 (uid < 0 || matchUid(cmdline.str(), uid)) &&
661 isMaster(namelist[n]->d_name) )
675 std::ostringstream
msg;
676 msg << std::fixed << std::setprecision(1) <<
677 "Disk space usage for " <<
pathName <<
virtual void do_updateInfoSpaceItems()
ResourceMonitorParams rmParams_
int numberOfInjectWorkers_
void calcNumberOfInjectWorkers()
void checkNumberOfInjectWorkers()
boost::mutex diskUsageListMutex_
void calcNumberOfCopyWorkers()
void emitDiskSpaceAlarm(DiskUsagePtr)
ResourceMonitorCollection(const utils::Duration_t &updateInterval, AlarmHandlerPtr)
xdata::UnsignedInteger32 numberOfDisks_
std::vector< Variable::Flags > flags
OtherDiskPaths otherDiskPaths_
void getDiskStats(Stats &) const
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
int latchedSataBeastStatus_
boost::shared_ptr< DiskUsage > DiskUsagePtr
int numberOfInjectWorkers
const std::string * pathName() const
xdata::UnsignedInteger32 copyWorkers_
boost::posix_time::time_duration Duration_t
xdata::Integer32 sataBeastStatus_
const T & max(const T &a, const T &b)
DiskWritingParams dwParams_
xdata::Vector< xdata::UnsignedInteger32 > usedDiskSpace_
DiskUsageStatsPtrList diskUsageStatsList
void configureDisks(DiskWritingParams const &)
xdata::UnsignedInteger32 injectWorkers_
void getStats(Stats &) const
void retrieveDiskSize(DiskUsagePtr)
std::set< std::string > SATABeasts
bool checkSataDisks(const std::string &sataBeast, const std::string &hostSuffix)
WorkerParams copyWorkers_
xdata::Vector< xdata::UnsignedInteger32 > totalDiskSpace_
CURLcode getContent(const std::string &url, const std::string &user, Content &content)
double failHighWaterMark_
boost::shared_ptr< AlarmHandler > AlarmHandlerPtr
void configureAlarms(AlarmParams const &)
void failIfImportantDisk(DiskUsagePtr)
virtual void do_appendInfoSpaceItems(InfoSpaceItems &)
void checkSataBeast(const std::string &sataBeast)
xdata::Vector< xdata::String > diskPaths_
tuple filter
USE THIS FOR SKIMMED TRACKS process.p = cms.Path(process.hltLevel1GTSeed*process.skimming*process.offlineBeamSpot*process.TrackRefitter2) OTHERWISE USE THIS.
bool getSataBeasts(SATABeasts &sataBeasts)
boost::shared_ptr< DiskUsageStats > DiskUsageStatsPtr
std::vector< std::pair< std::string, xdata::Serializable * > > InfoSpaceItems
unsigned int nLogicalDisks_
WorkerParams injectWorkers_
void revokeDiskAlarm(DiskUsagePtr)
std::vector< std::vector< double > > tmp
void updateSataBeastStatus(const std::string &sataBeast, const std::string &content)
void emitDiskAlarm(DiskUsagePtr, error_t)
void configureResources(ResourceMonitorParams const &)
AlarmHandlerPtr alarmHandler_
void checkNumberOfCopyWorkers()
int getProcessCount(const std::string &processName, const int &uid=-1)
void addDisk(const std::string &)
virtual void do_calculateStatistics()
std::vector< char > Content
DiskUsagePtrList diskUsageList_