/*
* Copyright 2012-2013 LinkedIn, Inc
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package voldemort.store.system;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Properties;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import voldemort.ClusterTestUtils;
import voldemort.ServerTestUtils;
import voldemort.TestUtils;
import voldemort.client.AbstractStoreClientFactory;
import voldemort.client.ClientConfig;
import voldemort.client.SocketStoreClientFactory;
import voldemort.client.SystemStoreClient;
import voldemort.client.SystemStoreClientFactory;
import voldemort.cluster.Cluster;
import voldemort.server.VoldemortConfig;
import voldemort.server.VoldemortServer;
import voldemort.store.StoreDefinition;
import voldemort.store.metadata.MetadataStore;
import voldemort.store.socket.SocketStoreFactory;
import voldemort.store.socket.clientrequest.ClientRequestExecutorPool;
/**
* Test class to verify the SystemStore (used to interact with the system
* metadata stores managed by the cluster).
*
* @author csoman
*
*/
@RunWith(Parameterized.class)
public class SystemStoreTest {
private static String storesXmlfile = "test/common/voldemort/config/stores.xml";
String[] bootStrapUrls = null;
private String clusterXml;
private SocketStoreFactory socketStoreFactory = new ClientRequestExecutorPool(2,
10000,
100000,
32 * 1024);
private VoldemortServer[] servers;
private Cluster cluster;
public static String socketUrl = "";
private final Integer clientZoneId;
private StoreDefinition storeDef;
private List<StoreDefinition> storeDefs;
@Parameterized.Parameters
public static Collection<Object[]> configs() {
return Arrays.asList(new Object[][]{
{0, ClusterTestUtils.getZZZCluster(), ClusterTestUtils.getZZZ322StoreDefs("memory")},
{1, ClusterTestUtils.getZZZCluster(), ClusterTestUtils.getZZZ322StoreDefs("memory")},
{2, ClusterTestUtils.getZZZCluster(), ClusterTestUtils.getZZZ322StoreDefs("memory")},
{1, ClusterTestUtils.getZ1Z3ClusterWithNonContiguousNodeIds(), ClusterTestUtils.getZ1Z3322StoreDefs("memory")},
{3, ClusterTestUtils.getZ1Z3ClusterWithNonContiguousNodeIds(), ClusterTestUtils.getZ1Z3322StoreDefs("memory")}});
}
public SystemStoreTest(Integer clientZoneId, Cluster cluster, List<StoreDefinition> storeDefs) {
this.clientZoneId = clientZoneId;
this.cluster = cluster;
this.storeDefs = storeDefs;
this.storeDef = storeDefs.get(0);
}
@Before
public void setUp() throws Exception {
servers = new VoldemortServer[cluster.getNodeIds().size()];
int i = 0;
for(Integer nodeId: cluster.getNodeIds()) {
VoldemortConfig config = ServerTestUtils.createServerConfigWithDefs(true,
nodeId,
TestUtils.createTempDir()
.getAbsolutePath(),
cluster,
storeDefs,
new Properties());
VoldemortServer server = ServerTestUtils.startVoldemortServer(socketStoreFactory,
config);
servers[i++] = server;
}
socketUrl = servers[0].getIdentityNode().getSocketUrl().toString();
ClientConfig clientConfig = new ClientConfig().setMaxTotalConnections(4)
.setMaxConnectionsPerNode(4)
.setBootstrapUrls(socketUrl);
SocketStoreClientFactory socketFactory = new SocketStoreClientFactory(clientConfig);
bootStrapUrls = new String[1];
bootStrapUrls[0] = socketUrl;
clusterXml = ((AbstractStoreClientFactory) socketFactory).bootstrapMetadataWithRetries(MetadataStore.CLUSTER_KEY);
}
@After
public void tearDown() throws Exception {
for(VoldemortServer server: servers) {
ServerTestUtils.stopVoldemortServer(server);
}
ClusterTestUtils.reset();
}
@Test
public void testBasicStore() {
try {
ClientConfig clientConfig = new ClientConfig();
clientConfig.setBootstrapUrls(bootStrapUrls).setClientZoneId(this.clientZoneId);
SystemStoreClientFactory<String, String> systemStoreFactory = new SystemStoreClientFactory<String, String>(clientConfig);
SystemStoreClient<String, String> sysVersionStore = systemStoreFactory.createSystemStore(SystemStoreConstants.SystemStoreName.voldsys$_metadata_version_persistence.name());
long storesVersion = 1;
sysVersionStore.putSysStore("stores.xml", Long.toString(storesVersion));
long version = Long.parseLong(sysVersionStore.getValueSysStore("stores.xml"));
assertEquals("Received incorrect version from the voldsys$_metadata_version system store",
storesVersion,
version);
} catch(Exception e) {
fail("Failed to create the default System Store : " + e.getMessage());
}
}
@Test
public void testCustomClusterXmlStore() {
try {
ClientConfig clientConfig = new ClientConfig();
clientConfig.setBootstrapUrls(bootStrapUrls).setClientZoneId(this.clientZoneId);
SystemStoreClientFactory<String, String> systemStoreFactory = new SystemStoreClientFactory<String, String>(clientConfig);
SystemStoreClient<String, String> sysVersionStore = systemStoreFactory.createSystemStore(SystemStoreConstants.SystemStoreName.voldsys$_metadata_version_persistence.name(),
this.clusterXml,
null);
long storesVersion = 1;
sysVersionStore.putSysStore("stores.xml", Long.toString(storesVersion));
long version = Long.parseLong(sysVersionStore.getValueSysStore("stores.xml"));
assertEquals("Received incorrect version from the voldsys$_metadata_version system store",
storesVersion,
version);
} catch(Exception e) {
fail("Failed to create System Store with custom cluster Xml: " + e.getMessage());
}
}
@Test
public void testIllegalSystemStore() {
try {
ClientConfig clientConfig = new ClientConfig();
clientConfig.setBootstrapUrls(bootStrapUrls).setClientZoneId(this.clientZoneId);
SystemStoreClientFactory<String, String> systemStoreFactory = new SystemStoreClientFactory<String, String>(clientConfig);
SystemStoreClient sysVersionStore = systemStoreFactory.createSystemStore("test-store",
this.clusterXml,
null);
fail("Should not execute this. We can only connect to system store with a 'voldsys$' prefix.");
} catch(Exception e) {
// This is fine.
}
}
}