class SearchSystem: def __init__(self, config = configuration.Configuration()): self.config = config self.clusterConfigPaths = config.clusterConfigPaths self.logger = logging.getLogger() self.swStat = 0 # 0: mean all agg are on service swStat = 1: Means clusterConfigPaths[swStat -1 ] is on services hadoop_client_path = 'hadoop_client/bin' hadoopToolPath = os.path.join(os.path.dirname(__file__),hadoop_client_path) self.hadoopWrapper = HadoopTool(hadoopToolPath) def checkBeforeCopy(self): incr_dirs = self.hadoopWrapper.listDirectory(self.config.hadoopIncrRoot) if len(incr_dirs) != 0: p = re.compile('.*(\d{10}_\d{10})') remove_list = [] for dir in incr_dirs: if not p.match(dir): remove_list.append(dir) for i in remove_list: incr_dirs.remove(i) return True, incr_dirs return True, incr_dirs #copy increase data to all SearchCluster and start build job in this service. def buildSearchClusters(self): (ckIncrRet, ckIncrList) = self.checkBeforeCopy() if not ckIncrRet: self.logger.info('don\'t find increase data.') return error.ERROR_NO_INCR_DATA self.logger.info(('get increase directory list: [%s]') % (ckIncrList)) for clusterConfigPath in self.clusterConfigPaths: self.logger.info('switch cluster for: [%s]' % clusterConfigPath) searchCluster = SearchCluster(clusterConfigPath, self.config) copyRet, copyIncrData = searchCluster.copyIncrData(ckIncrList) if copyRet != error.NO_ERROR: self.logger.debug('Copy incr data failed') return error.ERROR_BUILD_INCR_INDEX self.logger.info(('Copy increase data sucess, the file patern [%s]' % copyIncrData)) buildIndexRet = searchCluster.buildIncr(copyIncrData) if buildIndexRet != error.NO_ERROR: self.logger.debug('build increase index failed:[%s]' % clusterConfigPath) return buildIndexRet if not searchCluster.movePg2Done(ckIncrList): self.logger.error('move pangu to done dictionary fail') return error.ERROR_INCR_MOVE_PG self.logger.debug('begin to move hadoop to done') if not searchCluster.moveHdp2Done(ckIncrList): self.logger.error('move hadoop to done dictionary fail') return error.ERROR_INCR_MOVE_HDP return error.NO_ERROR #copy index to all SearchCluster and start service in this service. def updateSearchClusters(self): switchAggregatorTimeout = self.config.switchAggregatorTimeout aggregatorWrapper = AggregatorWrapper(self.config) for clusterConfigPath in self.clusterConfigPaths: self.logger.info('switch cluster for: [%s]' % clusterConfigPath) # fix switch path info # if not aggregatorWrapper.stop(index, switchAggregatorTimeout): # self.logger.debug('switch aggregator failed: [%s]' % clusterConfigPath) # return error.ERROR_SWITCH_PROXY_ERROR searchCluster = SearchCluster(clusterConfigPath, self.config) if self.config.noCopy == clusterConfigPath or self.config.noCopy == 'all': self.logger.info('[%s] running without Copy' % self.config.noCopy ) copyIndexRet = error.NO_ERROR else: copyIndexRet = searchCluster.copyIndex() if copyIndexRet != error.NO_ERROR: self.logger.debug('Copy index failed') return copyIndexRet switchIndexRet = searchCluster.switchIndex() if switchIndexRet != error.NO_ERROR: self.logger.debug('switch cluster failed:[%s]' % clusterConfigPath) return switchIndexRet return error.NO_ERROR # #switch aggregator # self.logger.info('recover aggregator...') # if not aggregatorWrapper.recover(switchAggregatorTimeout): # return error.ERROR_SWITCH_PROXY_ERROR # self.logger.info('switch index for clusters completely') # return error.NO_ERROR def GetAllSearchClusters(self): for clusterConfigPath in self.clusterConfigPaths: print clusterConfigPath return