diff --git src/main/java/org/apache/hadoop/hbase/ClusterStatus.java src/main/java/org/apache/hadoop/hbase/ClusterStatus.java index 9df4c10..5d7f07b 100644 --- src/main/java/org/apache/hadoop/hbase/ClusterStatus.java +++ src/main/java/org/apache/hadoop/hbase/ClusterStatus.java @@ -71,7 +71,6 @@ public class ClusterStatus extends VersionedWritable { */ private static final byte VERSION_MASTER_BACKUPMASTERS = 2; private static final byte VERSION = 2; - private static final String UNKNOWN_SERVERNAME = "unknown"; private String hbaseVersion; private Map liveServers; @@ -177,11 +176,11 @@ public class ClusterStatus extends VersionedWritable { return (getVersion() == ((ClusterStatus)o).getVersion()) && getHBaseVersion().equals(((ClusterStatus)o).getHBaseVersion()) && this.liveServers.equals(((ClusterStatus)o).liveServers) && - this.deadServers.equals(((ClusterStatus)o).deadServers) && + this.deadServers.containsAll(((ClusterStatus)o).deadServers) && Arrays.equals(this.masterCoprocessors, ((ClusterStatus)o).masterCoprocessors) && this.master.equals(((ClusterStatus)o).master) && - this.backupMasters.equals(((ClusterStatus)o).backupMasters); + this.backupMasters.containsAll(((ClusterStatus)o).backupMasters); } /** @@ -344,7 +343,7 @@ public class ClusterStatus extends VersionedWritable { Bytes.readByteArray(in))); } } else { - this.master = new ServerName(UNKNOWN_SERVERNAME, -1, + this.master = new ServerName(ServerName.UNKNOWN_SERVERNAME, -1, ServerName.NON_STARTCODE); this.backupMasters = new ArrayList(0); } diff --git src/main/java/org/apache/hadoop/hbase/ServerName.java src/main/java/org/apache/hadoop/hbase/ServerName.java index 9046dbd..8fdb624 100644 --- src/main/java/org/apache/hadoop/hbase/ServerName.java +++ src/main/java/org/apache/hadoop/hbase/ServerName.java @@ -73,6 +73,11 @@ public class ServerName implements Comparable { SERVERNAME_SEPARATOR + Addressing.VALID_PORT_REGEX + SERVERNAME_SEPARATOR + Addressing.VALID_PORT_REGEX + "$"); + /** + * What to use if server name is unknown. + */ + public static final String UNKNOWN_SERVERNAME = "#unknown#"; + private final String servername; private final String hostname; private final int port; @@ -291,4 +296,4 @@ public class ServerName implements Comparable { return SERVERNAME_PATTERN.matcher(str).matches()? new ServerName(str): new ServerName(str, NON_STARTCODE); } -} \ No newline at end of file +} diff --git src/main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java src/main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java index 0ac1a33..ef19cb9 100644 --- src/main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java +++ src/main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java @@ -168,7 +168,7 @@ class ActiveMasterManager extends ZooKeeperListener { LOG.info("Adding ZNode for " + backupZNode + " in backup master directory"); ZKUtil.createEphemeralNodeAndWatch(this.watcher, backupZNode, - HConstants.EMPTY_BYTE_ARRAY); + this.sn.getVersionedBytes()); String msg; byte[] bytes = diff --git src/main/java/org/apache/hadoop/hbase/master/HMaster.java src/main/java/org/apache/hadoop/hbase/master/HMaster.java index d28ca78..6071c5a 100644 --- src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -26,6 +26,8 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -1522,8 +1524,20 @@ Server { List backupMasters = new ArrayList( backupMasterStrings.size()); for (String s: backupMasterStrings) { - backupMasters.add(new ServerName(s)); + try { + byte[] bytes = ZKUtil.getData(this.zooKeeper, ZKUtil.joinZNode(this.zooKeeper.backupMasterAddressesZNode, s)); + if (bytes != null) { + backupMasters.add(ServerName.parseVersionedServerName(bytes)); + } + } catch (KeeperException e) { + LOG.warn(this.zooKeeper.prefix("Unable to get information about " + + "backup servers"), e); + } } + Collections.sort(backupMasters, new Comparator() { + public int compare(ServerName s1, ServerName s2) { + return s1.getServerName().compareTo(s2.getServerName()); + }}); return new ClusterStatus(VersionInfo.getVersion(), this.fileSystemManager.getClusterId(),