/** * Project: doris.admin.service.common-0.1.0-SNAPSHOT * * File Created at 2011-5-22 * $Id$ * * Copyright 1999-2100 Alibaba.com Corporation Limited. * All rights reserved. * * This software is the confidential and proprietary information of * Alibaba Company. ("Confidential Information"). You shall not * disclose such Confidential Information and shall use it only in * accordance with the terms of the license agreement you entered into * with Alibaba.com. */ package com.alibaba.doris.admin.service.config.service.impl; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.alibaba.doris.admin.dataobject.RouterConfigInstanceDO; import com.alibaba.doris.admin.monitor.MonitorEnum; import com.alibaba.doris.admin.monitor.SystemLogMonitor; import com.alibaba.doris.admin.service.common.AdminServiceAction; import com.alibaba.doris.admin.service.common.route.DorisConfigServiceException; import com.alibaba.doris.admin.service.common.route.RouteConfigProcessor; import com.alibaba.doris.common.AdminServiceConstants; import com.alibaba.doris.common.MonitorWarnConstants; import com.alibaba.doris.common.RouteConfigInstance; import com.alibaba.doris.common.StoreNode; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; /** * TODO Comment of AdminRouteConfigAction * * @author mian.hem */ public class AdminRouteConfigAction implements AdminServiceAction { private static final Log logger = LogFactory .getLog(AdminRouteConfigAction.class); private static AdminRouteConfigAction instance = new AdminRouteConfigAction(); private RouteConfigProcessor configProcessor = RouteConfigProcessor.getInstance(); private AdminRouteConfigAction() { super(); } public static AdminRouteConfigAction getInstance() { return instance; } public String execute(Map<String, String> params) { String configVersion = params.get(AdminServiceConstants.CONFIG_VERSION); boolean noVersion = false; if (StringUtils.isEmpty(configVersion) || !StringUtils.isNumeric(configVersion)) { noVersion = true; } if (noVersion) { if (logger.isInfoEnabled()) { logger.info("there is no route config version specified. Using 0 as default."); } configVersion = "0"; } Long version = Long.valueOf(configVersion); RouterConfigInstanceDO configInstanceDO = null; try { if (version == 0) { configProcessor.refresh(); } configInstanceDO = configProcessor.getCurrentConfigInstanceDo(); } catch (DorisConfigServiceException e) { logger.error("Cannot get valida route configuration", e); SystemLogMonitor.error(MonitorEnum.ROUTER, MonitorWarnConstants.RE_GEN_ROUTE_FAILED, e); } if (configInstanceDO != null && version == configInstanceDO.getId()) { //相等, 没有变更 configInstanceDO = null; } if (configInstanceDO != null && version > configInstanceDO.getId()) { try { // 如果传进来的版本号比Admin (configProcessor#urrentConfigInstanceDo)中 // 持有高, 那么刷数据库:load数据库中最新的路由配置 configProcessor.refreshWithDbLatest(); RouterConfigInstanceDO refreshedConfigInstanceDO = configProcessor .getCurrentConfigInstanceDo(); if (refreshedConfigInstanceDO.getId() > version) { configInstanceDO = refreshedConfigInstanceDO; } else if (refreshedConfigInstanceDO.getId() == version){ //客户端已经拥有最新版本, 不需要更新路由 configInstanceDO = null; } else{ // 告警:[重要]客户端传进来的版本号比数据库中最新的还要大,返回admin中的版本 configInstanceDO = refreshedConfigInstanceDO; logger.error("Client route version is greater than the version of admin and db; client version:" + version + ", admin version:" + configInstanceDO.getId()); SystemLogMonitor.error(MonitorEnum.ROUTER, "Clietn route version is greater than admin"); } } catch (DorisConfigServiceException e) { logger.error("Cannot get valida route configuration", e); SystemLogMonitor.error(MonitorEnum.ROUTER, MonitorWarnConstants.RE_GEN_ROUTE_FAILED, e); } } RouteConfigInstance routeConfigInstance = null; if (configInstanceDO != null) { routeConfigInstance = new RouteConfigInstance(); routeConfigInstance.setVersion(configInstanceDO.getId()); List<StoreNode> storeNodes = JSON.parseArray(configInstanceDO.getContent(), StoreNode.class); routeConfigInstance.setStoreNodes(storeNodes); } return JSON.toJSONString(routeConfigInstance, SerializerFeature.WriteEnumUsingToString); } }