HBASE-9173 replication_admin#get_peer_state(id) in ruby script pointing to

undefined method `getPeerState'


git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1513676 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jean-Daniel Cryans 2013-08-13 22:31:53 +00:00
parent f0dfc4d1ae
commit cd72d29eae
7 changed files with 69 additions and 4 deletions

View File

@ -175,6 +175,16 @@ public class ReplicationAdmin implements Closeable {
return this.replicationPeers.getAllPeerClusterKeys(); return this.replicationPeers.getAllPeerClusterKeys();
} }
/**
* Get the state of the specified peer cluster
* @param id String format of the Short that identifies the peer, an IllegalArgumentException
* is thrown if it doesn't exist
* @return true if replication is enabled to that peer, false if it isn't
*/
public boolean getPeerState(String id) throws IOException {
return this.replicationPeers.getStatusOfPeerFromBackingStore(id);
}
@Override @Override
public void close() throws IOException { public void close() throws IOException {
if (this.connection != null) { if (this.connection != null) {

View File

@ -200,11 +200,12 @@ public class ReplicationPeer implements Abortable, Closeable {
} }
/** /**
* @param bytes * Parse the raw data from ZK to get a peer's state
* @param bytes raw ZK data
* @return True if the passed in <code>bytes</code> are those of a pb serialized ENABLED state. * @return True if the passed in <code>bytes</code> are those of a pb serialized ENABLED state.
* @throws DeserializationException * @throws DeserializationException
*/ */
private static boolean isStateEnabled(final byte[] bytes) throws DeserializationException { public static boolean isStateEnabled(final byte[] bytes) throws DeserializationException {
ZooKeeperProtos.ReplicationState.State state = parseStateFrom(bytes); ZooKeeperProtos.ReplicationState.State state = parseStateFrom(bytes);
return ZooKeeperProtos.ReplicationState.State.ENABLED == state; return ZooKeeperProtos.ReplicationState.State.ENABLED == state;
} }

View File

@ -76,11 +76,23 @@ public interface ReplicationPeers {
/** /**
* Get the replication status for the specified connected remote slave cluster. * Get the replication status for the specified connected remote slave cluster.
* The value might be read from cache, so it is recommended to
* use {@link #getStatusOfPeerFromBackingStore(String)}
* if reading the state after enabling or disabling it.
* @param peerId a short that identifies the cluster * @param peerId a short that identifies the cluster
* @return true if replication is enabled, false otherwise. * @return true if replication is enabled, false otherwise.
*/ */
boolean getStatusOfConnectedPeer(String peerId); boolean getStatusOfConnectedPeer(String peerId);
/**
* Get the replication status for the specified remote slave cluster, which doesn't
* have to be connected. The state is read directly from the backing store.
* @param peerId a short that identifies the cluster
* @return true if replication is enabled, false otherwise.
* @throws IOException Throws if there's an error contacting the store
*/
boolean getStatusOfPeerFromBackingStore(String peerId) throws IOException;
/** /**
* Get a set of all connected remote slave clusters. * Get a set of all connected remote slave clusters.
* @return set of peer ids * @return set of peer ids

View File

@ -137,6 +137,21 @@ public class ReplicationPeersZKImpl extends ReplicationStateZKBase implements Re
return this.peerClusters.get(id).getPeerEnabled().get(); return this.peerClusters.get(id).getPeerEnabled().get();
} }
@Override
public boolean getStatusOfPeerFromBackingStore(String id) throws IOException {
if (!this.getAllPeerIds().contains(id)) {
throw new IllegalArgumentException("peer " + id + " doesn't exist");
}
String peerStateZNode = getPeerStateNode(id);
try {
return ReplicationPeer.isStateEnabled(ZKUtil.getData(this.zookeeper, peerStateZNode));
} catch (KeeperException e) {
throw new IOException(e);
} catch (DeserializationException e) {
throw new IOException(e);
}
}
@Override @Override
public boolean connectToPeer(String peerId) throws IOException, KeeperException { public boolean connectToPeer(String peerId) throws IOException, KeeperException {
if (peerClusters == null) { if (peerClusters == null) {

View File

@ -58,7 +58,7 @@ module Hbase
#---------------------------------------------------------------------------------------------- #----------------------------------------------------------------------------------------------
# Get peer cluster state # Get peer cluster state
def get_peer_state(id) def get_peer_state(id)
@replication_admin.getPeerState(id) @replication_admin.getPeerState(id) ? "ENABLED" : "DISABLED"
end end
#---------------------------------------------------------------------------------------------- #----------------------------------------------------------------------------------------------

View File

@ -27,6 +27,8 @@ import org.junit.experimental.categories.Category;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
/** /**
* Unit testing of ReplicationAdmin * Unit testing of ReplicationAdmin
@ -86,12 +88,33 @@ public class TestReplicationAdmin {
admin.addPeer(ID_SECOND, KEY_SECOND); admin.addPeer(ID_SECOND, KEY_SECOND);
} catch (IllegalStateException iae) { } catch (IllegalStateException iae) {
fail(); fail();
// OK!
} }
assertEquals(2, admin.getPeersCount()); assertEquals(2, admin.getPeersCount());
// Remove the first peer we added // Remove the first peer we added
admin.removePeer(ID_ONE); admin.removePeer(ID_ONE);
assertEquals(1, admin.getPeersCount()); assertEquals(1, admin.getPeersCount());
admin.removePeer(ID_SECOND);
assertEquals(0, admin.getPeersCount());
}
/**
* basic checks that when we add a peer that it is enabled, and that we can disable
* @throws Exception
*/
@Test
public void testEnableDisable() throws Exception {
admin.addPeer(ID_ONE, KEY_ONE);
assertEquals(1, admin.getPeersCount());
assertTrue(admin.getPeerState(ID_ONE));
admin.disablePeer(ID_ONE);
assertFalse(admin.getPeerState(ID_ONE));
try {
admin.getPeerState(ID_SECOND);
} catch (IllegalArgumentException iae) {
// OK!
}
admin.removePeer(ID_ONE);
} }
} }

View File

@ -231,6 +231,10 @@ public abstract class TestReplicationStateBasic {
} }
protected void assertConnectedPeerStatus(boolean status, String peerId) throws Exception { protected void assertConnectedPeerStatus(boolean status, String peerId) throws Exception {
// we can first check if the value was changed in the store, if it wasn't then fail right away
if (status != rp.getStatusOfPeerFromBackingStore(peerId)) {
fail("ConnectedPeerStatus was " + !status + " but expected " + status + " in ZK");
}
while (true) { while (true) {
if (status == rp.getStatusOfConnectedPeer(peerId)) { if (status == rp.getStatusOfConnectedPeer(peerId)) {
return; return;