public static boolean isUpToDate(Host host, DomainGroup domainGroup) throws IOException { if (domainGroup == null || domainGroup.getDomainVersions() == null) { return false; } if (!allPartitionsUpToDate(host, domainGroup.getDomainVersions(), false)) { return false; } if (isAssignedDeletablePartition(host)) { return false; } return true; }
protected DomainGroupData getDomainGroupData(DomainGroup domainGroup) throws IOException { DomainGroupData data = new DomainGroupData(); data.name = domainGroup.getName(); Map<String, Integer> versionsMap = new HashMap<String, Integer>(); for (DomainAndVersion v : domainGroup.getDomainVersions()) { versionsMap.put(v.getDomain().getName(), v.getVersionNumber()); } data.domainVersions = versionsMap; return data; }
private boolean removeHostIfReplicated(int totalRings, DomainGroup domainGroup, Map<Domain, Map<Integer, Set<Host>>> domainToPartitionToHostsFullyServing, ThreeNestedMap<Domain, Integer, String, Long> domainPartitionBucketHostCounts, Ring ring, Host host) throws IOException { LiveReplicaStatus status = PartitionUtils.computeDataReplicationStatus( totalRings, domainToPartitionToHostsFullyServing, domainPartitionBucketHostCounts, domainGroup.getDomainVersions(), this.status, host ); if (PartitionUtils.isFullyServing(host, false, this.status) && status == LiveReplicaStatus.OVER_REPLICATED) { removeHost(ring, host); // just to be safe, only remove one host per iteration. otherwise we have to carefully update the various // partition maps. I don't think this will delay things significantly. return true; } return false; }
public ServingStatus computeUniquePartitionsServingStatus(DomainGroup domainGroup) throws IOException { ServingStatus result = new ServingStatus(); for (DomainAndVersion dgvdv : domainGroup.getDomainVersions()) { Domain domain = dgvdv.getDomain(); Map<Integer, ServingStatus> partitionToServingStatus = domainToPartitionToPartitionServingStatus.get(domain); int partitionsServedAndUpToDate = 0; if (partitionToServingStatus != null) { for (ServingStatus servingStatus : partitionToServingStatus.values()) { // A unique partition is served and up to date if all host corresponding domain partitions are // served and up to date if (servingStatus.getNumPartitionsServedAndUpToDate() == servingStatus.getNumPartitions()) { partitionsServedAndUpToDate += 1; } } } result.aggregate(domain.getNumParts(), partitionToServingStatus == null ? 0 : partitionsServedAndUpToDate); } return result; } }
@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); } } }
for (DomainAndVersion dgdv : domainGroup.getDomainVersions()) { HostDomain hostDomain = host.getHostDomain(dgdv.getDomain()); if (hostDomain != null) { for (DomainAndVersion dgvdv : domainGroup.getDomainVersions()) { int domainId = dgvdv.getDomain().getId(); if (domainId > maxDomainId) { for (DomainAndVersion dgvdv : domainGroup.getDomainVersions()) { Domain domain = dgvdv.getDomain(); StorageEngine engine = domain.getStorageEngine();
public static UpdateProgressAggregator computeUpdateProgress(Host host, DomainGroup domainGroup) throws IOException { UpdateProgressAggregator result = new UpdateProgressAggregator(); for (DomainAndVersion dgvdv : domainGroup.getDomainVersions()) { Domain domain = dgvdv.getDomain(); HostDomain hostDomain = host.getHostDomain(domain); if (hostDomain != null) { for (HostDomainPartition partition : hostDomain.getPartitions()) { // Ignore deletable partitions if (!partition.isDeletable()) { if (partition.getCurrentDomainVersion() != null && partition.getCurrentDomainVersion().equals(dgvdv.getVersionNumber())) { result.add(domain, true); } else { result.add(domain, false); } } } } } return result; }
domainToPartitionToHostsFullyServing, domainPartitionBucketCounts, domainGroup.getDomainVersions(), this.status, host
@Test public void testAddDomainGroup() throws Exception { // keep a second coordinator aside final ZooKeeperCoordinator coord2 = getCoord(); coord.addDomainGroup("myDomainGroup2"); DomainGroup c = coord.getDomainGroup("myDomainGroup2"); assertNotNull(c); assertEquals("myDomainGroup2", c.getName()); assertEquals(0, c.getDomainVersions().size()); // repeat the assertions with the other coord instance to ensure changes are // visible WaitUntil.orDie(() -> coord2.getDomainGroup("myDomainGroup2") != null); assertNotNull("myDomainGroup2 should be found", c); assertEquals("myDomainGroup2", c.getName()); assertEquals(0, c.getDomainVersions().size()); coord2.close(); }