You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-07-30 19:23:07 +03:00
Merge pull request #665 from pleblanc1976/mcol-1607
Mcol 1607 - postconfig must support writing hostnames to config file
This commit is contained in:
@ -309,8 +309,10 @@
|
||||
<Desc4>MariaDB Columnstore Packages and setup the module to make it ready to be restored</Desc4>
|
||||
<Arg1>Required: Module-type or Module-name being added</Arg1>
|
||||
<Arg2>Required: Number-of-Modules being added when Module-type is specified</Arg2>
|
||||
<Arg3>Optional: Server-Hostnames/Amazon-Instance-Names seperated by commas</Arg3>
|
||||
<Arg4>Optional: Server-root-password</Arg4>
|
||||
<Arg3>Required: Store hostnames in the configuration instead of IP addresses (y/n)</Arg3>
|
||||
<Arg4>If not Amazon, then Required: hostnames separated by commas</Arg4>
|
||||
<Arg5>If Amazon, then Optional: Amazon-Instance-Names separated by commas</Arg5>
|
||||
<Arg6>Optional: Server-user-password</Arg6>
|
||||
</Cmd48>
|
||||
<Cmd49>
|
||||
<Name>removeModule</Name>
|
||||
|
@ -1272,10 +1272,12 @@ void Oam::setSystemConfig(const std::string module, ModuleConfig moduleconfig)
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
void Oam::addModule(DeviceNetworkList devicenetworklist, const std::string password, const std::string mysqlpw)
|
||||
void Oam::addModule(DeviceNetworkList devicenetworklist, const std::string password, const std::string mysqlpw,
|
||||
bool storeHostnames)
|
||||
{
|
||||
// build and send msg
|
||||
int returnStatus = sendMsgToProcMgr2(ADDMODULE, devicenetworklist, FORCEFUL, ACK_YES, password, mysqlpw);
|
||||
int returnStatus = sendAddModuleToProcMgr(ADDMODULE, devicenetworklist, FORCEFUL, ACK_YES, storeHostnames,
|
||||
password, mysqlpw);
|
||||
|
||||
if (returnStatus != API_SUCCESS)
|
||||
exceptionControl("addModule", returnStatus);
|
||||
@ -10007,6 +10009,124 @@ int Oam::sendMsgToProcMgr2(messageqcpp::ByteStream::byte requestType, DeviceNetw
|
||||
return returnStatus;
|
||||
}
|
||||
|
||||
/* A slightly different version of sendMsgToProcMgr2. Add-module needs to send one add'l
|
||||
parameter, and this was the best of a couple bad options. */
|
||||
int Oam::sendAddModuleToProcMgr(messageqcpp::ByteStream::byte requestType, DeviceNetworkList devicenetworklist,
|
||||
GRACEFUL_FLAG gracefulflag, ACK_FLAG ackflag, bool storeHostnames, const std::string password,
|
||||
const std::string mysqlpw)
|
||||
{
|
||||
if (!checkSystemRunning())
|
||||
return API_CONN_REFUSED;
|
||||
|
||||
int returnStatus = API_TIMEOUT; //default
|
||||
ByteStream msg;
|
||||
ByteStream receivedMSG;
|
||||
ByteStream::byte msgType;
|
||||
ByteStream::byte actionType;
|
||||
ByteStream::byte status;
|
||||
|
||||
// get current requesting process, an error will occur if process is a UI tool (not kept in Status Table)
|
||||
// this will be used to determine if this is a manually or auto request down within Process-Monitor
|
||||
bool requestManual;
|
||||
myProcessStatus_t t;
|
||||
|
||||
try
|
||||
{
|
||||
t = getMyProcessStatus();
|
||||
requestManual = false; // set to auto
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
requestManual = true; // set to manual
|
||||
}
|
||||
|
||||
// setup message
|
||||
msg << (ByteStream::byte) REQUEST;
|
||||
msg << requestType;
|
||||
msg << (std::string) " ";
|
||||
msg << (ByteStream::byte) gracefulflag;
|
||||
msg << (ByteStream::byte) ackflag;
|
||||
msg << (ByteStream::byte) requestManual;
|
||||
msg << (uint8_t) storeHostnames;
|
||||
msg << (uint16_t) devicenetworklist.size();
|
||||
|
||||
DeviceNetworkList::iterator pt = devicenetworklist.begin();
|
||||
|
||||
for ( ; pt != devicenetworklist.end() ; pt++)
|
||||
{
|
||||
msg << (*pt).DeviceName;
|
||||
|
||||
if ( (*pt).UserTempDeviceName.empty() )
|
||||
msg << " ";
|
||||
else
|
||||
msg << (*pt).UserTempDeviceName;
|
||||
|
||||
if ( (*pt).DisableState.empty() )
|
||||
msg << " ";
|
||||
else
|
||||
msg << (*pt).DisableState;
|
||||
|
||||
msg << (uint16_t) (*pt).hostConfigList.size();
|
||||
|
||||
HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();
|
||||
|
||||
for ( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
|
||||
{
|
||||
msg << (*pt1).IPAddr;
|
||||
msg << (*pt1).HostName;
|
||||
msg << (*pt1).NicID;
|
||||
}
|
||||
}
|
||||
|
||||
msg << password;
|
||||
msg << mysqlpw;
|
||||
|
||||
try
|
||||
{
|
||||
//send the msg to Process Manager
|
||||
MessageQueueClient procmgr("ProcMgr");
|
||||
procmgr.write(msg);
|
||||
|
||||
// check for Ack msg if needed
|
||||
if ( ackflag == ACK_YES )
|
||||
{
|
||||
// wait 15 minutes for ACK from Process Manager
|
||||
struct timespec ts = { 900, 0 };
|
||||
|
||||
receivedMSG = procmgr.read(&ts);
|
||||
|
||||
if (receivedMSG.length() > 0)
|
||||
{
|
||||
receivedMSG >> msgType;
|
||||
receivedMSG >> actionType;
|
||||
receivedMSG >> status;
|
||||
|
||||
if ( msgType == oam::ACK && actionType == requestType)
|
||||
{
|
||||
// ACK for this request
|
||||
returnStatus = status;
|
||||
}
|
||||
}
|
||||
else // timeout
|
||||
returnStatus = API_TIMEOUT;
|
||||
}
|
||||
else
|
||||
// No ACK, assume write success
|
||||
returnStatus = API_SUCCESS;
|
||||
|
||||
// shutdown connection
|
||||
procmgr.shutdown();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
returnStatus = API_FAILURE;
|
||||
}
|
||||
|
||||
return returnStatus;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* Function: sendMsgToProcMgr3
|
||||
|
@ -1488,7 +1488,8 @@ public:
|
||||
* @param DeviceNetworkConfig the Modules added
|
||||
* @param password Host Root Password
|
||||
*/
|
||||
EXPORT void addModule(DeviceNetworkList devicenetworklist, const std::string password, const std::string mysqlpw);
|
||||
EXPORT void addModule(DeviceNetworkList devicenetworklist, const std::string password, const std::string mysqlpw,
|
||||
bool storeHostnames);
|
||||
|
||||
/** @brief remove Module
|
||||
*
|
||||
@ -2503,6 +2504,12 @@ private:
|
||||
int sendMsgToProcMgr2(messageqcpp::ByteStream::byte requestType, DeviceNetworkList devicenetworklist,
|
||||
GRACEFUL_FLAG gracefulflag, ACK_FLAG ackflag, const std::string password = oam::UnassignedName, const std::string mysqlpw = oam::UnassignedName);
|
||||
|
||||
/** @brief a slightly different version of sendMsgToProcMgr2, which is for addmodule only.
|
||||
*/
|
||||
int sendAddModuleToProcMgr(messageqcpp::ByteStream::byte requestType, DeviceNetworkList devicenetworklist,
|
||||
GRACEFUL_FLAG gracefulflag, ACK_FLAG ackflag, bool storeHostnames, const std::string password = oam::UnassignedName,
|
||||
const std::string mysqlpw = oam::UnassignedName);
|
||||
|
||||
/** @brief build and send request message to Process Manager
|
||||
* Check for status messages
|
||||
*/
|
||||
|
@ -5660,6 +5660,7 @@ int processCommand(string* arguments)
|
||||
DeviceNetworkList enabledevicenetworklist;
|
||||
HostConfig hostconfig;
|
||||
|
||||
bool storeHostnames = false;
|
||||
string moduleType;
|
||||
string moduleName;
|
||||
int moduleCount;
|
||||
@ -5685,8 +5686,47 @@ int processCommand(string* arguments)
|
||||
//Module Type was entered
|
||||
moduleType = arguments[1];
|
||||
moduleCount = atoi(arguments[2].c_str());
|
||||
hostArg = 4;
|
||||
|
||||
// MCOL-1607. Check whether we should store host names or IP addresses.
|
||||
if (arguments[3] != "" && (arguments[3][0] == 'y' || arguments[3][0] == 'Y'))
|
||||
storeHostnames = true;
|
||||
|
||||
//check for a non-distrubuted install setup, dont need password
|
||||
if ( DistributedInstall != "y" )
|
||||
{
|
||||
if (arguments[5] != "")
|
||||
password = arguments[5];
|
||||
else
|
||||
{
|
||||
cout << endl;
|
||||
string prompt = "Enter the 'User' Password or 'ssh' if configured with ssh-keys";
|
||||
password = dataPrompt(prompt);
|
||||
}
|
||||
}
|
||||
|
||||
if (arguments[6] != "")
|
||||
dbrootPerPM = atoi(arguments[6].c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
//Module Name was entered
|
||||
if (arguments[2] == "" && cloud == oam::UnassignedName)
|
||||
{
|
||||
// need at least arguments
|
||||
cout << endl << "**** addModule Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
||||
break;
|
||||
}
|
||||
|
||||
moduleName = arguments[1];
|
||||
moduleType = arguments[1].substr(0, MAX_MODULE_TYPE_SIZE);
|
||||
moduleCount = 1;
|
||||
hostArg = 3;
|
||||
|
||||
// MCOL-1607. Check whether we should store host names or IP addresses.
|
||||
if (arguments[2] != "" && (arguments[2][0] == 'y' || arguments[2][0] == 'Y'))
|
||||
storeHostnames = true;
|
||||
|
||||
//check for a non-distrubuted install setup, dont need password
|
||||
if ( DistributedInstall != "y" )
|
||||
{
|
||||
@ -5703,37 +5743,6 @@ int processCommand(string* arguments)
|
||||
if (arguments[5] != "")
|
||||
dbrootPerPM = atoi(arguments[5].c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
//Module Name was entered
|
||||
if (arguments[2] == "" && cloud == oam::UnassignedName)
|
||||
{
|
||||
// need at least arguments
|
||||
cout << endl << "**** addModule Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
||||
break;
|
||||
}
|
||||
|
||||
moduleName = arguments[1];
|
||||
moduleType = arguments[1].substr(0, MAX_MODULE_TYPE_SIZE);
|
||||
moduleCount = 1;
|
||||
hostArg = 2;
|
||||
|
||||
//check for a non-distrubuted install setup, dont need password
|
||||
if ( DistributedInstall != "y" )
|
||||
{
|
||||
if (arguments[3] != "")
|
||||
password = arguments[3];
|
||||
else
|
||||
{
|
||||
cout << endl;
|
||||
string prompt = "Enter the 'User' Password or 'ssh' if configured with ssh-keys";
|
||||
password = dataPrompt(prompt);
|
||||
}
|
||||
}
|
||||
|
||||
if (arguments[4] != "")
|
||||
dbrootPerPM = atoi(arguments[4].c_str());
|
||||
}
|
||||
|
||||
//do we needed this check????
|
||||
if ( moduleCount < 1 || moduleCount > 10 )
|
||||
@ -5925,7 +5934,24 @@ int processCommand(string* arguments)
|
||||
string hostName;
|
||||
string IPAddress;
|
||||
|
||||
if ( cloud == "amazon-ec2")
|
||||
// MCOL-1607. Store hostnames in the config file if they entered one */
|
||||
if (storeHostnames)
|
||||
{
|
||||
// special case
|
||||
if (cloud == "amazon-vpc" && *listPT1 == "autoassign")
|
||||
{
|
||||
hostName = oam::UnassignedName;
|
||||
IPAddress = *listPT1;
|
||||
}
|
||||
else if (oam.isValidIP(*listPT1)) // they entered an IP addr
|
||||
{
|
||||
hostName = oam::UnassignedName;
|
||||
IPAddress = *listPT1;
|
||||
}
|
||||
else // they entered a hostname
|
||||
IPAddress = hostName = *listPT1;
|
||||
}
|
||||
else if ( cloud == "amazon-ec2")
|
||||
{
|
||||
hostName = *listPT1;
|
||||
|
||||
@ -5978,14 +6004,13 @@ int processCommand(string* arguments)
|
||||
// non-amazon
|
||||
hostName = *listPT1;
|
||||
IPAddress = oam.getIPAddress(hostName);
|
||||
|
||||
if ( IPAddress.empty() )
|
||||
{
|
||||
// prompt for IP Address
|
||||
string prompt = "IP Address of " + hostName + " not found, enter IP Address or enter 'abort'";
|
||||
IPAddress = dataPrompt(prompt);
|
||||
|
||||
if ( IPAddress == "abort" || !oam.isValidIP(IPAddress))
|
||||
if ( IPAddress == "abort" || !oam.isValidIP(IPAddress) )
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@ -6023,6 +6048,10 @@ int processCommand(string* arguments)
|
||||
{
|
||||
string prompt = "DataRedundancy is configured for dedicated network, enter a hostname";
|
||||
DataRedundancyHostname = dataPrompt(prompt);
|
||||
if (storeHostnames)
|
||||
DataRedundancyIPAddress = DataRedundancyHostname;
|
||||
else
|
||||
{
|
||||
DataRedundancyIPAddress = oam.getIPAddress(DataRedundancyHostname);
|
||||
|
||||
if ( DataRedundancyIPAddress.empty() )
|
||||
@ -6034,7 +6063,7 @@ int processCommand(string* arguments)
|
||||
if (!oam.isValidIP(DataRedundancyIPAddress))
|
||||
return 1;
|
||||
}
|
||||
|
||||
}
|
||||
sysConfig->setConfig("DataRedundancyConfig", dataDupHostName, DataRedundancyHostname);
|
||||
sysConfig->setConfig("DataRedundancyConfig", dataDupIPaddr, DataRedundancyIPAddress);
|
||||
}
|
||||
@ -6105,7 +6134,7 @@ int processCommand(string* arguments)
|
||||
|
||||
cout << "please wait..." << endl;
|
||||
|
||||
oam.addModule(devicenetworklist, password, mysqlpassword);
|
||||
oam.addModule(devicenetworklist, password, mysqlpassword, storeHostnames);
|
||||
|
||||
cout << "Add Module(s) successfully completed" << endl;
|
||||
|
||||
|
@ -129,7 +129,7 @@ void singleServerConfigSetup(Config* sysConfig);
|
||||
|
||||
void remoteInstallThread(void*);
|
||||
|
||||
bool glusterSetup(string password);
|
||||
bool glusterSetup(string password, bool doNotResolveHostNames);
|
||||
|
||||
std::string launchInstance(ModuleIP moduleip);
|
||||
|
||||
@ -192,6 +192,7 @@ bool nonDistributeFlag = false;
|
||||
bool single_server_quick_install = false;
|
||||
bool multi_server_quick_install = false;
|
||||
bool amazon_quick_install = false;
|
||||
bool doNotResolveHostNames = false;
|
||||
|
||||
string DataFileEnvFile;
|
||||
|
||||
@ -328,7 +329,12 @@ int main(int argc, char* argv[])
|
||||
cout << " -sn System Name" << endl;
|
||||
cout << " -pm-ip-addrs Performance Module IP Addresses xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx" << endl;
|
||||
cout << " -um-ip-addrs User Module IP Addresses xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx" << endl;
|
||||
cout << " -x Do not resolve IP Addresses from host names" << endl;
|
||||
exit (0);
|
||||
}
|
||||
else if (string("-x") == argv[i])
|
||||
{
|
||||
doNotResolveHostNames = true;
|
||||
}
|
||||
else if( string("-qs") == argv[i] )
|
||||
{
|
||||
@ -1367,7 +1373,7 @@ int main(int argc, char* argv[])
|
||||
// not running on amazon with ec2-api-tools
|
||||
if (amazon_quick_install)
|
||||
{
|
||||
cout << "ERROR: Amazon Quick Installer was specified, bu the Amazon CLI API packages isnt installed, exiting" << endl;
|
||||
cout << "ERROR: Amazon Quick Installer was specified, but the Amazon CLI API packages is not installed, exiting" << endl;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@ -1380,7 +1386,7 @@ int main(int argc, char* argv[])
|
||||
// not running on amazon with ec2-api-tools
|
||||
if (amazon_quick_install)
|
||||
{
|
||||
cout << "ERROR: Amazon Quick Installer was specified, bu the AMazon CLI API packages isnt installed, exiting" << endl;
|
||||
cout << "ERROR: Amazon Quick Installer was specified, but the Amazon CLI API packages is not installed, exiting" << endl;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@ -1717,13 +1723,6 @@ int main(int argc, char* argv[])
|
||||
// are we using settings from previous config file?
|
||||
if ( reuseConfig == "n" )
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
string numBlocksPct;
|
||||
|
||||
try
|
||||
@ -2452,7 +2451,11 @@ int main(int argc, char* argv[])
|
||||
if ( moduleIPAddr == oam::UnassignedIpAddr )
|
||||
{
|
||||
//get IP Address
|
||||
string IPAddress = oam.getIPAddress( newModuleHostName);
|
||||
string IPAddress;
|
||||
if (doNotResolveHostNames)
|
||||
IPAddress = newModuleHostName;
|
||||
else
|
||||
IPAddress = oam.getIPAddress( newModuleHostName);
|
||||
|
||||
if ( !IPAddress.empty() )
|
||||
newModuleIPAddr = IPAddress;
|
||||
@ -2468,7 +2471,7 @@ int main(int argc, char* argv[])
|
||||
//prompt for IP address
|
||||
while (true)
|
||||
{
|
||||
prompt = "Enter Nic Interface #" + oam.itoa(nicID) + " IP Address of " + newModuleHostName + " (" + newModuleIPAddr + ") > ";
|
||||
prompt = "Enter Nic Interface #" + oam.itoa(nicID) + " IP Address or hostname of " + newModuleHostName + " (" + newModuleIPAddr + ") > ";
|
||||
pcommand = callReadline(prompt.c_str());
|
||||
|
||||
if (pcommand)
|
||||
@ -2489,7 +2492,7 @@ int main(int argc, char* argv[])
|
||||
continue;
|
||||
}
|
||||
|
||||
if (oam.isValidIP(newModuleIPAddr))
|
||||
if (oam.isValidIP(newModuleIPAddr) || doNotResolveHostNames)
|
||||
{
|
||||
//check and see if hostname already used
|
||||
bool matchFound = false;
|
||||
@ -3897,7 +3900,7 @@ int main(int argc, char* argv[])
|
||||
{
|
||||
cout << endl << "===== Configuring MariaDB ColumnStore Data Redundancy Functionality =====" << endl << endl;
|
||||
|
||||
if (!glusterSetup(password))
|
||||
if (!glusterSetup(password, doNotResolveHostNames))
|
||||
{
|
||||
cout << "ERROR: Problem setting up ColumnStore Data Redundancy" << endl;
|
||||
exit(1);
|
||||
@ -6275,7 +6278,7 @@ std::string launchInstance(ModuleIP moduleip)
|
||||
return instanceName;
|
||||
}
|
||||
|
||||
bool glusterSetup(string password)
|
||||
bool glusterSetup(string password, bool doNotResolveHostNames)
|
||||
{
|
||||
Oam oam;
|
||||
int dataRedundancyCopies = 0;
|
||||
@ -6429,10 +6432,14 @@ bool glusterSetup(string password)
|
||||
callFree(pcommand);
|
||||
}
|
||||
|
||||
if ( moduleIPAddr == oam::UnassignedIpAddr )
|
||||
if ( moduleIPAddr == oam::UnassignedIpAddr)
|
||||
{
|
||||
//get IP Address
|
||||
string IPAddress = oam.getIPAddress( moduleHostName);
|
||||
string IPAddress;
|
||||
if (doNotResolveHostNames)
|
||||
IPAddress = moduleHostName;
|
||||
else
|
||||
IPAddress = oam.getIPAddress( moduleHostName);
|
||||
|
||||
if ( !IPAddress.empty() )
|
||||
moduleIPAddr = IPAddress;
|
||||
@ -6467,7 +6474,7 @@ bool glusterSetup(string password)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (oam.isValidIP(moduleIPAddr))
|
||||
if (oam.isValidIP(moduleIPAddr) || doNotResolveHostNames)
|
||||
{
|
||||
|
||||
// run ping test to validate
|
||||
|
@ -2205,9 +2205,14 @@ void processMSG(messageqcpp::IOSocket* cfIos)
|
||||
|
||||
string value;
|
||||
uint16_t count, ivalue, nicCount;
|
||||
uint8_t tmp8;
|
||||
oam::DeviceNetworkConfig devicenetworkconfig;
|
||||
oam::DeviceNetworkList devicenetworklist;
|
||||
oam::HostConfig hostconfig;
|
||||
bool storeHostnames;
|
||||
|
||||
msg >> tmp8;
|
||||
storeHostnames = (tmp8 != 0);
|
||||
|
||||
//get module count to add
|
||||
msg >> count;
|
||||
@ -2244,7 +2249,7 @@ void processMSG(messageqcpp::IOSocket* cfIos)
|
||||
string password;
|
||||
msg >> password;
|
||||
|
||||
status = processManager.addModule(devicenetworklist, password);
|
||||
status = processManager.addModule(devicenetworklist, password, storeHostnames);
|
||||
|
||||
log.writeLog(__LINE__, "ADDMODULE: ACK received from Process-Monitor, return status = " + oam.itoa(status));
|
||||
}
|
||||
@ -4835,7 +4840,8 @@ int ProcessManager::reinitProcessType( std::string processName )
|
||||
* purpose: Add Module to system configuration
|
||||
*
|
||||
******************************************************************************************/
|
||||
int ProcessManager::addModule(oam::DeviceNetworkList devicenetworklist, std::string password, bool manualFlag)
|
||||
int ProcessManager::addModule(oam::DeviceNetworkList devicenetworklist, std::string password, bool storeHostnames,
|
||||
bool manualFlag)
|
||||
{
|
||||
ProcessLog log;
|
||||
Configuration config;
|
||||
@ -5262,6 +5268,9 @@ int ProcessManager::addModule(oam::DeviceNetworkList devicenetworklist, std::str
|
||||
}
|
||||
|
||||
hostconfig.HostName = hostName;
|
||||
if (storeHostnames)
|
||||
hostconfig.IPAddr = hostName;
|
||||
else
|
||||
hostconfig.IPAddr = IPAddr;
|
||||
hostconfig.NicID = (*pt1).NicID;
|
||||
devicenetworkconfig.hostConfigList.push_back(hostconfig);
|
||||
|
@ -416,7 +416,8 @@ public:
|
||||
/**
|
||||
*@brief Add Module
|
||||
*/
|
||||
int addModule(oam::DeviceNetworkList devicenetworklist, std::string password, bool manualFlag = true);
|
||||
int addModule(oam::DeviceNetworkList devicenetworklist, std::string password, bool storeHostnames,
|
||||
bool manualFlag = true);
|
||||
|
||||
/**
|
||||
*@brief Configure Module
|
||||
|
Reference in New Issue
Block a user