void processUpdates(RingGroup ringGroup) throws IOException { // Only process updates if ring group conductor is configured to be active/proactive if (ringGroup.getRingGroupConductorMode() == RingGroupConductorMode.ACTIVE || ringGroup.getRingGroupConductorMode() == RingGroupConductorMode.PROACTIVE || ringGroup.getRingGroupConductorMode() == RingGroupConductorMode.AUTOCONFIGURE) { updateTransFunc.manageTransitions(coordinator, ringGroup); } }
void processConfigure(RingGroup ringGroup) throws IOException { if (ringGroup.getRingGroupConductorMode() == RingGroupConductorMode.AUTOCONFIGURE) { configureTransFunc.manageTransitions(coordinator, ringGroup); } }
protected void doSetRingGroupConductorMode(HttpServletRequest req, HttpServletResponse resp) throws IOException { String encodedRingGroupName = req.getParameter("g"); RingGroup ringGroup = coordinator.getRingGroup(URLEnc.decode(encodedRingGroupName)); // Only change the mode if it's not OFFLINE if (ringGroup.getRingGroupConductorMode() != null && ringGroup.getRingGroupConductorMode() != RingGroupConductorMode.OFFLINE) { ringGroup.setRingGroupConductorMode(RingGroupConductorMode.valueOf(URLEnc.decode(req.getParameter("mode")))); } resp.sendRedirect("/ring_group.jsp?name=" + encodedRingGroupName); }
@Override public void manageTransitions(Coordinator coordinator, RingGroup ringGroup) throws IOException { DomainGroup domainGroup = ringGroup.getDomainGroup(); if (domainGroup == null) { // Nothing to do LOG.info("Domain group not found. Nothing to do."); return; } Map<Domain, Map<Integer, Set<Host>>> domainToPartitionToHostsFullyServing = PartitionUtils.domainToPartitionToHostsServing(ringGroup, status); ThreeNestedMap<Domain, Integer, String, Long> domainPartitionBucketHostCounts = PartitionUtils.domainToPartitionToHostsServingInBucket(domainToPartitionToHostsFullyServing, status); SortedSet<Ring> rings = ringGroup.getRingsSorted(); int ringCount = rings.size(); for (Ring ring : rings) { partitionAssigner.prepare(ring, domainGroup.getDomainVersions(), ringGroup.getRingGroupConductorMode()); for (Host host : ring.getHostsSorted()) { manageTransitions(ringCount, host, domainGroup, domainToPartitionToHostsFullyServing, domainPartitionBucketHostCounts); } } }
protected RingGroupData getRingGroupData(RingGroup ringGroup) throws IOException { RingGroupData data = new RingGroupData(); data.name = ringGroup.getName(); data.isRingGroupConductorOnline = ringGroup.isRingGroupConductorOnline(); data.ringGroupConductorMode = ringGroup.getRingGroupConductorMode(); data.domainGroupName = ringGroup.getDomainGroup().getName(); ServingStatus servingStatus = RingGroups.computeServingStatusAggregator(ringGroup, ringGroup.getDomainGroup()).computeServingStatus(); data.numPartitions = servingStatus.getNumPartitions(); data.numPartitionsServedAndUpToDate = servingStatus.getNumPartitionsServedAndUpToDate(); Map<Integer, RingData> ringsMap = new HashMap<Integer, RingData>(); for (Ring ring : ringGroup.getRings()) { ringsMap.put(ring.getRingNumber(), getRingData(ring)); } data.ringsMap = ringsMap; data.clients = Maps.newHashMap(); for (ClientMetadata clientData : ringGroup.getClients()) { data.clients.put(clientData.get_host(), new ConnectedHostData( clientData.get_host(), Long.toString(clientData.get_connected_at()), clientData.get_type(), clientData.get_version() )); } return data; }
@Test public void testClaimRingGroupConductor() throws Exception { ZkDomainGroup dg = ZkDomainGroup.create(getZk(), null, dg_root, "blah"); dg.setDomainVersions(Collections.emptyMap()); final RingGroup rg = ZkRingGroup.create(getZk(), ring_group, dg, coordinator); create(ZkPath.append(ring_group, ZkRingGroup.RING_GROUP_CONDUCTOR_ONLINE_PATH)); assertFalse(rg.claimRingGroupConductor(RingGroupConductorMode.ACTIVE)); getZk().delete(ZkPath.append(ring_group, ZkRingGroup.RING_GROUP_CONDUCTOR_ONLINE_PATH), -1); assertTrue(rg.claimRingGroupConductor(RingGroupConductorMode.ACTIVE)); assertFalse(rg.claimRingGroupConductor(RingGroupConductorMode.ACTIVE)); rg.releaseRingGroupConductor(); assertTrue(rg.claimRingGroupConductor(RingGroupConductorMode.ACTIVE)); WaitUntil.orDie(() -> { try { return RingGroupConductorMode.ACTIVE.equals(rg.getRingGroupConductorMode()); } catch (IOException e) { throw new RuntimeException(e); } }); assertEquals(RingGroupConductorMode.ACTIVE, rg.getRingGroupConductorMode()); }