From ca09eb07539c74b2b502b91ea93664556dbb9c36 Mon Sep 17 00:00:00 2001 From: fanqq Date: Mon, 12 Oct 2015 16:46:42 +0800 Subject: [PATCH] add pull in/out member --- .../zeus/executor/impl/TaskExecutorImpl.java | 92 +++++++++++--- .../zeus/restful/resource/ServerResource.java | 113 ++++++++++++++++-- .../service/build/impl/BuildServiceImpl.java | 3 +- .../service/status/GroupStatusService.java | 2 +- .../zeus/service/status/StatusOffset.java | 10 ++ .../zeus/service/status/StatusService.java | 25 ++-- .../status/impl/GroupStatusServiceImpl.java | 22 ++-- .../status/impl/StatusServiceImpl.java | 84 +++++++++++-- .../service/task/constant/TaskOpsType.java | 1 + .../META-INF/dal/jdbc/core-codegen.xml | 10 +- .../META-INF/dal/jdbc/core-status.xml | 59 +++++++++ .../META-INF/dal/model/status-codegen.xml | 1 + .../resources/com/ctrip/zeus/model/status.xml | 2 + 13 files changed, 366 insertions(+), 58 deletions(-) create mode 100644 src/main/java/com/ctrip/zeus/service/status/StatusOffset.java diff --git a/src/main/java/com/ctrip/zeus/executor/impl/TaskExecutorImpl.java b/src/main/java/com/ctrip/zeus/executor/impl/TaskExecutorImpl.java index 0f0578c5..a7071f4e 100644 --- a/src/main/java/com/ctrip/zeus/executor/impl/TaskExecutorImpl.java +++ b/src/main/java/com/ctrip/zeus/executor/impl/TaskExecutorImpl.java @@ -14,6 +14,7 @@ import com.ctrip.zeus.service.model.ArchiveService; import com.ctrip.zeus.service.model.GroupRepository; import com.ctrip.zeus.service.model.SlbRepository; import com.ctrip.zeus.service.nginx.NginxService; +import com.ctrip.zeus.service.status.StatusOffset; import com.ctrip.zeus.service.status.StatusService; import com.ctrip.zeus.service.task.TaskService; import com.ctrip.zeus.service.task.constant.TaskOpsType; @@ -62,6 +63,7 @@ public class TaskExecutorImpl implements TaskExecutor { private HashMap deactivateGroupOps = new HashMap<>(); private HashMap activateSlbOps = new HashMap<>(); private HashMap> memberOps = new HashMap<>(); + private HashMap> pullMemberOps = new HashMap<>(); private List tasks = null; @@ -235,11 +237,17 @@ public class TaskExecutorImpl implements TaskExecutor { } String [] ips = task.getIpList().split(";"); ListipList = Arrays.asList(ips); - if (task.getUp()){ - statusService.upMember(slbId,task.getGroupId(), ipList); - }else { - statusService.downMember(slbId,task.getGroupId(), ipList); + statusService.updateStatus(slbId,task.getGroupId(),ipList,StatusOffset.MEMBER_OPS,task.getUp()); + } + } + for (List taskList :pullMemberOps.values()){ + for (OpsTask task : taskList){ + if (!task.getStatus().equals(TaskStatus.DOING)){ + continue; } + String [] ips = task.getIpList().split(";"); + ListipList = Arrays.asList(ips); + statusService.updateStatus(slbId,task.getGroupId(),ipList,StatusOffset.PULL_OPS,task.getUp()); } } }catch (Exception e){ @@ -269,7 +277,8 @@ public class TaskExecutorImpl implements TaskExecutor { } private Set getAllUpGroupServers(Long slbId,Map groups, HashMap activatingGroups) throws Exception { - Set allUpGroupServers = statusService.findAllUpGroupServersBySlbId(slbId); +// Set allUpGroupServers = statusService.findAllUpGroupServersBySlbId(slbId); + Set memberOpsUpGroupServers = statusService.findAllGroupServersBySlbIdAndStatusOffset(slbId, StatusOffset.MEMBER_OPS); Set tmpid = memberOps.keySet(); for (Long gid : tmpid){ Group groupTmp = activatingGroups.get(gid); @@ -287,18 +296,48 @@ public class TaskExecutorImpl implements TaskExecutor { } if (opsTask.getUp()){ for (String ip : ips){ - allUpGroupServers.add(slbId+"_"+gvs.getVirtualServer().getId()+"_"+gid+"_"+ip); + memberOpsUpGroupServers.add(slbId+"_"+gvs.getVirtualServer().getId()+"_"+gid+"_"+ip); } }else { for (String ip : ips){ - allUpGroupServers.remove(slbId + "_" + gvs.getVirtualServer().getId() + "_" + gid + "_" + ip); + memberOpsUpGroupServers.remove(slbId + "_" + gvs.getVirtualServer().getId() + "_" + gid + "_" + ip); } } } } - } - return allUpGroupServers; + Set pullMemberOpsUpGroupServers = statusService.findAllGroupServersBySlbIdAndStatusOffset(slbId,StatusOffset.PULL_OPS); + tmpid = pullMemberOps.keySet(); + for (Long gid : tmpid){ + Group groupTmp = activatingGroups.get(gid); + if (groupTmp==null){ + groupTmp = groups.get(gid); + } + List taskList = pullMemberOps.get(gid); + for (OpsTask opsTask : taskList) + { + String ipList =opsTask.getIpList(); + String[]ips = ipList.split(";"); + for (GroupVirtualServer gvs : groupTmp.getGroupVirtualServers()){ + if (!gvs.getVirtualServer().getSlbId().equals(slbId)){ + continue; + } + if (opsTask.getUp()){ + for (String ip : ips){ + pullMemberOpsUpGroupServers.add(slbId+"_"+gvs.getVirtualServer().getId()+"_"+gid+"_"+ip); + } + }else { + for (String ip : ips){ + pullMemberOpsUpGroupServers.remove(slbId + "_" + gvs.getVirtualServer().getId() + "_" + gid + "_" + ip); + } + } + } + } + } + Set result = new HashSet<>(); + result.addAll(memberOpsUpGroupServers); + result.retainAll(pullMemberOpsUpGroupServers); + return result; } private Set getAllDownServer() throws Exception{ @@ -322,6 +361,11 @@ public class TaskExecutorImpl implements TaskExecutor { result.add(gid); } } + for (Long gid : pullMemberOps.keySet()){ + if (pullMemberOps.get(gid).get(0).getStatus().equals(TaskStatus.DOING)){ + result.add(gid); + } + } for (String ip : serverOps.keySet()){ ListgroupIds = serverGroupService.findAllByIp(ip); result.addAll(groupIds); @@ -340,16 +384,25 @@ public class TaskExecutorImpl implements TaskExecutor { for(OpsTask opsTask : tasksList){ String ips = opsTask.getIpList(); String[]iplist = ips.split(";"); - if (opsTask.getUp()){ - statusService.upMember(slbId , groupId, Arrays.asList(iplist)); - }else { - statusService.downMember(slbId ,groupId, Arrays.asList(iplist)); - } + statusService.updateStatus(slbId , groupId, Arrays.asList(iplist),StatusOffset.MEMBER_OPS,opsTask.getUp()); opsTask.setStatus(TaskStatus.SUCCESS); } memberOps.remove(groupId); } } + Set pullMemberGroups = pullMemberOps.keySet(); + for (Long groupId : pullMemberGroups){ + if (!activateService.isGroupActivated(groupId,slbId)){ + List tasksList = pullMemberOps.get(groupId); + for(OpsTask opsTask : tasksList){ + String ips = opsTask.getIpList(); + String[]iplist = ips.split(";"); + statusService.updateStatus(slbId , groupId, Arrays.asList(iplist),StatusOffset.PULL_OPS,opsTask.getUp()); + opsTask.setStatus(TaskStatus.SUCCESS); + } + pullMemberOps.remove(groupId); + } + } }catch (Exception e){ logger.error("PreMemberOperation Fail!",e); } @@ -402,6 +455,7 @@ public class TaskExecutorImpl implements TaskExecutor { serverOps.clear(); memberOps.clear(); deactivateGroupOps.clear(); + pullMemberOps.clear(); for (OpsTask task : tasks){ task.setStatus(TaskStatus.DOING); //Activate group @@ -425,6 +479,16 @@ public class TaskExecutorImpl implements TaskExecutor { } taskList.add(task); } + //tars member ops + if (task.getOpsType().equals(TaskOpsType.PULL_MEMBER_OPS)){ + List taskList = pullMemberOps.get(task.getGroupId()); + if (taskList==null){ + taskList = new ArrayList<>(); + pullMemberOps.put(task.getGroupId(),taskList); + } + taskList.add(task); + } + //deactivate if (task.getOpsType().equals(TaskOpsType.DEACTIVATE_GROUP)){ deactivateGroupOps.put(task.getGroupId(),task); } diff --git a/src/main/java/com/ctrip/zeus/restful/resource/ServerResource.java b/src/main/java/com/ctrip/zeus/restful/resource/ServerResource.java index 4536f0f2..ba48d69a 100644 --- a/src/main/java/com/ctrip/zeus/restful/resource/ServerResource.java +++ b/src/main/java/com/ctrip/zeus/restful/resource/ServerResource.java @@ -1,6 +1,8 @@ package com.ctrip.zeus.restful.resource; import com.ctrip.zeus.auth.Authorize; +import com.ctrip.zeus.dal.core.StatusGroupServerDao; +import com.ctrip.zeus.dal.core.StatusGroupServerDo; import com.ctrip.zeus.exceptions.ValidationException; import com.ctrip.zeus.executor.TaskManager; import com.ctrip.zeus.lock.DbLockFactory; @@ -14,6 +16,8 @@ import com.ctrip.zeus.service.build.NginxConfService; import com.ctrip.zeus.service.model.GroupRepository; import com.ctrip.zeus.service.model.SlbRepository; import com.ctrip.zeus.service.nginx.NginxService; +import com.ctrip.zeus.service.query.GroupCriteriaQuery; +import com.ctrip.zeus.service.query.SlbCriteriaQuery; import com.ctrip.zeus.service.status.GroupStatusService; import com.ctrip.zeus.service.status.StatusService; import com.ctrip.zeus.service.task.TaskService; @@ -76,10 +80,21 @@ public class ServerResource { private TaskManager taskManager; @Resource private ActiveConfService activeConfService; - + @Resource + private SlbCriteriaQuery slbCriteriaQuery; + @Resource + private GroupCriteriaQuery groupCriteriaQuery; + @Resource + private StatusGroupServerDao statusGroupServerDao; private static DynamicIntProperty lockTimeout = DynamicPropertyFactory.getInstance().getIntProperty("lock.timeout", 5000); + @GET + @Path("/clean") + public Response clean(@Context HttpServletRequest request,@Context HttpHeaders hh, @QueryParam("ip") String ip) throws Exception{ + statusGroupServerDao.deleteByUp(new StatusGroupServerDo().setUp(false)); + return Response.status(200).entity("Suc").type(MediaType.APPLICATION_JSON).build(); + } @GET @Path("/upServer") @@ -156,7 +171,7 @@ public class ServerResource { { _groupId = groupId; }else if (groupName != null){ - _groupId = groupRepository.get(groupName).getId(); + _groupId = groupCriteriaQuery.queryByName(groupName); } if (null == _groupId) { @@ -174,7 +189,7 @@ public class ServerResource { { _ips.addAll(ips); } - return memberOps(hh, _groupId, _ips , true); + return memberOps(hh, _groupId, _ips , true,TaskOpsType.MEMBER_OPS); } @GET @@ -194,7 +209,7 @@ public class ServerResource { { _groupId = groupId; }else if (groupName != null){ - _groupId = groupRepository.get(groupName).getId(); + _groupId = groupCriteriaQuery.queryByName(groupName); } if (null == _groupId) { @@ -213,26 +228,102 @@ public class ServerResource { _ips.addAll(ips); } - return memberOps(hh, _groupId, _ips,false); + return memberOps(hh, _groupId, _ips,false,TaskOpsType.MEMBER_OPS); } - private Response memberOps(HttpHeaders hh,Long groupId,List ips,boolean up)throws Exception{ + @GET + @Path("/pullIn") + @Authorize(name="upDownMember") + public Response pullIn(@Context HttpServletRequest request, + @Context HttpHeaders hh, + @QueryParam("groupId") Long groupId, + @QueryParam("groupName") String groupName, + @QueryParam("ip") List ips, + @QueryParam("batch") Boolean batch)throws Exception + { + Long _groupId = null; + List _ips = new ArrayList<>(); + if (groupId != null) + { + _groupId = groupId; + }else if (groupName != null){ + _groupId = groupCriteriaQuery.queryByName(groupName); + } + if (null == _groupId) + { + throw new ValidationException("Group Id or Name not found!"); + } + if (null != batch && batch.equals(true)) + { + Group gp = groupRepository.getById(_groupId); + List servers = gp.getGroupServers(); + for (GroupServer gs : servers) + { + _ips.add(gs.getIp()); + } + }else if (ips != null) + { + _ips.addAll(ips); + } + return memberOps(hh, _groupId, _ips , true,TaskOpsType.PULL_MEMBER_OPS); + } + + @GET + @Path("/pullOut") + @Authorize(name="upDownMember") + public Response pullOut(@Context HttpServletRequest request, + @Context HttpHeaders hh, + @QueryParam("groupId") Long groupId, + @QueryParam("groupName") String groupName, + @QueryParam("ip") List ips, + @QueryParam("batch") Boolean batch)throws Exception + { + Long _groupId = null; + List _ips = new ArrayList<>(); + + if (groupId != null) + { + _groupId = groupId; + }else if (groupName != null){ + _groupId = groupCriteriaQuery.queryByName(groupName); + } + if (null == _groupId) + { + throw new ValidationException("Group Id or Name not found!"); + } + if (null != batch && batch.equals(true)) + { + Group gp = groupRepository.getById(_groupId); + List servers = gp.getGroupServers(); + for (GroupServer gs : servers) + { + _ips.add(gs.getIp()); + } + }else if (ips != null) + { + _ips.addAll(ips); + } + + return memberOps(hh, _groupId, _ips,false,TaskOpsType.PULL_MEMBER_OPS); + } + + + private Response memberOps(HttpHeaders hh,Long groupId,List ips,boolean up,String type)throws Exception{ StringBuilder sb = new StringBuilder(); for (String ip : ips){ sb.append(ip).append(";"); } Set slbIds = activeConfService.getSlbIdsByGroupId(groupId); - List slbs = slbRepository.listByGroups(new Long[]{groupId}); - for (Slb slb : slbs){ - slbIds.add(slb.getId()); - } + Set slbs = slbCriteriaQuery.queryByGroups(new Long[]{groupId}); + slbIds.addAll(slbs); + Listtasks = new ArrayList<>(); for (Long slbId : slbIds){ OpsTask task = new OpsTask(); task.setTargetSlbId(slbId); - task.setOpsType(TaskOpsType.MEMBER_OPS); + task.setOpsType(type); task.setUp(up); task.setGroupId(groupId); task.setIpList(sb.toString()); diff --git a/src/main/java/com/ctrip/zeus/service/build/impl/BuildServiceImpl.java b/src/main/java/com/ctrip/zeus/service/build/impl/BuildServiceImpl.java index c1be3fd6..e97def3e 100644 --- a/src/main/java/com/ctrip/zeus/service/build/impl/BuildServiceImpl.java +++ b/src/main/java/com/ctrip/zeus/service/build/impl/BuildServiceImpl.java @@ -75,7 +75,8 @@ public class BuildServiceImpl implements BuildService { List l = activeConfService.getConfGroupActiveContentByGroupIds(groupList.toArray(new Long[]{})); for (String content : l ){ Group tmpGroup = DefaultSaxParser.parseEntity(Group.class, content); - if (tmpGroup!=null&&!activatingGroups.containsKey(tmpGroup.getId())) { +// if (tmpGroup!=null&&!activatingGroups.containsKey(tmpGroup.getId())) { + if (tmpGroup!=null) { groups.add(tmpGroup); } } diff --git a/src/main/java/com/ctrip/zeus/service/status/GroupStatusService.java b/src/main/java/com/ctrip/zeus/service/status/GroupStatusService.java index d5d92b3f..cd766999 100644 --- a/src/main/java/com/ctrip/zeus/service/status/GroupStatusService.java +++ b/src/main/java/com/ctrip/zeus/service/status/GroupStatusService.java @@ -37,6 +37,6 @@ public interface GroupStatusService { GroupStatusList getLocalGroupStatus(List groupId , Long slbId) throws Exception; - GroupServerStatus getGroupServerStatus(Long groupId, Long slbId, String ip, Integer port , Set allDownServers,Set allUpGroupServerInSlb,Group group) throws Exception; + GroupServerStatus getGroupServerStatus(Long groupId, Long slbId, String ip, Integer port , Set allDownServers,Set allUpGroupServerInSlb,Set allPullInGroupServerInSlb,Group group) throws Exception; } diff --git a/src/main/java/com/ctrip/zeus/service/status/StatusOffset.java b/src/main/java/com/ctrip/zeus/service/status/StatusOffset.java new file mode 100644 index 00000000..b1a4c4d5 --- /dev/null +++ b/src/main/java/com/ctrip/zeus/service/status/StatusOffset.java @@ -0,0 +1,10 @@ +package com.ctrip.zeus.service.status; + +/** + * Created by fanqq on 2015/10/10. + */ +public class StatusOffset { + public static final int MEMBER_OPS = 0 ; + public static final int PULL_OPS = 1 ; + +} diff --git a/src/main/java/com/ctrip/zeus/service/status/StatusService.java b/src/main/java/com/ctrip/zeus/service/status/StatusService.java index b5a1adca..3d84e749 100644 --- a/src/main/java/com/ctrip/zeus/service/status/StatusService.java +++ b/src/main/java/com/ctrip/zeus/service/status/StatusService.java @@ -19,14 +19,6 @@ public interface StatusService extends Repository { */ Set findAllDownServers() throws Exception; - /** - * get all down app servers by slbname - * @param slbId the slb id - * @return app server ip list - * @throws Exception - */ - Set findAllDownGroupServersBySlbId(Long slbId) throws Exception; - /** * get all up app servers by slbId * @param slbId the slb id @@ -34,6 +26,13 @@ public interface StatusService extends Repository { * @throws Exception */ Set findAllUpGroupServersBySlbId(Long slbId) throws Exception; + /** + * get group servers by slbId and status offset + * @param slbId the slb id + * @return app server ip list + * @throws Exception + */ + Set findAllGroupServersBySlbIdAndStatusOffset(Long slbId , int offset) throws Exception; /** * up server by app server ip @@ -67,6 +66,16 @@ public interface StatusService extends Repository { * @throws Exception */ void downMember(Long slbId ,Long groupId, List ips)throws Exception; + /** + * update status by group server ip and slbId and group id + * @param ips the group server ips + * @param groupId group id + * @param offset offset [0-30] + * @param status status enable = true , disable = false + * @return + * @throws Exception + */ + void updateStatus(Long slbId ,Long groupId, List ips , int offset , boolean status)throws Exception; /** * get App server status by app name and slbname and virtual server ip diff --git a/src/main/java/com/ctrip/zeus/service/status/impl/GroupStatusServiceImpl.java b/src/main/java/com/ctrip/zeus/service/status/impl/GroupStatusServiceImpl.java index ac0bd0d5..423e5c3a 100644 --- a/src/main/java/com/ctrip/zeus/service/status/impl/GroupStatusServiceImpl.java +++ b/src/main/java/com/ctrip/zeus/service/status/impl/GroupStatusServiceImpl.java @@ -10,6 +10,7 @@ import com.ctrip.zeus.service.activate.ActiveConfService; import com.ctrip.zeus.service.model.GroupRepository; import com.ctrip.zeus.service.model.SlbRepository; import com.ctrip.zeus.service.status.GroupStatusService; +import com.ctrip.zeus.service.status.StatusOffset; import com.ctrip.zeus.service.status.StatusService; import com.ctrip.zeus.status.entity.GroupServerStatus; import com.ctrip.zeus.status.entity.GroupStatus; @@ -104,8 +105,9 @@ public class GroupStatusServiceImpl implements GroupStatusService { Slb slb = slbRepository.getById(slbId); AssertUtils.assertNotNull(slb, "slb Id not found!"); List groups = groupRepository.list(groupIds.toArray(new Long[]{})); - HashMap isActivated = activateService.isGroupsActivated(groupIds.toArray(new Long[]{}),slbId); - Set allUpGroupServerInSlb = statusService.findAllUpGroupServersBySlbId(slbId); + HashMap isActivated = activateService.isGroupsActivated(groupIds.toArray(new Long[]{}), slbId); + Set allUpGroupServerInSlb = statusService.findAllGroupServersBySlbIdAndStatusOffset(slbId, StatusOffset.MEMBER_OPS); + Set allPullInGroupServerInSlb = statusService.findAllGroupServersBySlbIdAndStatusOffset(slbId, StatusOffset.PULL_OPS); Set allDownServers = statusService.findAllDownServers(); for (Group group : groups) @@ -140,7 +142,7 @@ public class GroupStatusServiceImpl implements GroupStatusService { ips.add(gs.getIp()); } for (String ip : ipPort.keySet()) { - GroupServerStatus serverStatus = getGroupServerStatus(groupId, slbId, ip, ipPort.get(ip),allDownServers,allUpGroupServerInSlb,group); + GroupServerStatus serverStatus = getGroupServerStatus(groupId, slbId, ip, ipPort.get(ip),allDownServers,allUpGroupServerInSlb,allPullInGroupServerInSlb,group); if (activatedIps.contains(ip)&&ips.contains(ip)){ serverStatus.setDiscription("Activated"); }else if (!activatedIps.contains(ip)&&ips.contains(ip)){ @@ -180,7 +182,7 @@ public class GroupStatusServiceImpl implements GroupStatusService { @Override - public GroupServerStatus getGroupServerStatus(Long groupId, Long slbId, String ip, Integer port , Set allDownServers,Set allUpGroupServerInSlb,Group group) throws Exception { + public GroupServerStatus getGroupServerStatus(Long groupId, Long slbId, String ip, Integer port , Set allDownServers,Set allUpGroupServerInSlb,Set allPullInGroupServerInSlb ,Group group) throws Exception { GroupServerStatus groupServerStatus = new GroupServerStatus(); groupServerStatus.setIp(ip); @@ -189,11 +191,13 @@ public class GroupStatusServiceImpl implements GroupStatusService { sb.append(slbId).append("_").append(group.getGroupVirtualServers().get(0).getVirtualServer().getId()).append("_").append(groupId).append("_").append(ip); boolean memberUp = allUpGroupServerInSlb.contains(sb.toString()); + boolean pullIn = allPullInGroupServerInSlb.contains(sb.toString()); boolean serverUp = !allDownServers.contains(ip); - boolean backendUp = getUpstreamStatus(groupId,ip,memberUp,serverUp); + boolean backendUp = getUpstreamStatus(groupId,ip,memberUp,serverUp,pullIn); groupServerStatus.setServer(serverUp); groupServerStatus.setMember(memberUp); + groupServerStatus.setPull(pullIn); groupServerStatus.setUp(backendUp); return groupServerStatus; @@ -201,7 +205,7 @@ public class GroupStatusServiceImpl implements GroupStatusService { //TODO: should include port to get accurate upstream - private boolean getUpstreamStatus(Long groupId, String ip , boolean memberUp , boolean serverUp) throws Exception { + private boolean getUpstreamStatus(Long groupId, String ip , boolean memberUp , boolean serverUp ,boolean pullIn) throws Exception { UpstreamStatus upstreamStatus = LocalClient.getInstance().getUpstreamStatus(); List servers = upstreamStatus.getServers().getServer(); String upstreamNameEndWith = "_"+groupId; @@ -215,9 +219,9 @@ public class GroupStatusServiceImpl implements GroupStatusService { if (ipPorts.length == 2){ if (ipPorts[0].equals(ip)){ boolean flag = "up".equalsIgnoreCase(server.getStatus()); - if (!(memberUp&&serverUp)&&flag) + if (!(memberUp&&serverUp&&pullIn)&&flag) { - LOGGER.error("nginx status api return status while memberUp or serverUp is down! ip:"+ip+" groupId:"+groupId); + LOGGER.error("nginx status api return status while memberUp or serverUp or pull is down! ip:"+ip+" groupId:"+groupId); } return flag; } @@ -225,6 +229,6 @@ public class GroupStatusServiceImpl implements GroupStatusService { } //Not found status from nginx , ip is mark down or health check is disable // return memberUp&&serverUp - return memberUp&&serverUp; + return memberUp&&serverUp&&pullIn; } } diff --git a/src/main/java/com/ctrip/zeus/service/status/impl/StatusServiceImpl.java b/src/main/java/com/ctrip/zeus/service/status/impl/StatusServiceImpl.java index 8f1dc0f0..e574e052 100644 --- a/src/main/java/com/ctrip/zeus/service/status/impl/StatusServiceImpl.java +++ b/src/main/java/com/ctrip/zeus/service/status/impl/StatusServiceImpl.java @@ -35,6 +35,8 @@ public class StatusServiceImpl implements StatusService { private ActivateService activateService; @Resource private GroupRepository groupRepository; + @Resource + private StatusGroupServerDao statusGroupServerDao; private Logger logger = LoggerFactory.getLogger(StatusServiceImpl.class); @@ -49,26 +51,34 @@ public class StatusServiceImpl implements StatusService { return allDownIps; } - - @Override - public Set findAllDownGroupServersBySlbId(Long slbId) throws Exception { - Set allDownAppServers = new HashSet<>(); - List allDownAppServerList = statusGroupServerService.listAllDownBySlbId(slbId); - for (StatusGroupServerDo d : allDownAppServerList) { - allDownAppServers.add(d.getSlbId() + "_" + d.getSlbVirtualServerId() + "_" + d.getGroupId() + "_" + d.getIp()); - } - return allDownAppServers; - } + /* + * group server is up while status is 0 . + * */ @Override public Set findAllUpGroupServersBySlbId(Long slbId) throws Exception { Set allUpAppServers = new HashSet<>(); - List allUpAppServerList = statusGroupServerService.listAllUpBySlbId(slbId); + + List allUpAppServerList = statusGroupServerDao.findAllBySlbIdAndStatus( slbId , 0 , StatusGroupServerEntity.READSET_FULL); for (StatusGroupServerDo d : allUpAppServerList) { allUpAppServers.add(d.getSlbId() + "_" + d.getSlbVirtualServerId() + "_" + d.getGroupId() + "_" + d.getIp()); } return allUpAppServers; } + @Override + public Set findAllGroupServersBySlbIdAndStatusOffset(Long slbId, int offset) throws Exception { + Set allUpAppServers = new HashSet<>(); + List allUpAppServerList = statusGroupServerDao.findAllBySlbId(slbId,StatusGroupServerEntity.READSET_FULL); + int tmp = ~(1 << offset); + for (StatusGroupServerDo statusGroupServerDo : allUpAppServerList){ + int status = statusGroupServerDo.getStatus(); + if (tmp == (status|tmp)){ + allUpAppServers.add(statusGroupServerDo.getSlbId() + "_" + statusGroupServerDo.getSlbVirtualServerId() + "_" + statusGroupServerDo.getGroupId() + "_" + statusGroupServerDo.getIp()); + } + } + return allUpAppServers; + } + @Override public void upServer(String ip) throws Exception { @@ -151,6 +161,58 @@ public class StatusServiceImpl implements StatusService { } } + @Override + public void updateStatus(Long slbId, Long groupId, List ips, int offset, boolean status) throws Exception { + if (offset > 30 || offset < 0){ + throw new Exception("offset of status should be [0-30]"); + } + Group group; + if(activateService.isGroupActivated(groupId,slbId)){ + group = activateService.getActivatedGroup(groupId,slbId); + }else { + group = groupRepository.getById(groupId); + } + if (group == null){ + return; + } + + List groupVirtualServers = group.getGroupVirtualServers(); + List vsIds = new ArrayList<>(); + for (GroupVirtualServer groupVirtualServer : groupVirtualServers) { + if (!groupVirtualServer.getVirtualServer().getSlbId().equals(slbId)) { + continue; + } + vsIds.add(groupVirtualServer.getVirtualServer().getId()); + } + + for (GroupVirtualServer groupVirtualServer : groupVirtualServers){ + if (!groupVirtualServer.getVirtualServer().getSlbId().equals(slbId)){ + continue; + } + for (String ip : ips) { + if (ip==null||ip.isEmpty()) + { + continue; + } + statusGroupServerDao.deleteByGroupIdAndSlbIdAndIpAndExSlbVirtualServerIds(new StatusGroupServerDo() + .setSlbId(slbId) + .setGroupId(groupId) + .setIp(ip).setExVirtualServerIds(vsIds.toArray(new Long[]{}))); + + StatusGroupServerDo data = new StatusGroupServerDo(); + data.setSlbId(slbId) + .setSlbVirtualServerId(groupVirtualServer.getVirtualServer().getId()) + .setGroupId(groupId) + .setIp(ip); + int reset = ~(1 << offset); + int updatestatus = (status?0:1)< + @@ -128,6 +129,7 @@ + @@ -169,6 +171,7 @@ + @@ -209,6 +212,7 @@ + @@ -249,6 +253,7 @@ + @@ -290,6 +295,7 @@ + @@ -829,7 +835,6 @@ - @@ -872,7 +877,6 @@ - @@ -959,7 +963,6 @@ - @@ -1636,6 +1639,7 @@ + diff --git a/src/main/resources/META-INF/dal/jdbc/core-status.xml b/src/main/resources/META-INF/dal/jdbc/core-status.xml index 718f9629..06d4f9b5 100644 --- a/src/main/resources/META-INF/dal/jdbc/core-status.xml +++ b/src/main/resources/META-INF/dal/jdbc/core-status.xml @@ -1,6 +1,8 @@ + + @@ -13,6 +15,18 @@ ]]> + + + + () + VALUES() + ON DUPLICATE KEY UPDATE + status = status & ${reset} | values(status), + = NOW() + ]]> + + + + + + + FROM + WHERE = ${slb-id} + ]]> + + @@ -53,6 +77,18 @@ ]]> + + + + + + FROM
+ WHERE = ${slb-id} + AND = ${status} + ]]> + + @@ -105,6 +141,29 @@ ]]> + + + + + WHERE = ${up} + ]]> + + + + + + + + + WHERE = ${group-id} + AND = ${slb-id} + AND = ${ip} + AND not in ${ex-virtual-server-ids} + ]]> + + diff --git a/src/main/resources/META-INF/dal/model/status-codegen.xml b/src/main/resources/META-INF/dal/model/status-codegen.xml index 5c7d92fb..aa77c895 100644 --- a/src/main/resources/META-INF/dal/model/status-codegen.xml +++ b/src/main/resources/META-INF/dal/model/status-codegen.xml @@ -20,6 +20,7 @@ + diff --git a/src/test/resources/com/ctrip/zeus/model/status.xml b/src/test/resources/com/ctrip/zeus/model/status.xml index b2cfe6fe..ac8e631b 100644 --- a/src/test/resources/com/ctrip/zeus/model/status.xml +++ b/src/test/resources/com/ctrip/zeus/model/status.xml @@ -10,6 +10,7 @@ 11 true true + true true status @@ -18,6 +19,7 @@ 11 true true + true true status