private String getLogPrefix() { return ringGroup.getName() + ": "; }
public static boolean isUpToDate(RingGroup ringGroup, DomainGroup domainGroup, Domain domain) throws IOException { for (Ring ring : ringGroup.getRings()) { if (!Rings.isUpToDate(ring, domainGroup, domain)) { return false; } } return true; }
public static boolean isServingOnlyUpToDate(RingGroup ringGroup) throws IOException { DomainGroup domainGroup = ringGroup.getDomainGroup(); for (Ring ring : ringGroup.getRings()) { for (Host host : ring.getHosts()) { if (host.getState() == HostState.SERVING && !Hosts.isUpToDate(host, domainGroup)) { return false; } } } return true; }
protected void removeEmptyRings(RingGroup ringGroup) throws IOException { // avoid concurrent modification exceptions Set<Integer> rings = ringGroup.getRings().stream().map(Ring::getRingNumber).collect(Collectors.toSet()); for (Integer ringNum : rings) { Ring ring = ringGroup.getRing(ringNum); if (ring.getHosts().isEmpty()) { ringGroup.removeRing(ringNum); } } }
public void stop() { for (RingMonitor ringMonitor : ringMonitors) { ringMonitor.stop(); } ringGroup.removeRingGroupConductorModeListener(ringGroupConductorStatusMonitor); ringGroup.getDomainGroup().removeListener(domainGroupMetadataMonitor); } }
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); }
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; }
@Override protected String formatCore(NotificationFormatter formatter) { try { return "Domain Group for " + formatter.getWebUiLink(RingGroupController.getRingGroupUrl(ringGroup), ringGroup.getName()) + " is now:" + UiUtils.formatDomainGroupDomainVersionsTable(ringGroup.getDomainGroup(), "", false); } catch (IOException e) { throw new RuntimeException(e); } }
public RingGroupMonitor(RingGroup ringGroup, List<Notifier> notifiers) throws IOException { this.notifiers = notifiers; this.ringGroup = ringGroup; for (Ring ring : ringGroup.getRings()) { ringMonitors.add(new RingMonitor(ringGroup, ring, notifiers)); } this.ringGroupConductorStatusMonitor = new RingGroupConductorModeMonitor(); this.domainGroupMetadataMonitor = new DomainGroupMetadataMonitor(); ringGroup.addRingGroupConductorModeListener(ringGroupConductorStatusMonitor); ringGroup.getDomainGroup().addListener(domainGroupMetadataMonitor); }
@Test public void testAddRingGroup() throws Exception { DomainGroup dg = coord.addDomainGroup("myDomainGroup2"); Map<Domain, Integer> domainIdToVersion = new HashMap<>(); dg.setDomainVersions(domainIdToVersion); RingGroup rg = coord.addRingGroup("superDuperRingGroup", "myDomainGroup2"); assertEquals("superDuperRingGroup", rg.getName()); assertEquals(0, rg.getRings().size()); }
protected void doDeleteHost(HttpServletRequest req, HttpServletResponse resp) throws IOException { RingGroup ringGroup = coordinator.getRingGroup(req.getParameter("g")); Ring ring = ringGroup.getRing(Integer.parseInt(req.getParameter("n"))); ring.removeHost(PartitionServerAddress.parse(URLEnc.decode(req.getParameter("h")))); resp.sendRedirect(String.format("/ring.jsp?g=%s&n=%d", ringGroup.getName(), ring.getRingNumber())); }
private void doAddRing(HttpServletRequest req, HttpServletResponse resp) throws IOException { RingGroup ringGroup; String encodedRingGroupName = req.getParameter("g"); ringGroup = coordinator.getRingGroup(URLEnc.decode(encodedRingGroupName)); if (ringGroup == null) { throw new IOException("couldn't find any ring group called " + URLEnc.decode(encodedRingGroupName)); } // Find new ring ID (largest ID + 1) int newRingID = 0; for (Ring ring : ringGroup.getRings()) { if (ring.getRingNumber() >= newRingID) { newRingID = ring.getRingNumber() + 1; } } ringGroup.addRing(newRingID); 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); } } }
private void connectToRing() throws IOException, InterruptedException { ringGroup.registerServer(new ConnectedServerMetadata(hostName, configurator.getServicePort(), System.currentTimeMillis(), ring = ringGroup.getRingForHost(hostAddress); + " in ring group " + ringGroup.getName() + " ring " + ring.getRingNumber()); + " in ring group " + ringGroup.getName()+". Sleeping.");
@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()); }
for (ConnectedServerMetadata metadata : ringGroup.getLiveServers()) { Ring ring = ringGroup.getRingForHost(new PartitionServerAddress(metadata.get_host(), metadata.get_port_number())); if (ring == null) { String bucket = metadata.get_environment_flags().get(status.getAvailabilityBucketKey()); Ring ring = ringGroup.addRing(getNextRingNum(ringGroup)); LOG.info("Created ring " + ring);
Ring r1 = rg0.addRing(1); r1.addHost(addy("alpha-1-1"), Collections.<String>emptyList()); r1.addHost(addy("alpha-1-2"), Collections.<String>emptyList()); r1.addHost(addy("alpha-1-3"), Collections.<String>emptyList()); Ring r2 = rg0.addRing(2); r2.addHost(addy("alpha-2-1"), Collections.<String>emptyList()); r2.addHost(addy("alpha-2-2"), Collections.<String>emptyList()); r2.addHost(addy("alpha-2-3"), Collections.<String>emptyList()); Ring r3 = rg0.addRing(3); r3.addHost(addy("alpha-3-1"), Collections.<String>emptyList()); r3.addHost(addy("alpha-3-2"), Collections.<String>emptyList()); r3.addHost(addy("alpha-3-3"), Collections.<String>emptyList()); for (int i = 0; i < 16; ++i) { rg0.registerClient(new ClientMetadata( LocalHostUtils.getHostName(), System.currentTimeMillis(), r1 = rg1.addRing(1); r1.addHost(addy("beta-1-1"), Collections.<String>emptyList()); r1.addHost(addy("beta-1-2"), Collections.<String>emptyList()); r1.addHost(addy("beta-1-3"), Collections.<String>emptyList()); r1.addHost(addy("beta-1-4"), Collections.<String>emptyList()); r2 = rg1.addRing(2); r2.addHost(addy("beta-2-1"), Collections.<String>emptyList()); r2.addHost(addy("beta-2-2"), Collections.<String>emptyList()); r2.addHost(addy("beta-2-3"), Collections.<String>emptyList()); r2.addHost(addy("beta-2-4"), Collections.<String>emptyList()); r3 = rg1.addRing(3); r3.addHost(addy("beta-3-1"), Collections.<String>emptyList());
public static boolean isUpToDate(RingGroup ringGroup) throws IOException { return isUpToDate(ringGroup, ringGroup.getDomainGroup()); }
private void doAddHost(HttpServletRequest req, HttpServletResponse resp) throws IOException { String rgName = req.getParameter("rgName"); int ringNum = Integer.parseInt(req.getParameter("ringNum")); String hostname = req.getParameter("hostname").trim(); int portNum = Integer.parseInt(req.getParameter("port")); String flagsStr = req.getParameter("hostFlags"); coordinator.getRingGroup(rgName).getRing(ringNum).addHost( new PartitionServerAddress(hostname, portNum), Hosts.splitHostFlags(flagsStr)); resp.sendRedirect("/ring.jsp?g=" + rgName + "&n=" + ringNum); }
if (ringGroup.claimRingGroupConductor(initialMode)) { LOG.info("Claimed initial mode: " + initialMode); claimedRingGroupConductor = true; ringGroup.setRingGroupConductorMode(initialMode);