protected static PartitionServerAddress addy(String hostname) { return new PartitionServerAddress(hostname, 6200); } }
@Override public int compareTo(PartitionServerAddress arg0) { int hostComparison = getHostName().compareTo(arg0.getHostName()); if (hostComparison == 0) { return Integer.valueOf(getPortNumber()).compareTo(arg0.getPortNumber()); } return hostComparison; } }
@Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } HostAddress that = (HostAddress)o; if (!partitionServerAddress.equals(that.partitionServerAddress)) { return false; } if (!ring.equals(that.ring)) { return false; } return true; }
@Override public Host addHost(PartitionServerAddress address, List<String> flags) throws IOException { try { // throws an exception if we can't parse the address PartitionServerAddress.parse(address.toString()); Host host = getHostByAddress(address); if(host != null){ throw new IllegalArgumentException("Host "+address+" already exists in ring "+getRingNumber()+"!"); } return ZkHost.create(zk, coordinator, ZkPath.append(ringPath, HOSTS_PATH_SEGMENT), address, dataLocationChangeListener, flags); } catch (Exception e) { throw new IOException(e); } }
private void doUpdate(HttpServletRequest req, HttpServletResponse resp) throws IOException { RingGroup rg = coordinator.getRingGroup(req.getParameter("g")); Ring r = rg.getRing(Integer.parseInt(req.getParameter("n"))); Host h = r.getHostByAddress(PartitionServerAddress.parse(URLEnc.decode(req.getParameter("h")))); h.setFlags(Hosts.splitHostFlags(req.getParameter("hostFlags"))); PartitionServerAddress address = PartitionServerAddress.parse(req.getParameter("hostAddress")); if (!h.getAddress().equals(address)) { h.setAddress(address); // Redirect to Ring (host address has changed) resp.sendRedirect("/ring.jsp?g=" + rg.getName() + "&n=" + r.getRingNumber()); } else { redirectBack(resp, rg, r, h); } }
private void removeFromReplicasFullyServing(Map<Domain, Map<Integer, Set<Host>>> domainToPartitionToHostsFullyServing, Host host) { for (Map<Integer, Set<Host>> partitionToHostsFullyServing : domainToPartitionToHostsFullyServing.values()) { for (Set<Host> hosts : partitionToHostsFullyServing.values()) { hosts.remove(host); } } status.clearObservations(host.getAddress().toString()); }
public static FilesystemStatisticsAggregator computeFilesystemStatisticsForRing(Map<Host, Map<String, FilesystemStatisticsAggregator>> filesystemStatistics) { FilesystemStatisticsAggregator result = new FilesystemStatisticsAggregator(); Set<String> hostAndFilesystemRootsAdded = new HashSet<String>(); for (Map.Entry<Host, Map<String, FilesystemStatisticsAggregator>> entry1 : filesystemStatistics.entrySet()) { for (Map.Entry<String, FilesystemStatisticsAggregator> entry2 : entry1.getValue().entrySet()) { String hostAndFilesystemRoot = entry1.getKey().getAddress().getHostName() + entry2.getKey(); if (!hostAndFilesystemRootsAdded.contains(hostAndFilesystemRoot)) { hostAndFilesystemRootsAdded.add(hostAndFilesystemRoot); result.add(entry2.getValue()); } } } return result; }
public static String partitionServerConfig(String dataDir, String ringGroupName, int zkPort, PartitionServerAddress addy, String domainsRoot, String domainGroupsRoot, String ringGroupsRoot) { StringBuilder builder = new StringBuilder(); builder.append(YamlPartitionServerConfigurator.PARTITION_SERVER_SECTION_KEY + ":\n"); builder.append(" " + YamlPartitionServerConfigurator.SERVICE_PORT_KEY + ": " + addy.getPortNumber() + "\n"); builder.append(" " + YamlPartitionServerConfigurator.RING_GROUP_NAME_KEY + ": " + ringGroupName + "\n"); builder.append(" " + YamlPartitionServerConfigurator.LOCAL_DATA_DIRS_KEY + ":\n"); builder.append(" - " + dataDir + "\n"); builder.append(" " + YamlPartitionServerConfigurator.PARTITION_SERVER_DAEMON_SECTION_KEY + ":\n"); builder.append(" " + YamlPartitionServerConfigurator.NUM_CONCURRENT_QUERIES_KEY + ": 1\n"); builder.append(" " + YamlPartitionServerConfigurator.NUM_CONCURRENT_GET_BULK_TASKS + ": 1\n"); builder.append(" " + YamlPartitionServerConfigurator.GET_BULK_TASK_SIZE + ": 2\n"); builder.append(" " + YamlPartitionServerConfigurator.GET_TIMER_AGGREGATOR_WINDOW_KEY + ": 1000\n"); builder.append(" " + YamlPartitionServerConfigurator.CACHE_NUM_BYTES_CAPACITY + ": 1000000\n"); builder.append(" " + YamlPartitionServerConfigurator.CACHE_NUM_ITEMS_CAPACITY + ": 1000000\n"); builder.append(" " + YamlPartitionServerConfigurator.BUFFER_REUSE_MAX_SIZE + ": 0\n"); builder.append(" " + YamlPartitionServerConfigurator.UPDATE_DAEMON_SECTION_KEY + ":\n"); builder.append(" " + YamlPartitionServerConfigurator.NUM_CONCURRENT_UPDATES_KEY + ": 1\n"); builder.append(" " + YamlPartitionServerConfigurator.MAX_CONCURRENT_UPDATES_PER_DATA_DIRECTORY_KEY + ": 1\n"); builder.append(coordinatorConfig(zkPort, 1000000, domainsRoot, domainGroupsRoot, ringGroupsRoot)); return builder.toString(); }
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())); }
@Override public int compareTo(Host o) { return getAddress().compareTo(o.getAddress()); }
private static String formatHostListTooltip(String title, Set<Host> hosts) throws IOException { if (hosts.size() == 0) { return "-"; } else { TreeSet<Host> sortedHosts = new TreeSet<Host>(hosts); StringBuilder content = new StringBuilder(); for (Host host : sortedHosts) { content.append("<div class='" + hostStateToClass(host.getState()) + "'>"); content.append(host.getAddress().toString()); content.append("</div>"); } return htmlTooltip(Integer.toString(hosts.size()), title, content.toString()); } }
public static FilesystemStatisticsAggregator computeFilesystemStatisticsForRingGroup( Map<Ring, Map<Host, Map<String, FilesystemStatisticsAggregator>>> filesystemStatistics) { FilesystemStatisticsAggregator result = new FilesystemStatisticsAggregator(); for (Map.Entry<Ring, Map<Host, Map<String, FilesystemStatisticsAggregator>>> entry1 : filesystemStatistics.entrySet()) { for (Map.Entry<Host, Map<String, FilesystemStatisticsAggregator>> entry2 : entry1.getValue().entrySet()) { Set<String> hostAndFilesystemRootsAdded = new HashSet<String>(); for (Map.Entry<String, FilesystemStatisticsAggregator> entry3 : entry2.getValue().entrySet()) { String hostAndFilesystemRoot = entry2.getKey().getAddress().getHostName() + entry3.getKey(); if (!hostAndFilesystemRootsAdded.contains(hostAndFilesystemRoot)) { hostAndFilesystemRootsAdded.add(hostAndFilesystemRoot); result.add(entry3.getValue()); } } } } return result; }
private void doDeleteOrUndeletePartition(HttpServletRequest req, HttpServletResponse resp, boolean deletable) throws IOException { RingGroup rg = coordinator.getRingGroup(req.getParameter("g")); Ring r = rg.getRing(Integer.parseInt(req.getParameter("n"))); Host h = r.getHostByAddress(PartitionServerAddress.parse(URLEnc.decode(req.getParameter("h")))); HostDomain hd = h.getHostDomain(coordinator.getDomain(req.getParameter("d"))); HostDomainPartition hdp = hd.getPartitionByNumber(Integer.parseInt(req.getParameter("p"))); hdp.setDeletable(deletable); redirectBack(resp, rg, r, h); }
@Override protected String formatCore(NotificationFormatter formatter) { return formatter.getWebUiLink(HostController.getHostUrl(ringGroup, ring, host), host.getAddress().getHostName() + ":" + host.getAddress().getPortNumber()) + " is " + hostState; } }
public static PartitionServerAddress parse(String s) { Matcher matcher = HOST_AND_PORT_PATTERN.matcher(s); if (matcher.matches()) { return new PartitionServerAddress(matcher.group(1), Integer.parseInt(matcher.group(2))); } else { throw new RuntimeException(s + " is not a properly formatted host:port pair."); } }
@Override public Host getHostByAddress(PartitionServerAddress address) { for (Host host : hosts) { if (host.getAddress().equals(address)) { return host; } } return null; }
private void redirectBack(HttpServletResponse resp, RingGroup rgc, Ring rc, Host hc) throws IOException { resp.sendRedirect(String.format("/host.jsp?g=%s&r=%s&h=%s", rgc.getName(), rc.getRingNumber(), URLEnc.encode(hc.getAddress().toString()))); }
private static boolean allPartitionsUpToDate(Host host, Collection<DomainAndVersion> domainVersions, boolean allowMoreRecentDomainVersions) throws IOException { // Check that each domain of the given domain group version is up to date on this host for (DomainAndVersion domainAndVersion : domainVersions) { Domain domain = domainAndVersion.getDomain(); HostDomain hostDomain = host.getHostDomain(domain); if (hostDomain != null) { for (HostDomainPartition partition : hostDomain.getPartitions()) { // Ignore deletable partitions if (!partition.isDeletable()) { // If the partition is not currently at the given domain group version, the host is not up-to-date if (partition.getCurrentDomainVersion() == null || (!allowMoreRecentDomainVersions && partition.getCurrentDomainVersion() != domainAndVersion.getVersionNumber()) || (allowMoreRecentDomainVersions && (partition.getCurrentDomainVersion() < domainAndVersion.getVersionNumber()))) { LOG.info("Host " + host.getAddress().getHostName() + " is not up to date for domain " + domain.getName() + " and version " + domainAndVersion.getVersionNumber()); LOG.info("Host " + host.getAddress().getHostName() + " has a partition on domain " + domain.getName() + " at version " + partition.getCurrentDomainVersion()); return false; } } } } } return true; }
protected void doClearCommandQueue(HttpServletRequest req, HttpServletResponse resp) throws IOException { RingGroup rg = coordinator.getRingGroup(req.getParameter("g")); Ring r = rg.getRing(Integer.parseInt(req.getParameter("n"))); Host h = r.getHostByAddress(PartitionServerAddress.parse(URLEnc.decode(req.getParameter("h")))); h.clearCommandQueue(); redirectBack(resp, rg, r, h); }
public static ZkHost create(ZooKeeperPlus zk, Coordinator coordinator, String root, PartitionServerAddress partitionServerAddress, DataLocationChangeListener dataLocationChangeListener, List<String> flags) throws KeeperException, InterruptedException { String path = ZkPath.append(root, Long.toString(Math.abs(UUID.randomUUID().getLeastSignificantBits()))); if (LOG.isTraceEnabled()) { LOG.trace("Creating ZkHost " + partitionServerAddress + " at " + path); } HostMetadata initialMetadata = new HostMetadata(); initialMetadata.set_flags(Hosts.joinHostFlags(flags)); initialMetadata.set_host_name(partitionServerAddress.getHostName()); initialMetadata.set_port_number(partitionServerAddress.getPortNumber()); HostAssignmentsMetadata initialAssignments = new HostAssignmentsMetadata(); initialAssignments.set_domains(new HashMap<Integer, HostDomainMetadata>()); return new ZkHost(zk, coordinator, path, dataLocationChangeListener, true, initialMetadata, initialAssignments); }