17 #include <boost/bind.hpp>
18 #include <boost/regex.hpp>
35 updateInterval_(updateInterval),
37 numberOfCopyWorkers_(-1),
38 numberOfInjectWorkers_(-1),
40 latchedSataBeastStatus_(-1)
59 pathName <<
"/" << std::setfill(
'0') << std::setw(2) <<
i;
74 if ( pathname.empty() )
return;
84 for ( DiskWritingParams::OtherDiskPaths::const_iterator
100 rmParams_ = rmParams;
109 alarmParams_ = alarmParams;
130 for ( DiskUsagePtrList::const_iterator it =
diskUsageList_.begin(),
136 diskUsageStats->diskSize = (*it)->diskSize_;
137 diskUsageStats->absDiskUsage = (*it)->absDiskUsage_;
138 diskUsageStats->relDiskUsage = (*it)->relDiskUsage_;
139 diskUsageStats->pathName = (*it)->pathName_;
140 diskUsageStats->alarmState = (*it)->alarmState_;
162 for ( DiskUsagePtrList::const_iterator it =
diskUsageList_.begin(),
167 if ( ! (*it)->retrievingDiskSize_ )
169 (*it)->diskSize_ = -1;
170 (*it)->absDiskUsage_ = -1;
171 (*it)->relDiskUsage_ = -1;
181 infoSpaceItems.push_back(std::make_pair(
"copyWorkers", &
copyWorkers_));
182 infoSpaceItems.push_back(std::make_pair(
"injectWorkers", &
injectWorkers_));
183 infoSpaceItems.push_back(std::make_pair(
"sataBeastStatus", &
sataBeastStatus_));
184 infoSpaceItems.push_back(std::make_pair(
"numberOfDisks", &
numberOfDisks_));
185 infoSpaceItems.push_back(std::make_pair(
"diskPaths", &
diskPaths_));
186 infoSpaceItems.push_back(std::make_pair(
"totalDiskSpace", &
totalDiskSpace_));
187 infoSpaceItems.push_back(std::make_pair(
"usedDiskSpace", &
usedDiskSpace_));
217 for (DiskUsageStatsPtrList::const_iterator
224 static_cast<xdata::String>( (*it)->pathName )
227 static_cast<xdata::UnsignedInteger32>(
228 static_cast<unsigned int>( (*it)->diskSize * 1024 )
232 static_cast<xdata::UnsignedInteger32>(
233 static_cast<unsigned int>( (*it)->absDiskUsage * 1024 )
258 if ( ! diskUsage->retrievingDiskSize_ )
261 boost::thread thread(
265 ( ! thread.timed_join( boost::posix_time::milliseconds(500) ) )
266 || (diskUsage->retVal_ != 0)
273 const unsigned int blksize = diskUsage->statfs_.f_bsize;
274 diskUsage->diskSize_ =
275 static_cast<double>(diskUsage->statfs_.f_blocks * blksize) / 1024 / 1024 / 1024;
276 diskUsage->absDiskUsage_ =
277 diskUsage->diskSize_ -
278 static_cast<double>(diskUsage->statfs_.f_bavail * blksize) / 1024 / 1024 / 1024;
279 diskUsage->relDiskUsage_ = (100 * (diskUsage->absDiskUsage_ / diskUsage->diskSize_));
296 diskUsage->retrievingDiskSize_ =
true;
299 diskUsage->retVal_ = statfs(diskUsage->pathName_.c_str(), &(diskUsage->statfs_));
301 diskUsage->retVal_ = statfs64(diskUsage->pathName_.c_str(), &(diskUsage->statfs_));
303 if (diskUsage->pathName_ ==
"/aSlowDiskForUnitTests")
::sleep(5);
305 diskUsage->retrievingDiskSize_ =
false;
311 const std::string msg =
"Cannot access " + diskUsage->pathName_ +
". Is it mounted?";
313 diskUsage->diskSize_ = -1;
314 diskUsage->absDiskUsage_ = -1;
315 diskUsage->relDiskUsage_ = -1;
320 XCEPT_DECLARE(stor::exception::DiskSpaceAlarm, ex, msg);
326 XCEPT_DECLARE(stor::exception::DiskSpaceAlarm, ex, msg);
327 alarmHandler_->raiseAlarm(diskUsage->pathName_, diskUsage->alarmState_, ex);
340 XCEPT_DECLARE(stor::exception::DiskSpaceAlarm, ex, diskUsage->toString());
346 XCEPT_DECLARE(stor::exception::DiskSpaceAlarm, ex, diskUsage->toString());
347 alarmHandler_->raiseAlarm(diskUsage->pathName_, diskUsage->alarmState_, ex);
354 DiskWritingParams::OtherDiskPaths::const_iterator
begin =
356 DiskWritingParams::OtherDiskPaths::const_iterator
end =
358 return (
std::find(begin, end, pathName) == end );
396 std::ostringstream
msg;
398 " running CopyWorkers, but found " <<
400 XCEPT_DECLARE(stor::exception::CopyWorkers, ex, msg.str());
438 std::ostringstream
msg;
440 " running InjectWorkers, but found " <<
442 XCEPT_DECLARE(stor::exception::InjectWorkers, ex, msg.str());
458 SATABeasts::const_iterator it = sataBeasts.begin(),
459 itEnd= sataBeasts.end();
479 in.open(
"/proc/mounts" );
481 if ( ! in.is_open() )
return false;
484 while( getline(in,line) )
486 size_t pos = line.find(
"sata");
487 if ( pos != std::string::npos )
489 std::ostringstream
host;
491 << std::setw(2) << std::setfill(
'0')
492 << line.substr(pos+4,1)
494 << std::setw(2) << std::setfill(
'0')
495 << line.substr(pos+5,1);
496 sataBeasts.insert(host.str());
499 return !sataBeasts.empty();
507 XCEPT_DECLARE(stor::exception::SataBeast, ex,
508 "Failed to connect to SATA beast " + sataBeast);
526 if ( rmParams_.sataUser_.empty() )
return true;
529 curlInterface->getContent(
530 "http://" + sataBeast + hostSuffix +
"/status.asp",rmParams_.sataUser_,
534 if (returnCode == CURLE_OK)
536 updateSataBeastStatus(sataBeast,
std::string(&content[0]));
541 std::ostringstream
msg;
542 msg <<
"Failed to connect to SATA controller "
543 << sataBeast << hostSuffix
545 XCEPT_DECLARE(stor::exception::SataBeast, ex, msg.str());
559 boost::regex failedEntry(
">([^<]* has failed[^<]*)");
560 boost::regex failedDisk(
"Hard disk([[:digit:]]+)");
561 boost::regex failedController(
"RAID controller ([[:digit:]]+)");
562 boost::match_results<std::string::const_iterator> matchedEntry, matchedCause;
563 boost::match_flag_type
flags = boost::match_default;
565 std::string::const_iterator
start = content.begin();
566 std::string::const_iterator
end = content.end();
568 unsigned int newSataBeastStatus = 0;
570 while( regex_search(start, end, matchedEntry, failedEntry, flags) )
573 XCEPT_DECLARE(stor::exception::SataBeast, ex, sataBeast+
": "+errorMsg);
577 if ( regex_search(errorMsg, matchedCause, failedDisk) )
580 ++newSataBeastStatus;
582 else if ( regex_search(errorMsg, matchedCause, failedController) )
585 newSataBeastStatus += 100;
590 newSataBeastStatus += 1000;
594 start = matchedEntry[0].second;
596 flags |= boost::match_prev_avail;
597 flags |= boost::match_not_bob;
600 latchedSataBeastStatus_ = newSataBeastStatus;
602 if (latchedSataBeastStatus_ == 0)
603 alarmHandler_->revokeAlarm(sataBeast);
611 return !fnmatch(
"[1-9]*", dir->d_name, 0);
616 struct stat filestat;
617 int result = stat(filename.c_str(), &filestat);
618 return (result == 0 && filestat.st_uid == uid);
621 bool isMaster(
const char*
pid)
627 std::ostringstream statfile;
628 statfile <<
"/proc/" << pid <<
"/stat";
629 snprintf(buf, 32, statfile.str().c_str(),
pid);
630 if ( (fd = open(buf, O_RDONLY, 0) ) == -1 )
return false;
631 int num =
read(fd, buf,
sizeof buf - 1);
632 if(num<80)
return false;
634 char*
tmp = strrchr(buf,
')');
635 num = sscanf(tmp + 4,
638 return ( num == 1 && ppid == 1 );
645 in.open( cmdline.c_str() );
651 while( getline(in,tmp,
'\0') )
659 return ( line.find(name) != std::string::npos );
671 struct dirent **namelist;
677 n = scandir(
"/proc", &namelist,
filter, 0);
679 if (n < 0)
return -1;
683 std::ostringstream cmdline;
684 cmdline <<
"/proc/" << namelist[
n]->d_name <<
"/cmdline";
686 if ( grep(cmdline.str(), processName) &&
687 (uid < 0 || matchUid(cmdline.str(), uid)) &&
688 isMaster(namelist[n]->d_name) )
701 : pathName_(path), absDiskUsage_(-1), relDiskUsage_(-1), diskSize_(-1),
708 std::ostringstream
msg;
709 msg << std::fixed << std::setprecision(1) <<
710 "Disk space usage for " << pathName_ <<
711 " is " << relDiskUsage_ <<
"% (" <<
712 absDiskUsage_ <<
"GB of " <<
virtual void do_updateInfoSpaceItems()
ResourceMonitorParams rmParams_
int numberOfInjectWorkers_
void calcNumberOfInjectWorkers()
void checkNumberOfInjectWorkers()
boost::mutex diskUsageListMutex_
tuple start
Check for commandline option errors.
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
xdata::UnsignedInteger32 copyWorkers_
boost::posix_time::time_duration Duration_t
bool isImportantDisk(const std::string &)
xdata::Integer32 sataBeastStatus_
static boost::shared_ptr< CurlInterface > getInterface()
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 doStatFs(DiskUsagePtr)
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_
double failHighWaterMark_
boost::shared_ptr< AlarmHandler > AlarmHandlerPtr
void configureAlarms(AlarmParams const &)
boost::shared_ptr< CurlInterface > CurlInterfacePtr
virtual void do_appendInfoSpaceItems(InfoSpaceItems &)
void checkSataBeast(const std::string &sataBeast)
xdata::Vector< xdata::String > diskPaths_
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 configureResources(ResourceMonitorParams const &)
void emitDiskAlarm(DiskUsagePtr)
DiskUsage(const std::string &pathName)
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_