/** * Tencent is pleased to support the open source community by making MSEC available. * * Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved. * * Licensed under the GNU General Public 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 * * https://opensource.org/licenses/GPL-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 beans.service; import beans.dbaccess.ClusterInfo; import beans.dbaccess.ServerInfo; import beans.request.QuerySecondLevelServiceDetailRequest; import beans.response.QuerySecondLevelServiceDetailResponse; import msec.org.DBUtil; import msec.org.JsonRPCHandler; import org.apache.log4j.Logger; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; /** * Created by Administrator on 2016/1/25. * 查询列表 */ public class QuerySecondLevelServiceDetail extends JsonRPCHandler { public QuerySecondLevelServiceDetailResponse exec(QuerySecondLevelServiceDetailRequest request) { Logger logger = Logger.getLogger(QuerySecondLevelServiceDetail.class); QuerySecondLevelServiceDetailResponse resp = new QuerySecondLevelServiceDetailResponse(); String result = checkIdentity(); if (!result.equals("success")) { resp.setStatus(99); resp.setMessage(result); return resp; } DBUtil util = new DBUtil(); if (util.getConnection() == null) { resp.setStatus(100); resp.setMessage("db connect failed!"); return resp; } List<ServerInfo> serverList ; ClusterInfo cluster_info; try { String sql = "select copy_num, memory_per_instance, plan_id from t_second_level_service where first_level_service_name=? and second_level_service_name=?"; List<Object> params = new ArrayList<Object>(); params.add(request.getFirst_level_service_name()); params.add(request.getSecond_level_service_name()); cluster_info = util.findSimpleRefResult(sql, params, ClusterInfo.class); if(!cluster_info.getPlan_id().isEmpty()) { ArrayList<ServerInfo> planList; sql = "select ip, port, set_id, group_id, memory, master, status, operation, recover_host from t_install_plan where plan_id = ? order by group_id asc, master desc"; params.clear(); params.add(cluster_info.getPlan_id()); planList = util.findMoreRefResult(sql, params, ServerInfo.class); String operation = ""; int server_status = 0; //0:"ok", 1: "in progress" or 2: "error" for(ServerInfo server: planList ) { operation = server.getOperation(); int status = 0; if(!server.getStatus().startsWith("Done")) { if(server.getStatus().startsWith("[ERROR]")) { status = 2; } else status = 1; } server_status = Math.max(status, server_status); } if(server_status != 1) {//not in progress if(server_status == 0) {//ok, remove service_info first...TODO, needs to judge automatically if(operation.equals("add")) { for (ServerInfo server : planList) { sql = "insert into t_service_info(first_level_service_name, second_level_service_name, ip, port, set_id, group_id, memory, master) values(?,?,?,?,?,?,?,?)"; params.clear(); params.add(request.getFirst_level_service_name()); params.add(request.getSecond_level_service_name()); params.add(server.getIp()); params.add(server.getPort()); params.add(server.getSet_id()); params.add(server.getGroup_id()); params.add(server.getMemory()); params.add(server.isMaster()); try { int addNum = util.updateByPreparedStatement(sql, params); if (addNum < 0) { resp.setMessage("failed to insert table"); resp.setStatus(100); return resp; } } catch (SQLException e) { resp.setMessage("add record failed:" + e.toString()); resp.setStatus(100); e.printStackTrace(); return resp; } } } else if(operation.equals("del")) { sql = "delete from t_service_info where first_level_service_name=? and second_level_service_name=? and set_id=?"; params.clear(); params.add(request.getFirst_level_service_name()); params.add(request.getSecond_level_service_name()); params.add(planList.get(0).getSet_id()); int delNum = util.updateByPreparedStatement(sql, params); if (delNum < 0) { resp.setMessage("failed to delete table"); resp.setStatus(100); return resp; } } else if(operation.equals("rec")) { String[] ip_pair = planList.get(0).getRecover_host().split(":"); sql = "update t_service_info set ip=?, port=? where first_level_service_name=? and second_level_service_name=? and ip=? and port=?"; params.clear(); params.add(planList.get(0).getIp()); params.add(planList.get(0).getPort()); params.add(request.getFirst_level_service_name()); params.add(request.getSecond_level_service_name()); params.add(ip_pair[0]); params.add(Integer.parseInt(ip_pair[1])); int addNum = util.updateByPreparedStatement(sql, params); if (addNum < 0) { resp.setMessage("failed to update table"); resp.setStatus(100); return resp; } } } sql = "update t_second_level_service set plan_id=? where first_level_service_name=? and second_level_service_name=?"; params.clear(); params.add(""); params.add(request.getFirst_level_service_name()); params.add(request.getSecond_level_service_name()); int addNum = util.updateByPreparedStatement(sql, params); if (addNum < 0) { resp.setMessage("failed to update table"); resp.setStatus(100); return resp; } cluster_info.setPlan_id(""); } } sql = "select ip, port, set_id, group_id, memory, master from t_service_info where first_level_service_name=? and second_level_service_name=? order by group_id asc, master desc"; params.clear(); params.add(request.getFirst_level_service_name()); params.add(request.getSecond_level_service_name()); serverList = util.findMoreRefResult(sql, params, ServerInfo.class); if(serverList.size() > 0 && cluster_info.getPlan_id().isEmpty()) { //working plan will cause config inconsistent... HashMap<String, ServerInfo> server_map = new HashMap<>(); for (ServerInfo server : serverList) { server_map.put(server.getIp() + ":" + server.getPort(), server); } JedisHelper helper = new JedisHelper(server_map, request.getFirst_level_service_name(), request.getSecond_level_service_name(), cluster_info); helper.CheckStatusDetail(); if(!helper.isOK()) { resp.setStatus(101); resp.setMessage(helper.getError_message()); return resp; } if(helper.isChanged()) { serverList = util.findMoreRefResult(sql, params, ServerInfo.class); } } } catch (Exception e) { resp.setStatus(100); resp.setMessage("db query exception!"); e.printStackTrace(); return resp; } finally { util.releaseConn(); } resp.setServers((ArrayList<ServerInfo>)serverList); resp.setCluster_info(cluster_info); resp.setMessage("success"); resp.setStatus(0); return resp; } }