package com.alibaba.doris.dataserver.filter;
import com.alibaba.doris.common.AdminServiceConstants;
import com.alibaba.doris.common.config.ConfigManager;
import com.alibaba.doris.common.configer.RouteTableConfiger;
import com.alibaba.doris.common.route.RouteTable;
import com.alibaba.doris.dataserver.Module;
import com.alibaba.doris.dataserver.ModuleContext;
import com.alibaba.doris.dataserver.action.data.ActionData;
import com.alibaba.doris.dataserver.action.data.BaseActionData;
import com.alibaba.doris.dataserver.action.data.ErrorActionData;
import com.alibaba.doris.dataserver.config.ModuleConstances;
import com.alibaba.doris.dataserver.core.Request;
import com.alibaba.doris.dataserver.core.RequestFilter;
import com.alibaba.doris.dataserver.core.RequestFilterChian;
import com.alibaba.doris.dataserver.core.Response;
/**
* @author ajun Email:jack.yuj@alibaba-inc.com
*/
public class RouteVersionCheckFilter implements RequestFilter {
public void doFilter(Request request, Response response, RequestFilterChian filterChain) {
ActionData ad = request.getActionData();
if (null != ad && ad instanceof BaseActionData) {
BaseActionData bad = (BaseActionData) ad;
long routeVersion = bad.getRouteVersion();
// 当client带了有效的路由版本号才比较,否则忽略版本号比较功能。
if (routeVersion > 0) {
if (null == routeTableConfiger) {
synchronized (this) {
if (null == routeTableConfiger) {
Module module = request.getApplicationContext().getModuleByName(
ModuleConstances.ADMIN_CONFIGURE_MODULE);
ModuleContext mdContext = module.getModuleContext();
if (null != mdContext) {
routeTableConfiger = (RouteTableConfiger) mdContext.getAttribute("routeTableConfiger");
configManager = (ConfigManager) mdContext.getAttribute("configManager");
}
}
}
}
if (routeTableConfiger != null) {
RouteTable rt = routeTableConfiger.getRouteTable();
if (null != rt && routeVersion < rt.getVersion()) {
// 如果client的路由版本号过期,返回调用异常。
ErrorActionData error = new ErrorActionData(ErrorActionData.VERSION_OUT_OF_DATE);
// 设置server端的路由版本号
error.setErrorMessage(configManager.getCachedConfig(AdminServiceConstants.ROUTE_CONFIG_ACTION));
response.write(error);
// 跳过后续filter的执行。
return;
}
}
}
}
filterChain.doFilter(request, response);
}
private RouteTableConfiger routeTableConfiger;
private ConfigManager configManager;
}