1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-08-08 14:22:09 +03:00
Files
mariadb-columnstore-engine/oam/oamcpp/liboamcpp.cpp
Serguey Zefirov 5aa2a824c2 feat(MCOL-6082): Multiple readers of dbroots using OamCache logic
This patch introduces centralized logic of selecting what dbroot is
accessible in PrimProc on what node. The logic is in OamCache for time
being and can be moved later.
2025-07-21 14:32:39 +03:00

1057 lines
30 KiB
C++

/* Copyright (C) 2014 InfiniDB, Inc.
Copyright (C) 2016 MariaDB Corporation
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2 of
the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
/******************************************************************************************
******************************************************************************************/
/**
* @file
*/
#include <unistd.h>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>
#include <boost/tokenizer.hpp>
#include <boost/algorithm/string.hpp>
#include <sys/statfs.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <stdexcept>
#include <csignal>
#include <sstream>
#include "columnstoreversion.h"
#include "ddlpkg.h"
#include "../../dbcon/dmlpackage/dmlpkg.h"
#define LIBOAM_DLLEXPORT
#include "liboamcpp.h"
#undef LIBOAM_DLLEXPORT
#include "mcsconfig.h"
#include "installdir.h"
#include "dbrm.h"
#include "sessionmanager.h"
#include "IDBPolicy.h"
#include "IDBDataFile.h"
#include "vlarray.h"
#if defined(__GNUC__)
#include <string>
static const std::string optim(
"Build is "
#if !defined(__OPTIMIZE__)
"NOT "
#endif
"optimized");
#endif
namespace fs = boost::filesystem;
using namespace config;
using namespace std;
using namespace messageqcpp;
using namespace oam;
using namespace logging;
using namespace BRM;
namespace oam
{
// flag to tell us ctrl-c was hit
uint32_t ctrlc = 0;
//------------------------------------------------------------------------------
// Signal handler to catch Control-C signal to terminate the process
// while waiting for a shutdown or suspend action
//------------------------------------------------------------------------------
void handleControlC(int /*i*/)
{
std::cout << "Received Control-C to terminate the command..." << std::endl;
ctrlc = 1;
}
Oam::Oam()
{
CalpontConfigFile = std::string(MCSSYSCONFDIR) + "/columnstore/Columnstore.xml";
// get user
string USER = "root";
char* p = getenv("USER");
if (p && *p)
USER = p;
userDir = USER;
if (USER != "root")
{
userDir = "home/" + USER;
}
tmpdir = startup::StartUp::tmpDir();
}
Oam::~Oam()
{
}
/********************************************************************
*
* get System Module Type Configuration Information
*
********************************************************************/
void Oam::getSystemConfig(SystemModuleTypeConfig& systemmoduletypeconfig)
{
const string Section = "SystemModuleConfig";
const string MODULE_TYPE = "ModuleType";
systemmoduletypeconfig.moduletypeconfig.clear();
Config* sysConfig = Config::makeConfig(CalpontConfigFile.c_str());
for (int moduleTypeID = 1; moduleTypeID < MAX_MODULE_TYPE + 1; moduleTypeID++)
{
ModuleTypeConfig moduletypeconfig;
// get Module info
string moduleType = MODULE_TYPE + itoa(moduleTypeID);
Oam::getSystemConfig(sysConfig->getConfig(Section, moduleType), moduletypeconfig);
if (moduletypeconfig.ModuleType.empty())
continue;
systemmoduletypeconfig.moduletypeconfig.push_back(moduletypeconfig);
}
}
/********************************************************************
*
* get System Module Configuration Information by Module Type
*
********************************************************************/
void Oam::getSystemConfig(const std::string& moduletype, ModuleTypeConfig& moduletypeconfig)
{
Config* sysConfig = Config::makeConfig(CalpontConfigFile.c_str());
const string Section = "SystemModuleConfig";
const string MODULE_TYPE = "ModuleType";
const string MODULE_DESC = "ModuleDesc";
const string MODULE_COUNT = "ModuleCount";
const string MODULE_DISABLE_STATE = "ModuleDisableState";
const string MODULE_CPU_CRITICAL = "ModuleCPUCriticalThreshold";
const string MODULE_CPU_MAJOR = "ModuleCPUMajorThreshold";
const string MODULE_CPU_MINOR = "ModuleCPUMinorThreshold";
const string MODULE_CPU_MINOR_CLEAR = "ModuleCPUMinorClearThreshold";
const string MODULE_DISK_CRITICAL = "ModuleDiskCriticalThreshold";
const string MODULE_DISK_MAJOR = "ModuleDiskMajorThreshold";
const string MODULE_DISK_MINOR = "ModuleDiskMinorThreshold";
const string MODULE_MEM_CRITICAL = "ModuleMemCriticalThreshold";
const string MODULE_MEM_MAJOR = "ModuleMemMajorThreshold";
const string MODULE_MEM_MINOR = "ModuleMemMinorThreshold";
const string MODULE_SWAP_CRITICAL = "ModuleSwapCriticalThreshold";
const string MODULE_SWAP_MAJOR = "ModuleSwapMajorThreshold";
const string MODULE_SWAP_MINOR = "ModuleSwapMinorThreshold";
const string MODULE_IP_ADDR = "ModuleIPAddr";
const string MODULE_SERVER_NAME = "ModuleHostName";
const string MODULE_DISK_MONITOR_FS = "ModuleDiskMonitorFileSystem";
const string MODULE_DBROOT_COUNT = "ModuleDBRootCount";
const string MODULE_DBROOT_ID = "ModuleDBRootID";
for (int moduleTypeID = 1; moduleTypeID < MAX_MODULE_TYPE + 1; moduleTypeID++)
{
string moduleType = MODULE_TYPE + itoa(moduleTypeID);
if (sysConfig->getConfig(Section, moduleType) == moduletype)
{
string ModuleCount = MODULE_COUNT + itoa(moduleTypeID);
string ModuleType = MODULE_TYPE + itoa(moduleTypeID);
string ModuleDesc = MODULE_DESC + itoa(moduleTypeID);
string ModuleCPUCriticalThreshold = MODULE_CPU_CRITICAL + itoa(moduleTypeID);
string ModuleCPUMajorThreshold = MODULE_CPU_MAJOR + itoa(moduleTypeID);
string ModuleCPUMinorThreshold = MODULE_CPU_MINOR + itoa(moduleTypeID);
string ModuleCPUMinorClearThreshold = MODULE_CPU_MINOR_CLEAR + itoa(moduleTypeID);
string ModuleDiskCriticalThreshold = MODULE_DISK_CRITICAL + itoa(moduleTypeID);
string ModuleDiskMajorThreshold = MODULE_DISK_MAJOR + itoa(moduleTypeID);
string ModuleDiskMinorThreshold = MODULE_DISK_MINOR + itoa(moduleTypeID);
string ModuleMemCriticalThreshold = MODULE_MEM_CRITICAL + itoa(moduleTypeID);
string ModuleMemMajorThreshold = MODULE_MEM_MAJOR + itoa(moduleTypeID);
string ModuleMemMinorThreshold = MODULE_MEM_MINOR + itoa(moduleTypeID);
string ModuleSwapCriticalThreshold = MODULE_SWAP_CRITICAL + itoa(moduleTypeID);
string ModuleSwapMajorThreshold = MODULE_SWAP_MAJOR + itoa(moduleTypeID);
string ModuleSwapMinorThreshold = MODULE_SWAP_MINOR + itoa(moduleTypeID);
moduletypeconfig.ModuleCount = strtol(sysConfig->getConfig(Section, ModuleCount).c_str(), 0, 0);
moduletypeconfig.ModuleType = sysConfig->getConfig(Section, ModuleType);
moduletypeconfig.ModuleDesc = sysConfig->getConfig(Section, ModuleDesc);
moduletypeconfig.ModuleCPUCriticalThreshold =
strtol(sysConfig->getConfig(Section, ModuleCPUCriticalThreshold).c_str(), 0, 0);
moduletypeconfig.ModuleCPUMajorThreshold =
strtol(sysConfig->getConfig(Section, ModuleCPUMajorThreshold).c_str(), 0, 0);
moduletypeconfig.ModuleCPUMinorThreshold =
strtol(sysConfig->getConfig(Section, ModuleCPUMinorThreshold).c_str(), 0, 0);
moduletypeconfig.ModuleCPUMinorClearThreshold =
strtol(sysConfig->getConfig(Section, ModuleCPUMinorClearThreshold).c_str(), 0, 0);
moduletypeconfig.ModuleDiskCriticalThreshold =
strtol(sysConfig->getConfig(Section, ModuleDiskCriticalThreshold).c_str(), 0, 0);
moduletypeconfig.ModuleDiskMajorThreshold =
strtol(sysConfig->getConfig(Section, ModuleDiskMajorThreshold).c_str(), 0, 0);
moduletypeconfig.ModuleDiskMinorThreshold =
strtol(sysConfig->getConfig(Section, ModuleDiskMinorThreshold).c_str(), 0, 0);
moduletypeconfig.ModuleMemCriticalThreshold =
strtol(sysConfig->getConfig(Section, ModuleMemCriticalThreshold).c_str(), 0, 0);
moduletypeconfig.ModuleMemMajorThreshold =
strtol(sysConfig->getConfig(Section, ModuleMemMajorThreshold).c_str(), 0, 0);
moduletypeconfig.ModuleMemMinorThreshold =
strtol(sysConfig->getConfig(Section, ModuleMemMinorThreshold).c_str(), 0, 0);
moduletypeconfig.ModuleSwapCriticalThreshold =
strtol(sysConfig->getConfig(Section, ModuleSwapCriticalThreshold).c_str(), 0, 0);
moduletypeconfig.ModuleSwapMajorThreshold =
strtol(sysConfig->getConfig(Section, ModuleSwapMajorThreshold).c_str(), 0, 0);
moduletypeconfig.ModuleSwapMinorThreshold =
strtol(sysConfig->getConfig(Section, ModuleSwapMinorThreshold).c_str(), 0, 0);
int moduleFound = 0;
// get NIC IP address/hostnames
for (int moduleID = 1; moduleID <= moduletypeconfig.ModuleCount; moduleID++)
{
DeviceNetworkConfig devicenetworkconfig;
HostConfig hostconfig;
for (int nicID = 1; nicID < MAX_NIC + 1; nicID++)
{
string ModuleIpAddr =
MODULE_IP_ADDR + itoa(moduleID) + "-" + itoa(nicID) + "-" + itoa(moduleTypeID);
string ipAddr = sysConfig->getConfig(Section, ModuleIpAddr);
if (ipAddr.empty())
break;
else if (ipAddr == UnassignedIpAddr)
continue;
string ModuleHostName =
MODULE_SERVER_NAME + itoa(moduleID) + "-" + itoa(nicID) + "-" + itoa(moduleTypeID);
string serverName = sysConfig->getConfig(Section, ModuleHostName);
hostconfig.IPAddr = ipAddr;
hostconfig.HostName = serverName;
hostconfig.NicID = nicID;
devicenetworkconfig.hostConfigList.push_back(hostconfig);
}
if (!devicenetworkconfig.hostConfigList.empty())
{
string ModuleDisableState = MODULE_DISABLE_STATE + itoa(moduleID) + "-" + itoa(moduleTypeID);
devicenetworkconfig.DisableState = sysConfig->getConfig(Section, ModuleDisableState);
devicenetworkconfig.DeviceName = moduletypeconfig.ModuleType + itoa(moduleID);
moduletypeconfig.ModuleNetworkList.push_back(devicenetworkconfig);
devicenetworkconfig.hostConfigList.clear();
moduleFound++;
if (moduleFound >= moduletypeconfig.ModuleCount)
break;
}
}
// get filesystems
DiskMonitorFileSystems fs;
for (int fsID = 1;; fsID++)
{
string ModuleDiskMonitorFS = MODULE_DISK_MONITOR_FS + itoa(fsID) + "-" + itoa(moduleTypeID);
string fsName = sysConfig->getConfig(Section, ModuleDiskMonitorFS);
if (fsName.empty())
break;
fs.push_back(fsName);
}
moduletypeconfig.FileSystems = fs;
// get dbroot IDs
moduleFound = 0;
for (int moduleID = 1; moduleID <= moduletypeconfig.ModuleCount; moduleID++)
{
string ModuleDBRootCount = MODULE_DBROOT_COUNT + itoa(moduleID) + "-" + itoa(moduleTypeID);
string temp = sysConfig->getConfig(Section, ModuleDBRootCount).c_str();
if (temp.empty() || temp == oam::UnassignedName)
continue;
int moduledbrootcount = strtol(temp.c_str(), 0, 0);
DeviceDBRootConfig devicedbrootconfig;
DBRootConfigList dbrootconfiglist;
if (moduledbrootcount < 1)
{
dbrootconfiglist.clear();
}
else
{
int foundIDs = 0;
for (int dbrootID = 1; dbrootID < moduledbrootcount + 1; dbrootID++)
{
string DBRootID =
MODULE_DBROOT_ID + itoa(moduleID) + "-" + itoa(dbrootID) + "-" + itoa(moduleTypeID);
string dbrootid = sysConfig->getConfig(Section, DBRootID);
if (dbrootid.empty() || dbrootid == oam::UnassignedName || dbrootid == "0")
continue;
dbrootconfiglist.push_back(atoi(dbrootid.c_str()));
foundIDs++;
if (moduledbrootcount == foundIDs)
break;
}
}
sort(dbrootconfiglist.begin(), dbrootconfiglist.end());
devicedbrootconfig.DeviceID = moduleID;
devicedbrootconfig.dbrootConfigList = dbrootconfiglist;
moduletypeconfig.ModuleDBRootList.push_back(devicedbrootconfig);
devicedbrootconfig.dbrootConfigList.clear();
moduleFound++;
if (moduleFound >= moduletypeconfig.ModuleCount)
break;
}
return;
}
}
// Module Not found
exceptionControl("getSystemConfig", API_INVALID_PARAMETER);
}
/********************************************************************
*
* get System Module Configuration Information by Module Name
*
********************************************************************/
void Oam::getSystemConfig(const std::string& module, ModuleConfig& moduleconfig)
{
Config* sysConfig = Config::makeConfig(CalpontConfigFile.c_str());
const string Section = "SystemModuleConfig";
const string MODULE_TYPE = "ModuleType";
const string MODULE_DESC = "ModuleDesc";
const string MODULE_COUNT = "ModuleCount";
const string MODULE_IP_ADDR = "ModuleIPAddr";
const string MODULE_SERVER_NAME = "ModuleHostName";
const string MODULE_DISABLE_STATE = "ModuleDisableState";
const string MODULE_DBROOT_COUNT = "ModuleDBRootCount";
const string MODULE_DBROOT_ID = "ModuleDBRootID";
string moduletype = module.substr(0, MAX_MODULE_TYPE_SIZE);
int moduleID = atoi(module.substr(MAX_MODULE_TYPE_SIZE, MAX_MODULE_ID_SIZE).c_str());
if (moduleID < 1)
// invalid ID
exceptionControl("getSystemConfig", API_INVALID_PARAMETER);
for (int moduleTypeID = 1; moduleTypeID < MAX_MODULE_TYPE + 1; moduleTypeID++)
{
string moduleType = MODULE_TYPE + itoa(moduleTypeID);
string ModuleCount = MODULE_COUNT + itoa(moduleTypeID);
if (sysConfig->getConfig(Section, moduleType) == moduletype)
{
string ModuleType = MODULE_TYPE + itoa(moduleTypeID);
string ModuleDesc = MODULE_DESC + itoa(moduleTypeID);
string ModuleDisableState = MODULE_DISABLE_STATE + itoa(moduleID) + "-" + itoa(moduleTypeID);
moduleconfig.ModuleName = module;
moduleconfig.ModuleType = sysConfig->getConfig(Section, ModuleType);
moduleconfig.ModuleDesc = sysConfig->getConfig(Section, ModuleDesc) + " #" + itoa(moduleID);
moduleconfig.DisableState = sysConfig->getConfig(Section, ModuleDisableState);
string ModuleDBRootCount = MODULE_DBROOT_COUNT + itoa(moduleID) + "-" + itoa(moduleTypeID);
string temp = sysConfig->getConfig(Section, ModuleDBRootCount).c_str();
int moduledbrootcount = 0;
if (temp.empty() || temp != oam::UnassignedName)
moduledbrootcount = strtol(temp.c_str(), 0, 0);
HostConfig hostconfig;
// get NIC IP address/hostnames
moduleconfig.hostConfigList.clear();
for (int nicID = 1; nicID < MAX_NIC + 1; nicID++)
{
string ModuleIpAddr = MODULE_IP_ADDR + itoa(moduleID) + "-" + itoa(nicID) + "-" + itoa(moduleTypeID);
string ipAddr = sysConfig->getConfig(Section, ModuleIpAddr);
if (ipAddr.empty() || ipAddr == UnassignedIpAddr)
continue;
string ModuleHostName =
MODULE_SERVER_NAME + itoa(moduleID) + "-" + itoa(nicID) + "-" + itoa(moduleTypeID);
string serverName = sysConfig->getConfig(Section, ModuleHostName);
hostconfig.IPAddr = ipAddr;
hostconfig.HostName = serverName;
hostconfig.NicID = nicID;
moduleconfig.hostConfigList.push_back(hostconfig);
}
// get DBroot IDs
moduleconfig.dbrootConfigList.clear();
for (int dbrootID = 1; dbrootID < moduledbrootcount + 1; dbrootID++)
{
string ModuleDBRootID =
MODULE_DBROOT_ID + itoa(moduleID) + "-" + itoa(dbrootID) + "-" + itoa(moduleTypeID);
string moduleDBRootID = sysConfig->getConfig(Section, ModuleDBRootID);
if (moduleDBRootID.empty() || moduleDBRootID == oam::UnassignedName || moduleDBRootID == "0")
continue;
moduleconfig.dbrootConfigList.push_back(atoi(moduleDBRootID.c_str()));
}
sort(moduleconfig.dbrootConfigList.begin(), moduleconfig.dbrootConfigList.end());
return;
}
}
// Module Not found
exceptionControl("getSystemConfig", API_INVALID_PARAMETER);
}
/********************************************************************
*
* get System Configuration String Parameter value
*
********************************************************************/
void Oam::getSystemConfig(const std::string& name, std::string& value)
{
Config* sysConfig = Config::makeConfig(CalpontConfigFile.c_str());
// get string variables
for (int i = 0;; i++)
{
if (configSections[i] == "")
// end of section list
break;
value = sysConfig->getConfig(configSections[i], name);
if (!(value.empty()))
{
// match found
return;
}
}
// no match found
exceptionControl("getSystemConfig", API_INVALID_PARAMETER);
}
/********************************************************************
*
* get System Configuration Integer Parameter value
*
********************************************************************/
void Oam::getSystemConfig(const std::string& name, int& value)
{
string returnValue;
// get string variables
Oam::getSystemConfig(name, returnValue);
// covert returned Parameter value to Interger
value = atoi(returnValue.c_str());
}
/********************************************************************
*
* get Local Module Information from Local Module Configuration file
*
* Returns: Local Module Name, Local Module Type, Local Module ID,
* OAM Parent Module Name, and OAM Parent Flag
*
********************************************************************/
oamModuleInfo_t Oam::getModuleInfo()
{
string localModule;
string localModuleType;
int localModuleID;
// Get Module Name from module-file
string fileName = "/var/lib/columnstore/local/module";
ifstream oldFile(fileName.c_str());
char line[400];
while (oldFile.getline(line, 400))
{
localModule = line;
break;
}
oldFile.close();
if (localModule.empty())
{
// not found
// system("touch /var/log/mariadb/columnstore/test8");
exceptionControl("getModuleInfo", API_FAILURE);
}
localModuleType = localModule.substr(0, MAX_MODULE_TYPE_SIZE);
localModuleID = atoi(localModule.substr(MAX_MODULE_TYPE_SIZE, MAX_MODULE_ID_SIZE).c_str());
// Get Parent OAM Module name
string ParentOAMModule = oam::UnassignedName;
string StandbyOAMModule = oam::UnassignedName;
bool parentOAMModuleFlag = false;
bool standbyOAMModuleFlag = false;
int serverTypeInstall = 1;
try
{
Config* sysConfig = Config::makeConfig(CalpontConfigFile.c_str());
string Section = "SystemConfig";
ParentOAMModule = sysConfig->getConfig(Section, "ParentOAMModuleName");
StandbyOAMModule = sysConfig->getConfig(Section, "StandbyOAMModuleName");
if (localModule == ParentOAMModule)
parentOAMModuleFlag = true;
if (localModule == StandbyOAMModule)
standbyOAMModuleFlag = true;
// Get Server Type Install ID
serverTypeInstall = atoi(sysConfig->getConfig("Installation", "ServerTypeInstall").c_str());
}
catch (...)
{
}
return boost::make_tuple(localModule, localModuleType, localModuleID, ParentOAMModule, parentOAMModuleFlag,
serverTypeInstall, StandbyOAMModule, standbyOAMModuleFlag);
}
/********************************************************************
*
* Get Storage Config Data
*
********************************************************************/
systemStorageInfo_t Oam::getStorageConfig()
{
DeviceDBRootList deviceDBRootList;
std::string storageType = "";
std::string UMstorageType = "";
int SystemDBRootCount = 0;
try
{
getSystemConfig("DBRootStorageType", storageType);
}
catch (...)
{
exceptionControl("getStorageConfig", oam::API_FAILURE);
}
try
{
getSystemConfig("UMStorageType", UMstorageType);
}
catch (...)
{
exceptionControl("getStorageConfig", oam::API_FAILURE);
}
try
{
getSystemConfig("DBRootCount", SystemDBRootCount);
}
catch (...)
{
exceptionControl("getStorageConfig", oam::API_FAILURE);
}
try
{
SystemModuleTypeConfig systemmoduletypeconfig;
getSystemConfig(systemmoduletypeconfig);
for (unsigned int i = 0; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
{
if (systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty())
// end of list
break;
int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
string moduletype = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;
if (moduleCount > 0 && moduletype == "pm")
{
deviceDBRootList = systemmoduletypeconfig.moduletypeconfig[i].ModuleDBRootList;
return boost::make_tuple(storageType, SystemDBRootCount, deviceDBRootList, UMstorageType);
}
}
}
catch (...)
{
exceptionControl("getStorageConfig", oam::API_FAILURE);
}
return boost::make_tuple(storageType, SystemDBRootCount, deviceDBRootList, UMstorageType);
}
/********************************************************************
*
* Get PM - DBRoot Config data
*
********************************************************************/
void Oam::getPmDbrootConfig(const int pmid, DBRootConfigList& dbrootconfiglist)
{
string module = "pm" + itoa(pmid);
// validate Module name
int returnStatus = validateModule(module);
if (returnStatus != API_SUCCESS)
exceptionControl("getPmDbrootConfig", returnStatus);
try
{
ModuleConfig moduleconfig;
getSystemConfig(module, moduleconfig);
DBRootConfigList::iterator pt1 = moduleconfig.dbrootConfigList.begin();
for (; pt1 != moduleconfig.dbrootConfigList.end(); pt1++)
{
dbrootconfiglist.push_back((*pt1));
}
}
catch (...)
{
// dbrootid not found, return with error
exceptionControl("getPmDbrootConfig", API_INVALID_PARAMETER);
}
}
/********************************************************************
*
* Get DBRoot - PM Config data
*
********************************************************************/
void Oam::getDbrootPmConfig(const int dbrootid, set<int>& pmids)
{
SystemModuleTypeConfig systemmoduletypeconfig;
ModuleTypeConfig moduletypeconfig;
ModuleConfig moduleconfig;
pmids.clear();
try
{
getSystemConfig(systemmoduletypeconfig);
for (unsigned int i = 0; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
{
if (systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty())
// end of list
break;
int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
string moduletype = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;
if (moduleCount > 0 && moduletype == "pm")
{
DeviceDBRootList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleDBRootList.begin();
for (; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleDBRootList.end(); pt++)
{
DBRootConfigList::iterator pt1 = (*pt).dbrootConfigList.begin();
for (; pt1 != (*pt).dbrootConfigList.end(); pt1++)
{
if (*pt1 == dbrootid)
{
pmids.insert((*pt).DeviceID);
}
}
}
}
}
if (!pmids.empty())
{
return;
}
// dbrootid not found, return with error
exceptionControl("getDbrootPmConfig", API_INVALID_PARAMETER);
}
catch (exception&)
{
}
// dbrootid not found, return with error
exceptionControl("getDbrootPmConfig", API_INVALID_PARAMETER);
}
/********************************************************************
*
* Get System DBRoot Config data
*
********************************************************************/
void Oam::getSystemDbrootConfig(DBRootConfigList& dbrootconfiglist)
{
SystemModuleTypeConfig systemmoduletypeconfig;
ModuleTypeConfig moduletypeconfig;
ModuleConfig moduleconfig;
try
{
getSystemConfig(systemmoduletypeconfig);
for (unsigned int i = 0; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
{
if (systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty())
// end of list
break;
int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
string moduletype = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;
if (moduleCount > 0 && moduletype == "pm")
{
DeviceDBRootList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleDBRootList.begin();
for (; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleDBRootList.end(); pt++)
{
DBRootConfigList::iterator pt1 = (*pt).dbrootConfigList.begin();
for (; pt1 != (*pt).dbrootConfigList.end(); pt1++)
{
dbrootconfiglist.push_back(*pt1);
}
}
}
}
sort(dbrootconfiglist.begin(), dbrootconfiglist.end());
}
catch (...)
{
// dbrootid not found, return with error
exceptionControl("getSystemDbrootConfig", API_INVALID_PARAMETER);
}
return;
}
/***************************************************************************
*
* Function: validateModule
*
* Purpose: Validate Module Name
*
****************************************************************************/
int Oam::validateModule(const std::string name)
{
if (name.size() < 3)
// invalid ID
return API_INVALID_PARAMETER;
string moduletype = name.substr(0, MAX_MODULE_TYPE_SIZE);
int moduleID = atoi(name.substr(MAX_MODULE_TYPE_SIZE, MAX_MODULE_ID_SIZE).c_str());
if (moduleID < 1)
// invalid ID
return API_INVALID_PARAMETER;
SystemModuleTypeConfig systemmoduletypeconfig;
try
{
getSystemConfig(systemmoduletypeconfig);
}
catch (...)
{
return API_INVALID_PARAMETER;
}
for (unsigned int i = 0; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
{
if (systemmoduletypeconfig.moduletypeconfig[i].ModuleType == moduletype)
{
if (systemmoduletypeconfig.moduletypeconfig[i].ModuleCount == 0)
return API_INVALID_PARAMETER;
DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
for (; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end(); pt++)
{
if (name == (*pt).DeviceName)
return API_SUCCESS;
}
}
}
return API_INVALID_PARAMETER;
}
/******************************************************************************************
* @brief changeMyCnf
*
* purpose: change my.cnf and add if value is not present to mysqld section
*
******************************************************************************************/
bool Oam::changeMyCnf(std::string paramater, std::string value)
{
string mycnfFile = std::string(MCSMYCNFDIR) + "/columnstore.cnf";
ifstream file(mycnfFile.c_str());
if (!file)
{
cout << "File not found: " << mycnfFile << endl;
return false;
}
vector<string> lines;
char line[200];
string buf;
bool foundIt = false;
while (file.getline(line, 200))
{
buf = line;
string::size_type pos = buf.find(paramater, 0);
if (pos == 0)
{
string::size_type pos = buf.find("=", 0);
if (pos != string::npos)
{
buf = paramater + " = " + value;
foundIt = true;
}
}
// output to temp file
lines.push_back(buf);
}
if (!foundIt)
{
// Its not in the file go back to beginning of file
file.clear();
file.seekg(0, ios::beg);
lines.clear();
while (file.getline(line, 200))
{
buf = line;
string::size_type pos = buf.find("[mysqld]", 0);
if (pos != string::npos)
{
lines.push_back(buf);
buf = "loose-" + paramater + " = " + value;
}
// output to temp file
lines.push_back(buf);
}
}
file.close();
unlink(mycnfFile.c_str());
ofstream newFile(mycnfFile.c_str());
// create new file
int fd = open(mycnfFile.c_str(), O_RDWR | O_CREAT, 0664);
copy(lines.begin(), lines.end(), ostream_iterator<string>(newFile, "\n"));
newFile.close();
close(fd);
return true;
}
/***************************************************************************
* PRIVATE FUNCTIONS
***************************************************************************/
/***************************************************************************
*
* Function: exceptionControl
*
* Purpose: exception control function
*
****************************************************************************/
void Oam::exceptionControl(std::string function, int returnStatus, const char* extraMsg)
{
std::string msg;
switch (returnStatus)
{
case API_INVALID_PARAMETER:
{
msg = "Invalid Parameter passed in ";
msg.append(function);
msg.append(" API");
}
break;
case API_FILE_OPEN_ERROR:
{
msg = "File Open error from ";
msg.append(function);
msg.append(" API");
}
break;
case API_TIMEOUT:
{
msg = "Timeout error from ";
msg.append(function);
msg.append(" API");
}
break;
case API_DISABLED:
{
msg = "API Disabled: ";
msg.append(function);
}
break;
case API_FILE_ALREADY_EXIST:
{
msg = "File Already Exist";
}
break;
case API_ALREADY_IN_PROGRESS:
{
msg = "Already In Process";
}
break;
case API_FAILURE_DB_ERROR:
{
msg = "Database Test Error";
}
break;
case API_INVALID_STATE:
{
msg = "Target in an invalid state";
}
break;
case API_READONLY_PARAMETER:
{
msg = "Parameter is Read-Only, can't update";
}
break;
case API_TRANSACTIONS_COMPLETE:
{
msg = "Finished waiting for transactions";
}
break;
case API_CONN_REFUSED:
{
msg = "Connection refused";
}
break;
case API_CANCELLED:
{
msg = "Operation Cancelled";
}
break;
default:
{
msg = "API Failure return in ";
msg.append(function);
msg.append(" API");
}
break;
} // end of switch
if (extraMsg)
{
msg.append(":\n ");
msg.append(extraMsg);
}
throw runtime_error(msg);
}
/***************************************************************************
*
* Function: itoa
*
* Purpose: Integer to ASCII convertor
*
****************************************************************************/
std::string Oam::itoa(const int i)
{
stringstream ss;
ss << i;
return ss.str();
}
} // namespace oam