/*
* Copyright(C) 2010-2011 Alibaba Group Holding Limited All rights reserved. Licensed under the Apache License, Version
* 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the
* License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the specific language governing permissions and limitations
* under the License.
*/
package com.alibaba.doris.dataserver.migrator;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.doris.common.adminservice.AdminServiceFactory;
import com.alibaba.doris.common.config.ConfigManager;
import com.alibaba.doris.common.configer.RouteTableConfiger;
import com.alibaba.doris.common.route.VirtualRouter;
import com.alibaba.doris.common.router.virtual.VirtualRouterImpl;
import com.alibaba.doris.dataserver.ApplicationContext;
import com.alibaba.doris.dataserver.BaseModule;
import com.alibaba.doris.dataserver.ModuleContext;
import com.alibaba.doris.dataserver.ModuleContextAware;
import com.alibaba.doris.dataserver.action.ActionFactory;
import com.alibaba.doris.dataserver.config.ModuleConstances;
import com.alibaba.doris.dataserver.config.data.ModuleConfigure;
import com.alibaba.doris.dataserver.migrator.action.MigrationAction;
import com.alibaba.doris.dataserver.migrator.report.DefaultMigrationReporter;
import com.alibaba.doris.dataserver.migrator.report.MigrationReporter;
import com.alibaba.doris.dataserver.store.Storage;
import com.alibaba.doris.dataserver.store.StorageModule;
/**
* MigrationModule,迁移模块.
*
* @author Kun He (Raymond He), kun.hek@alibaba-inc.com
* @since 1.0 2011-5-24
*/
public class MigrationModule extends BaseModule implements ModuleContextAware {
private static final Logger logger = LoggerFactory.getLogger(MigrationManager.class);
/**
* 加载配置和初始化迁移Module
*/
public void load(ModuleConfigure conf) {
// extensible action
MigrationAction migrationAction = new MigrationAction();
MigrationManager migrationManager = new MigrationManager();
MigrationReporter migrationReporter = null;
if (conf.getParam("migration.reporter.class") != null) {
String className = conf.getParam("migration.reporter.class");
Class<?> clazz;
try {
clazz = Thread.currentThread().getContextClassLoader().loadClass(className);
migrationReporter = (MigrationReporter) clazz.newInstance();
} catch (Exception e) {
logger.warn("MigrationReporter class not found or invalid! Use default instead." + className);
}
}
Properties commandLine = conf.getDataServerConfigure().getCommandLine();
if (commandLine != null) {
String migrateThreads = commandLine.getProperty("migrateThreads");
if (StringUtils.isNotBlank(migrateThreads)) {
migrationManager.setMigrateThreads(Integer.valueOf(migrateThreads));
}
}
if (migrationReporter == null) {
migrationReporter = new DefaultMigrationReporter();
migrationReporter.setMigrateReportService(AdminServiceFactory.getMigrateReportService());
migrationReporter.setPostMigrateReportService(AdminServiceFactory.getPostMigrateReportService());
}
VirtualRouter virtualRouter = null;
String virtualRouterClass = conf.getParam("vitualrouter.class");
if (virtualRouterClass != null) {
Class<?> clazz;
try {
clazz = Thread.currentThread().getContextClassLoader().loadClass(virtualRouterClass);
virtualRouter = (VirtualRouter) clazz.newInstance();
} catch (Exception e) {
logger.warn("VirtualRouter class not found or invalid! Use default instead." + virtualRouterClass
+ ". Cause: " + e);
}
}
if (virtualRouter == null) {
virtualRouter = new VirtualRouterImpl();
}
ModuleContext moduleContext = getModuleContext();
ApplicationContext appContext = moduleContext.getApplicationContext();
// 获取存储模块
StorageModule storageModule = (StorageModule) appContext.getModuleByName(ModuleConstances.STORAGE_MODULE);
Storage storage = storageModule.getStorage();
migrationManager.setMigrationReporter(migrationReporter);
migrationManager.setVirtualRouter(virtualRouter);
migrationManager.setStorage(storage);
// 获取配置管理器
ConfigManager configManager = (ConfigManager) appContext.getAttribute("configManager");
migrationManager.setConfigManager(configManager);
// 获取路由表管理器
RouteTableConfiger routeTableConfiger = (RouteTableConfiger) appContext.getAttribute("routeTableConfiger");
migrationManager.setRouteTableConfiger(routeTableConfiger);
// 在模块容器中,保存迁移管理器;
moduleContext.setAttribute(MigrationManager._MigrationManager, migrationManager);
// 注册迁移指令
ActionFactory.registAction(MigrateActionType.MIGRATE, migrationAction);
}
/**
* 卸载
*/
public void unload() {
ModuleContext moduleContext = getModuleContext();
logger.info("Unload MigrationModule. Port:" + moduleContext.getApplicationContext().getAttribute("serverPort"));
}
}