use of voldemort.cluster.Cluster in project voldemort by voldemort.
the class VoldemortServerTest method testClusterWithDifferentStateFails.
@Test
public void testClusterWithDifferentStateFails() throws IOException {
Cluster localCluster = ServerTestUtils.getLocalCluster(1);
VoldemortConfig config = getVoldemortConfig(new Properties());
server = new VoldemortServer(config, localCluster);
server.start();
final int UPDATED_NODE_ID = 3;
Node oldNode = localCluster.getNodes().iterator().next();
// For single local node, host matcher is not used.
config.setNodeIdImplementation(new NodeIdHostMatcher(UPDATED_NODE_ID));
Cluster updatedCluster = ServerTestUtils.getLocalCluster(UPDATED_NODE_ID + 1);
oldAdminClient = new AdminClient(localCluster);
try {
oldAdminClient.metadataMgmtOps.updateRemoteCluster(oldNode.getId(), updatedCluster, VectorClockUtils.makeClockWithCurrentTime(localCluster.getNodeIds()));
Assert.fail("Invalid node id should have failed");
} catch (VoldemortException ex) {
// Expected, ignore
}
}
use of voldemort.cluster.Cluster in project voldemort by voldemort.
the class VoldemortServerTest method testClusterUpdateWithAutoDetection.
@Test
public void testClusterUpdateWithAutoDetection() throws IOException {
Cluster localCluster = ServerTestUtils.getLocalCluster(1);
VoldemortConfig config = getVoldemortConfig(new Properties());
server = new VoldemortServer(config, localCluster);
server.start();
final int UPDATED_NODE_ID = 3;
Node oldNode = localCluster.getNodes().iterator().next();
// For single local node, host matcher is not used.
config.setNodeIdImplementation(new NodeIdHostMatcher(UPDATED_NODE_ID));
Cluster updatedCluster = ServerTestUtils.getLocalCluster(UPDATED_NODE_ID + 1);
oldAdminClient = new AdminClient(localCluster);
List<Node> newNodes = Lists.newArrayList();
for (Node node : updatedCluster.getNodes()) {
if (node.getId() != UPDATED_NODE_ID) {
newNodes.add(node);
}
}
Node nodeToBeReplaced = updatedCluster.getNodeById(UPDATED_NODE_ID);
Node updatedNode = new Node(UPDATED_NODE_ID, oldNode.getHost(), oldNode.getHttpPort(), oldNode.getSocketPort(), oldNode.getAdminPort(), nodeToBeReplaced.getPartitionIds());
newNodes.add(updatedNode);
Cluster updatedClusterWithCorrectNode = new Cluster("updated-cluster", newNodes);
oldAdminClient.metadataMgmtOps.updateRemoteCluster(oldNode.getId(), updatedClusterWithCorrectNode, VectorClockUtils.makeClockWithCurrentTime(localCluster.getNodeIds()));
Assert.assertEquals("Identity node is not auto detected", UPDATED_NODE_ID, server.getIdentityNode().getId());
Assert.assertEquals("Voldemort config is not updated", UPDATED_NODE_ID, server.getVoldemortConfig().getNodeId());
Assert.assertEquals("Metadata store is not updated", UPDATED_NODE_ID, server.getMetadataStore().getNodeId());
}
use of voldemort.cluster.Cluster in project voldemort by voldemort.
the class VoldemortServerTest method testNodeIdDetection.
@Test
public void testNodeIdDetection() throws IOException {
final int NUM_NODES = 10;
final int NODE_ID = 5;
VoldemortConfig config = getVoldemortConfig(new Properties());
final String SOMEHOST = "host" + NODE_ID;
config.setNodeIdImplementation(new MockHostMatcher(SOMEHOST));
List<String> hostNames = Lists.newArrayList();
for (int i = 0; i < NUM_NODES; i++) {
hostNames.add("host" + i);
}
Assert.assertEquals("At first no node Id", -1, config.getNodeId());
Cluster cluster = HostMatcherTest.getCluster(hostNames);
server = new VoldemortServer(config, cluster);
server.start();
Assert.assertEquals("Node id is not auto detected", NODE_ID, config.getNodeId());
Assert.assertEquals("Node id is not auto detected", NODE_ID, server.getMetadataStore().getNodeId());
}
use of voldemort.cluster.Cluster in project voldemort by voldemort.
the class GossiperTest method attemptStartAdditionalServer.
private Cluster attemptStartAdditionalServer() throws IOException {
// Set up a new cluster that is one bigger than the original cluster
int originalSize = cluster.getNumberOfNodes();
int numOriginalPorts = originalSize * 3;
int[] ports = new int[numOriginalPorts + 3];
for (int i = 0, j = 0; i < originalSize; i++, j += 3) {
Node node = cluster.getNodeById(i);
System.arraycopy(new int[] { node.getHttpPort(), node.getSocketPort(), node.getAdminPort() }, 0, ports, j, 3);
}
System.arraycopy(ServerTestUtils.findFreePorts(3), 0, ports, numOriginalPorts, 3);
// Create a new partitioning scheme with room for a new server
final Cluster newCluster = ServerTestUtils.getLocalCluster(originalSize + 1, ports, new int[][] { { 0, 4, 8 }, { 1, 5, 9 }, { 2, 6, 10 }, { 3, 7, 11 } });
// Create a new server
VoldemortServer newServer = ServerTestUtils.startVoldemortServer(socketStoreFactory, ServerTestUtils.createServerConfig(useNio, 3, TestUtils.createTempDir().getAbsolutePath(), null, storesXmlfile, props), newCluster);
// This step is only reached if startVoldemortServer does *not* throw a
// BindException due to TOCTOU problem with getLocalCluster
servers.add(newServer);
return newCluster;
}
use of voldemort.cluster.Cluster in project voldemort by voldemort.
the class GossiperTest method testGossiper.
// Protect against this test running forever until the root cause of running
// forever is found.
@Test(timeout = 1800)
public void testGossiper() throws Exception {
Cluster newCluster = null;
boolean startedAdditionalServer = false;
while (!startedAdditionalServer) {
try {
newCluster = attemptStartAdditionalServer();
startedAdditionalServer = true;
} catch (IOException ioe) {
logger.warn("Caught an IOException when attempting to start additional server. Will print stacktrace and then attempt to start additional server again.");
ioe.printStackTrace();
}
}
// Get the new cluster.xml
AdminClient localAdminClient = getAdminClient(newCluster);
Versioned<String> versionedClusterXML = localAdminClient.metadataMgmtOps.getRemoteMetadata(3, MetadataStore.CLUSTER_KEY);
// Increment the version, let what would be the "donor node" know about
// it to seed the Gossip.
Version version = versionedClusterXML.getVersion();
((VectorClock) version).incrementVersion(3, ((VectorClock) version).getTimestamp() + 1);
((VectorClock) version).incrementVersion(0, ((VectorClock) version).getTimestamp() + 1);
localAdminClient.metadataMgmtOps.updateRemoteMetadata(0, MetadataStore.CLUSTER_KEY, versionedClusterXML);
localAdminClient.metadataMgmtOps.updateRemoteMetadata(3, MetadataStore.CLUSTER_KEY, versionedClusterXML);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
// Wait up to five seconds for Gossip to spread
final Cluster newFinalCluster = newCluster;
try {
TestUtils.assertWithBackoff(5000, new Attempt() {
public void checkCondition() {
int serversSeen = 0;
// Now verify that we have gossiped correctly
for (VoldemortServer server : servers) {
Cluster clusterAtServer = server.getMetadataStore().getCluster();
int nodeId = server.getMetadataStore().getNodeId();
assertEquals("server " + nodeId + " has heard " + " the gossip about number of nodes", clusterAtServer.getNumberOfNodes(), newFinalCluster.getNumberOfNodes());
assertEquals("server " + nodeId + " has heard " + " the gossip about partitions", clusterAtServer.getNodeById(nodeId).getPartitionIds(), newFinalCluster.getNodeById(nodeId).getPartitionIds());
serversSeen++;
}
assertEquals("saw all servers", serversSeen, servers.size());
}
});
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
Aggregations