You've already forked mariadb-columnstore-engine
							
							
				mirror of
				https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
				synced 2025-11-03 17:13:17 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			249 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			249 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* Copyright (C) 2014 InfiniDB, Inc.
 | 
						|
 | 
						|
   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. */
 | 
						|
 | 
						|
/***************************************************************************
 | 
						|
 * $Id: UMAutoSync.cpp 34 2006-09-29 21:13:54Z dhill $
 | 
						|
 *
 | 
						|
 *   Author: Zhixuan Zhu
 | 
						|
 ***************************************************************************/
 | 
						|
 | 
						|
#include "serverMonitor.h"
 | 
						|
#include "installdir.h"
 | 
						|
 | 
						|
using namespace std;
 | 
						|
using namespace oam;
 | 
						|
using namespace snmpmanager;
 | 
						|
using namespace logging;
 | 
						|
using namespace servermonitor;
 | 
						|
using namespace config;
 | 
						|
 | 
						|
typedef struct UMmodule_struct
 | 
						|
{
 | 
						|
	std::string     moduleName;
 | 
						|
	std::string     IPAddr;
 | 
						|
} UMmodule;
 | 
						|
 | 
						|
typedef std::vector<UMmodule> UMmoduleList;
 | 
						|
 | 
						|
void rsync(std::string moduleName, std::string IPAddr, std::string rootPassword);
 | 
						|
 | 
						|
 | 
						|
/*****************************************************************************************
 | 
						|
* @brief	UMAutoSync Thread
 | 
						|
*
 | 
						|
* purpose:	check db health
 | 
						|
*
 | 
						|
*****************************************************************************************/
 | 
						|
void UMAutoSync()
 | 
						|
{
 | 
						|
	ServerMonitor serverMonitor;
 | 
						|
	Oam oam;
 | 
						|
	UMmoduleList ummodulelist;
 | 
						|
 | 
						|
	// sync run time in minutes
 | 
						|
	int UMSyncTime = 10;
 | 
						|
	try {
 | 
						|
		oam.getSystemConfig( "UMSyncTime", UMSyncTime);
 | 
						|
	}
 | 
						|
	catch(...) {
 | 
						|
		UMSyncTime = 10;
 | 
						|
	}
 | 
						|
 | 
						|
	if ( UMSyncTime < 1 )
 | 
						|
		UMSyncTime = 10;
 | 
						|
 | 
						|
	//get root password
 | 
						|
	string rootPassword = oam::UnassignedName;	// default to 'n'
 | 
						|
	try {
 | 
						|
		oam.getSystemConfig( "rpw", rootPassword);
 | 
						|
	}
 | 
						|
	catch(...) {
 | 
						|
		rootPassword = oam::UnassignedName;
 | 
						|
	}
 | 
						|
 | 
						|
	//if assigned, exit thread
 | 
						|
	if (rootPassword == oam::UnassignedName)
 | 
						|
		pthread_exit((void*) NULL);
 | 
						|
 | 
						|
	oamModuleInfo_t t;
 | 
						|
 | 
						|
	//get local module info
 | 
						|
	string localModuleName;
 | 
						|
	string localModuleType;
 | 
						|
 | 
						|
	try {
 | 
						|
		t = oam.getModuleInfo();
 | 
						|
		localModuleName = boost::get<0>(t);
 | 
						|
		localModuleType = boost::get<1>(t);
 | 
						|
	}
 | 
						|
	catch (...) {}
 | 
						|
 | 
						|
	// loop forever
 | 
						|
	while(true)
 | 
						|
	{
 | 
						|
//		LoggingID lid(SERVER_MONITOR_LOG_ID);
 | 
						|
//		MessageLog ml(lid);
 | 
						|
//		Message msg;
 | 
						|
//		Message::Args args;
 | 
						|
//		args.add("rsync thread running");
 | 
						|
//		msg.format(args);
 | 
						|
//		ml.logDebugMessage(msg);
 | 
						|
 | 
						|
		//
 | 
						|
		// find non-disabled modules to sync up
 | 
						|
		//
 | 
						|
		try
 | 
						|
		{
 | 
						|
			SystemStatus systemstatus;
 | 
						|
			oam.getSystemStatus(systemstatus);
 | 
						|
			ummodulelist.clear();
 | 
						|
 | 
						|
			for( unsigned int i = 0 ; i < systemstatus.systemmodulestatus.modulestatus.size(); i++)
 | 
						|
			{
 | 
						|
				if( systemstatus.systemmodulestatus.modulestatus[i].Module.empty() )
 | 
						|
					// end of list
 | 
						|
					break;
 | 
						|
	
 | 
						|
				string moduleName =  systemstatus.systemmodulestatus.modulestatus[i].Module;
 | 
						|
				string moduleType = moduleName.substr(0,MAX_MODULE_TYPE_SIZE);
 | 
						|
				if ( moduleType == localModuleType && moduleName != localModuleName ) {
 | 
						|
					int state = systemstatus.systemmodulestatus.modulestatus[i].ModuleOpState;
 | 
						|
					if ( state == oam::MAN_DISABLED || state == oam::AUTO_DISABLED )
 | 
						|
						continue;
 | 
						|
					else {	//get module IP Address
 | 
						|
						ModuleConfig moduleconfig;
 | 
						|
						oam.getSystemConfig(moduleName, moduleconfig);
 | 
						|
						HostConfigList::iterator pt1 = moduleconfig.hostConfigList.begin();
 | 
						|
 | 
						|
						UMmodule ummodule;
 | 
						|
				
 | 
						|
						ummodule.IPAddr = (*pt1).IPAddr;
 | 
						|
						ummodule.moduleName = moduleName;
 | 
						|
 | 
						|
						ummodulelist.push_back(ummodule);
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		catch(...) {}
 | 
						|
 | 
						|
		//update all ums
 | 
						|
		UMmoduleList::iterator list1 = ummodulelist.begin();
 | 
						|
		for (; list1 != ummodulelist.end() ; list1++)
 | 
						|
		{
 | 
						|
			//call rsync function
 | 
						|
			rsync((*list1).moduleName, (*list1).IPAddr, rootPassword);
 | 
						|
		}
 | 
						|
 | 
						|
		//
 | 
						|
		// go into check for um module update module, rsync to new modules
 | 
						|
		//
 | 
						|
		for ( int time = 0 ; time < UMSyncTime ; time++ )
 | 
						|
		{
 | 
						|
			try
 | 
						|
			{
 | 
						|
				SystemStatus systemstatus;
 | 
						|
				oam.getSystemStatus(systemstatus);
 | 
						|
	
 | 
						|
				for( unsigned int i = 0 ; i < systemstatus.systemmodulestatus.modulestatus.size(); i++)
 | 
						|
				{
 | 
						|
					if( systemstatus.systemmodulestatus.modulestatus[i].Module.empty() )
 | 
						|
						// end of list
 | 
						|
						break;
 | 
						|
		
 | 
						|
					string moduleName =  systemstatus.systemmodulestatus.modulestatus[i].Module;
 | 
						|
					string moduleType = moduleName.substr(0,MAX_MODULE_TYPE_SIZE);
 | 
						|
					if ( moduleType == localModuleType && moduleName != localModuleName ) {
 | 
						|
						int state = systemstatus.systemmodulestatus.modulestatus[i].ModuleOpState;
 | 
						|
						if ( state == oam::MAN_DISABLED || state == oam::AUTO_DISABLED )
 | 
						|
							continue;
 | 
						|
						else {	//check if in current sync list
 | 
						|
							UMmoduleList::iterator list1 = ummodulelist.begin();
 | 
						|
							bool found = false;
 | 
						|
							for (; list1 != ummodulelist.end() ; list1++)
 | 
						|
							{
 | 
						|
								if ( moduleName == (*list1).moduleName) {
 | 
						|
									found = true;
 | 
						|
									break;
 | 
						|
								}
 | 
						|
							}
 | 
						|
 | 
						|
							if ( !found) {
 | 
						|
								//get module IP Address
 | 
						|
								ModuleConfig moduleconfig;
 | 
						|
								oam.getSystemConfig(moduleName, moduleconfig);
 | 
						|
								HostConfigList::iterator pt1 = moduleconfig.hostConfigList.begin();
 | 
						|
	
 | 
						|
								//call rsync function
 | 
						|
								rsync(moduleName, (*pt1).IPAddr, rootPassword);
 | 
						|
 | 
						|
								UMmodule ummodule;
 | 
						|
						
 | 
						|
								ummodule.IPAddr = (*pt1).IPAddr;
 | 
						|
								ummodule.moduleName = moduleName;
 | 
						|
		
 | 
						|
								ummodulelist.push_back(ummodule);
 | 
						|
							}
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
			catch(...) {}
 | 
						|
	
 | 
						|
			sleep(60);
 | 
						|
		}
 | 
						|
 | 
						|
	} // end of while loop
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
*	rsync script function
 | 
						|
*/
 | 
						|
 | 
						|
void rsync(std::string moduleName, std::string IPAddr, std::string rootPassword)
 | 
						|
{
 | 
						|
 | 
						|
	string cmd = startup::StartUp::installDir() + "/bin/rsync.sh " + IPAddr + " " + rootPassword + " 1 > /tmp/rsync_" + moduleName + ".log";
 | 
						|
	int ret = system(cmd.c_str());
 | 
						|
 | 
						|
	if ( WEXITSTATUS(ret) == 0 )
 | 
						|
	{
 | 
						|
/*		LoggingID lid(SERVER_MONITOR_LOG_ID);
 | 
						|
		MessageLog ml(lid);
 | 
						|
		Message msg;
 | 
						|
		Message::Args args;
 | 
						|
		args.add("Successfully rsync to module: ");
 | 
						|
		args.add(moduleName);
 | 
						|
		msg.format(args);
 | 
						|
		ml.logDebugMessage(msg);
 | 
						|
*/	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		LoggingID lid(SERVER_MONITOR_LOG_ID);
 | 
						|
		MessageLog ml(lid);
 | 
						|
		Message msg;
 | 
						|
		Message::Args args;
 | 
						|
		args.add("Failure rsync to module: ");
 | 
						|
		args.add(moduleName);
 | 
						|
		msg.format(args);
 | 
						|
		ml.logDebugMessage(msg);
 | 
						|
 | 
						|
	}
 | 
						|
	return;
 | 
						|
}
 | 
						|
 |