Search in sources :

Example 71 with Cluster

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
    }
}
Also used : Node(voldemort.cluster.Node) Cluster(voldemort.cluster.Cluster) Properties(java.util.Properties) VoldemortException(voldemort.VoldemortException) AdminClient(voldemort.client.protocol.admin.AdminClient) Test(org.junit.Test)

Example 72 with Cluster

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());
}
Also used : Node(voldemort.cluster.Node) Cluster(voldemort.cluster.Cluster) Properties(java.util.Properties) AdminClient(voldemort.client.protocol.admin.AdminClient) Test(org.junit.Test)

Example 73 with Cluster

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());
}
Also used : Cluster(voldemort.cluster.Cluster) Properties(java.util.Properties) Test(org.junit.Test)

Example 74 with Cluster

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;
}
Also used : Node(voldemort.cluster.Node) Cluster(voldemort.cluster.Cluster) VoldemortServer(voldemort.server.VoldemortServer)

Example 75 with Cluster

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();
    }
}
Also used : Attempt(voldemort.Attempt) Version(voldemort.versioning.Version) VectorClock(voldemort.versioning.VectorClock) Cluster(voldemort.cluster.Cluster) IOException(java.io.IOException) VoldemortServer(voldemort.server.VoldemortServer) AdminClient(voldemort.client.protocol.admin.AdminClient) Test(org.junit.Test)

Aggregations

Cluster (voldemort.cluster.Cluster)197 Test (org.junit.Test)74 StoreDefinition (voldemort.store.StoreDefinition)74 Node (voldemort.cluster.Node)72 ArrayList (java.util.ArrayList)51 HashMap (java.util.HashMap)47 ByteArray (voldemort.utils.ByteArray)33 AdminClient (voldemort.client.protocol.admin.AdminClient)26 ClusterTestUtils (voldemort.ClusterTestUtils)25 VoldemortException (voldemort.VoldemortException)24 List (java.util.List)23 ClusterMapper (voldemort.xml.ClusterMapper)23 File (java.io.File)20 StoreDefinitionsMapper (voldemort.xml.StoreDefinitionsMapper)18 Zone (voldemort.cluster.Zone)17 Versioned (voldemort.versioning.Versioned)17 Properties (java.util.Properties)16 IOException (java.io.IOException)15 VoldemortServer (voldemort.server.VoldemortServer)15 RoutingStrategyFactory (voldemort.routing.RoutingStrategyFactory)14