1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-08-07 03:22:57 +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:
Patrick LeBlanc
2018-12-21 09:01:06 -06:00
committed by GitHub
7 changed files with 326 additions and 151 deletions

View File

@@ -309,8 +309,10 @@
<Desc4>MariaDB Columnstore Packages and setup the module to make it ready to be restored</Desc4> <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> <Arg1>Required: Module-type or Module-name being added</Arg1>
<Arg2>Required: Number-of-Modules being added when Module-type is specified</Arg2> <Arg2>Required: Number-of-Modules being added when Module-type is specified</Arg2>
<Arg3>Optional: Server-Hostnames/Amazon-Instance-Names seperated by commas</Arg3> <Arg3>Required: Store hostnames in the configuration instead of IP addresses (y/n)</Arg3>
<Arg4>Optional: Server-root-password</Arg4> <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> </Cmd48>
<Cmd49> <Cmd49>
<Name>removeModule</Name> <Name>removeModule</Name>

View File

@@ -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 // 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) if (returnStatus != API_SUCCESS)
exceptionControl("addModule", returnStatus); exceptionControl("addModule", returnStatus);
@@ -10007,6 +10009,124 @@ int Oam::sendMsgToProcMgr2(messageqcpp::ByteStream::byte requestType, DeviceNetw
return returnStatus; 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 * Function: sendMsgToProcMgr3

View File

@@ -1488,7 +1488,8 @@ public:
* @param DeviceNetworkConfig the Modules added * @param DeviceNetworkConfig the Modules added
* @param password Host Root Password * @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 /** @brief remove Module
* *
@@ -2503,6 +2504,12 @@ private:
int sendMsgToProcMgr2(messageqcpp::ByteStream::byte requestType, DeviceNetworkList devicenetworklist, 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); 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 /** @brief build and send request message to Process Manager
* Check for status messages * Check for status messages
*/ */

View File

@@ -5660,6 +5660,7 @@ int processCommand(string* arguments)
DeviceNetworkList enabledevicenetworklist; DeviceNetworkList enabledevicenetworklist;
HostConfig hostconfig; HostConfig hostconfig;
bool storeHostnames = false;
string moduleType; string moduleType;
string moduleName; string moduleName;
int moduleCount; int moduleCount;
@@ -5685,8 +5686,47 @@ int processCommand(string* arguments)
//Module Type was entered //Module Type was entered
moduleType = arguments[1]; moduleType = arguments[1];
moduleCount = atoi(arguments[2].c_str()); 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; 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 //check for a non-distrubuted install setup, dont need password
if ( DistributedInstall != "y" ) if ( DistributedInstall != "y" )
{ {
@@ -5703,37 +5743,6 @@ int processCommand(string* arguments)
if (arguments[5] != "") if (arguments[5] != "")
dbrootPerPM = atoi(arguments[5].c_str()); 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???? //do we needed this check????
if ( moduleCount < 1 || moduleCount > 10 ) if ( moduleCount < 1 || moduleCount > 10 )
@@ -5925,7 +5934,24 @@ int processCommand(string* arguments)
string hostName; string hostName;
string IPAddress; 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; hostName = *listPT1;
@@ -5978,7 +6004,6 @@ int processCommand(string* arguments)
// non-amazon // non-amazon
hostName = *listPT1; hostName = *listPT1;
IPAddress = oam.getIPAddress(hostName); IPAddress = oam.getIPAddress(hostName);
if ( IPAddress.empty() ) if ( IPAddress.empty() )
{ {
// prompt for IP Address // prompt for IP Address
@@ -6023,6 +6048,10 @@ int processCommand(string* arguments)
{ {
string prompt = "DataRedundancy is configured for dedicated network, enter a hostname"; string prompt = "DataRedundancy is configured for dedicated network, enter a hostname";
DataRedundancyHostname = dataPrompt(prompt); DataRedundancyHostname = dataPrompt(prompt);
if (storeHostnames)
DataRedundancyIPAddress = DataRedundancyHostname;
else
{
DataRedundancyIPAddress = oam.getIPAddress(DataRedundancyHostname); DataRedundancyIPAddress = oam.getIPAddress(DataRedundancyHostname);
if ( DataRedundancyIPAddress.empty() ) if ( DataRedundancyIPAddress.empty() )
@@ -6034,7 +6063,7 @@ int processCommand(string* arguments)
if (!oam.isValidIP(DataRedundancyIPAddress)) if (!oam.isValidIP(DataRedundancyIPAddress))
return 1; return 1;
} }
}
sysConfig->setConfig("DataRedundancyConfig", dataDupHostName, DataRedundancyHostname); sysConfig->setConfig("DataRedundancyConfig", dataDupHostName, DataRedundancyHostname);
sysConfig->setConfig("DataRedundancyConfig", dataDupIPaddr, DataRedundancyIPAddress); sysConfig->setConfig("DataRedundancyConfig", dataDupIPaddr, DataRedundancyIPAddress);
} }
@@ -6105,7 +6134,7 @@ int processCommand(string* arguments)
cout << "please wait..." << endl; cout << "please wait..." << endl;
oam.addModule(devicenetworklist, password, mysqlpassword); oam.addModule(devicenetworklist, password, mysqlpassword, storeHostnames);
cout << "Add Module(s) successfully completed" << endl; cout << "Add Module(s) successfully completed" << endl;

View File

@@ -129,7 +129,7 @@ void singleServerConfigSetup(Config* sysConfig);
void remoteInstallThread(void*); void remoteInstallThread(void*);
bool glusterSetup(string password); bool glusterSetup(string password, bool doNotResolveHostNames);
std::string launchInstance(ModuleIP moduleip); std::string launchInstance(ModuleIP moduleip);
@@ -192,6 +192,7 @@ bool nonDistributeFlag = false;
bool single_server_quick_install = false; bool single_server_quick_install = false;
bool multi_server_quick_install = false; bool multi_server_quick_install = false;
bool amazon_quick_install = false; bool amazon_quick_install = false;
bool doNotResolveHostNames = false;
string DataFileEnvFile; string DataFileEnvFile;
@@ -328,7 +329,12 @@ int main(int argc, char* argv[])
cout << " -sn System Name" << endl; cout << " -sn System Name" << endl;
cout << " -pm-ip-addrs Performance Module IP Addresses xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx" << 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 << " -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); exit (0);
}
else if (string("-x") == argv[i])
{
doNotResolveHostNames = true;
} }
else if( string("-qs") == argv[i] ) else if( string("-qs") == argv[i] )
{ {
@@ -1367,7 +1373,7 @@ int main(int argc, char* argv[])
// not running on amazon with ec2-api-tools // not running on amazon with ec2-api-tools
if (amazon_quick_install) 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); exit(1);
} }
@@ -1380,7 +1386,7 @@ int main(int argc, char* argv[])
// not running on amazon with ec2-api-tools // not running on amazon with ec2-api-tools
if (amazon_quick_install) 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); exit(1);
} }
@@ -1717,13 +1723,6 @@ int main(int argc, char* argv[])
// are we using settings from previous config file? // are we using settings from previous config file?
if ( reuseConfig == "n" ) if ( reuseConfig == "n" )
{ {
string numBlocksPct; string numBlocksPct;
try try
@@ -2452,7 +2451,11 @@ int main(int argc, char* argv[])
if ( moduleIPAddr == oam::UnassignedIpAddr ) if ( moduleIPAddr == oam::UnassignedIpAddr )
{ {
//get IP Address //get IP Address
string IPAddress = oam.getIPAddress( newModuleHostName); string IPAddress;
if (doNotResolveHostNames)
IPAddress = newModuleHostName;
else
IPAddress = oam.getIPAddress( newModuleHostName);
if ( !IPAddress.empty() ) if ( !IPAddress.empty() )
newModuleIPAddr = IPAddress; newModuleIPAddr = IPAddress;
@@ -2468,7 +2471,7 @@ int main(int argc, char* argv[])
//prompt for IP address //prompt for IP address
while (true) 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()); pcommand = callReadline(prompt.c_str());
if (pcommand) if (pcommand)
@@ -2489,7 +2492,7 @@ int main(int argc, char* argv[])
continue; continue;
} }
if (oam.isValidIP(newModuleIPAddr)) if (oam.isValidIP(newModuleIPAddr) || doNotResolveHostNames)
{ {
//check and see if hostname already used //check and see if hostname already used
bool matchFound = false; bool matchFound = false;
@@ -3897,7 +3900,7 @@ int main(int argc, char* argv[])
{ {
cout << endl << "===== Configuring MariaDB ColumnStore Data Redundancy Functionality =====" << endl << endl; 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; cout << "ERROR: Problem setting up ColumnStore Data Redundancy" << endl;
exit(1); exit(1);
@@ -6275,7 +6278,7 @@ std::string launchInstance(ModuleIP moduleip)
return instanceName; return instanceName;
} }
bool glusterSetup(string password) bool glusterSetup(string password, bool doNotResolveHostNames)
{ {
Oam oam; Oam oam;
int dataRedundancyCopies = 0; int dataRedundancyCopies = 0;
@@ -6432,7 +6435,11 @@ bool glusterSetup(string password)
if ( moduleIPAddr == oam::UnassignedIpAddr) if ( moduleIPAddr == oam::UnassignedIpAddr)
{ {
//get IP Address //get IP Address
string IPAddress = oam.getIPAddress( moduleHostName); string IPAddress;
if (doNotResolveHostNames)
IPAddress = moduleHostName;
else
IPAddress = oam.getIPAddress( moduleHostName);
if ( !IPAddress.empty() ) if ( !IPAddress.empty() )
moduleIPAddr = IPAddress; moduleIPAddr = IPAddress;
@@ -6467,7 +6474,7 @@ bool glusterSetup(string password)
continue; continue;
} }
if (oam.isValidIP(moduleIPAddr)) if (oam.isValidIP(moduleIPAddr) || doNotResolveHostNames)
{ {
// run ping test to validate // run ping test to validate

View File

@@ -2205,9 +2205,14 @@ void processMSG(messageqcpp::IOSocket* cfIos)
string value; string value;
uint16_t count, ivalue, nicCount; uint16_t count, ivalue, nicCount;
uint8_t tmp8;
oam::DeviceNetworkConfig devicenetworkconfig; oam::DeviceNetworkConfig devicenetworkconfig;
oam::DeviceNetworkList devicenetworklist; oam::DeviceNetworkList devicenetworklist;
oam::HostConfig hostconfig; oam::HostConfig hostconfig;
bool storeHostnames;
msg >> tmp8;
storeHostnames = (tmp8 != 0);
//get module count to add //get module count to add
msg >> count; msg >> count;
@@ -2244,7 +2249,7 @@ void processMSG(messageqcpp::IOSocket* cfIos)
string password; string password;
msg >> 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)); 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 * 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; ProcessLog log;
Configuration config; Configuration config;
@@ -5262,6 +5268,9 @@ int ProcessManager::addModule(oam::DeviceNetworkList devicenetworklist, std::str
} }
hostconfig.HostName = hostName; hostconfig.HostName = hostName;
if (storeHostnames)
hostconfig.IPAddr = hostName;
else
hostconfig.IPAddr = IPAddr; hostconfig.IPAddr = IPAddr;
hostconfig.NicID = (*pt1).NicID; hostconfig.NicID = (*pt1).NicID;
devicenetworkconfig.hostConfigList.push_back(hostconfig); devicenetworkconfig.hostConfigList.push_back(hostconfig);

View File

@@ -416,7 +416,8 @@ public:
/** /**
*@brief Add Module *@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 *@brief Configure Module