1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-08-08 14:22:09 +03:00
This commit is contained in:
david hill
2017-08-30 14:04:29 -05:00
parent ce6317995c
commit b492371534
2 changed files with 85 additions and 49 deletions

View File

@@ -2523,6 +2523,9 @@ namespace oam
string Section = "AlarmConfig"; string Section = "AlarmConfig";
int returnValue; int returnValue;
struct flock fl;
int fd;
// validate Alarm ID // validate Alarm ID
if( alarmid > MAX_ALARM_ID ) if( alarmid > MAX_ALARM_ID )
@@ -2544,11 +2547,24 @@ namespace oam
string fileName = AlarmConfigFile; string fileName = AlarmConfigFile;
int fd = open(fileName.c_str(), O_RDWR|O_CREAT, 0644); memset(&fl, 0, sizeof(fl));
fl.l_type = F_RDLCK; // read lock
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0; //lock whole file
// Aquire an exclusive lock // open config file
if (flock(fd,LOCK_EX) == -1) { if ((fd = open(fileName.c_str(), O_RDWR)) >= 0)
throw runtime_error ("Lock file error: " + fileName); { // lock file
if (fcntl(fd, F_SETLKW, &fl) != 0)
{
ostringstream oss;
oss << "Oam::setAlarmConfig: error locking file " <<
fileName <<
": " <<
strerror(errno) <<
", proceding anyway.";
cerr << oss.str() << endl;
} }
// write parameter to disk // write parameter to disk
@@ -2561,24 +2577,25 @@ namespace oam
alaConfig->write(); alaConfig->write();
} }
catch(...) catch(...)
{ {}
// Release lock
if (flock(fd,LOCK_UN)==-1)
{
throw runtime_error ("Release lock file error: " + fileName);
}
exceptionControl("setAlarmConfig", API_FAILURE); fl.l_type = F_UNLCK; //unlock
} fcntl(fd, F_SETLK, &fl);
// Release lock
if (flock(fd,LOCK_UN)==-1)
{
throw runtime_error ("Release lock file error: " + fileName);
}
close(fd); close(fd);
} }
else
{
ostringstream oss;
oss << "Oam::setAlarmConfig: error opening file " <<
fileName <<
": " <<
strerror(errno);
throw runtime_error(oss.str());
}
return;
}
/******************************************************************** /********************************************************************
* *

View File

@@ -2902,6 +2902,9 @@ int ProcessMonitor::updateLog(std::string action, std::string level)
MonitorLog log; MonitorLog log;
Oam oam; Oam oam;
struct flock fl;
int fd;
string fileName; string fileName;
oam.getSystemConfig("SystemLogConfigFile", fileName); oam.getSystemConfig("SystemLogConfigFile", fileName);
if (fileName == oam::UnassignedName ) { if (fileName == oam::UnassignedName ) {
@@ -3137,34 +3140,50 @@ int ProcessMonitor::updateLog(std::string action, std::string level)
// //
if (restart) { if (restart) {
unlink (fileName.c_str()); unlink (fileName.c_str());
ofstream newFile (fileName.c_str()); ofstream newFile (fileName.c_str());
// create new file memset(&fl, 0, sizeof(fl));
int fd = open(fileName.c_str(),O_RDWR|O_CREAT, 0644); fl.l_type = F_RDLCK; // read lock
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0; //lock whole file
// Aquire an exclusive lock // create new file
if (flock(fd,LOCK_EX) == -1) { if ((fd = open(fileName.c_str(), O_RDWR|O_CREAT, 0644)) >= 0)
log.writeLog(__LINE__, "ERROR: file lock failure on " + fileName, LOG_TYPE_ERROR ); { // lock file
close(fd);
return -1; if (fcntl(fd, F_SETLKW, &fl) != 0)
{
ostringstream oss;
oss << "ProcessMonitor::updateLog: error locking file " <<
fileName <<
": " <<
strerror(errno) <<
", proceding anyway.";
cerr << oss.str() << endl;
} }
copy(lines.begin(), lines.end(), ostream_iterator<string>(newFile, "\n")); copy(lines.begin(), lines.end(), ostream_iterator<string>(newFile, "\n"));
newFile.close(); newFile.close();
// Release lock fl.l_type = F_UNLCK; //unlock
if (flock(fd,LOCK_UN) == -1) fcntl(fd, F_SETLK, &fl);
{
log.writeLog(__LINE__, "ERROR: file unlock failure on " + fileName, LOG_TYPE_ERROR );
close(fd);
return -1;
}
close(fd); close(fd);
oam.syslogAction("restart"); oam.syslogAction("restart");
} }
else
{
ostringstream oss;
oss << "ProcessMonitor::updateLog: error opening file " <<
fileName <<
": " <<
strerror(errno);
throw runtime_error(oss.str());
}
}
//update file priviledges //update file priviledges
changeModLog(); changeModLog();