use of com.github.ambry.utils.MockTime in project ambry by linkedin.
the class ServerHardDeleteTest method initialize.
@Before
public void initialize() throws Exception {
mockClusterAgentsFactory = new MockClusterAgentsFactory(false, true, 1, 1, 1);
mockClusterMap = mockClusterAgentsFactory.getClusterMap();
notificationSystem = new MockNotificationSystem(mockClusterMap);
time = new MockTime(SystemTime.getInstance().milliseconds());
Properties props = new Properties();
props.setProperty("host.name", mockClusterMap.getDataNodes().get(0).getHostname());
props.setProperty("port", Integer.toString(mockClusterMap.getDataNodes().get(0).getPort()));
props.setProperty("store.data.flush.interval.seconds", "1");
props.setProperty("store.enable.hard.delete", "true");
props.setProperty("store.deleted.message.retention.hours", "168");
props.setProperty("server.handle.undelete.request.enabled", "true");
props.setProperty("clustermap.cluster.name", "test");
props.setProperty("clustermap.datacenter.name", "DC1");
props.setProperty("clustermap.host.name", "localhost");
props.setProperty("clustermap.default.partition.class", MockClusterMap.DEFAULT_PARTITION_CLASS);
TestSSLUtils.addHttp2Properties(props, SSLFactory.Mode.SERVER, true);
VerifiableProperties propverify = new VerifiableProperties(props);
server = new AmbryServer(propverify, mockClusterAgentsFactory, notificationSystem, time);
server.startup();
}
use of com.github.ambry.utils.MockTime in project ambry by linkedin.
the class ServerPlaintextTest method initializeTests.
@Before
public void initializeTests() throws Exception {
routerProps = new Properties();
routerProps.setProperty("kms.default.container.key", TestUtils.getRandomKey(32));
routerProps.setProperty("clustermap.default.partition.class", MockClusterMap.DEFAULT_PARTITION_CLASS);
Properties serverProperties = new Properties();
TestSSLUtils.addHttp2Properties(serverProperties, SSLFactory.Mode.SERVER, true);
plaintextCluster = new MockCluster(serverProperties, false, new MockTime(SystemTime.getInstance().milliseconds()));
notificationSystem = new MockNotificationSystem(plaintextCluster.getClusterMap());
plaintextCluster.initializeServers(notificationSystem);
}
use of com.github.ambry.utils.MockTime in project ambry by linkedin.
the class ServerSSLTest method initializeTests.
@Before
public void initializeTests() throws Exception {
trustStoreFile = File.createTempFile("truststore", ".jks");
clientSSLConfig1 = new SSLConfig(TestSSLUtils.createSslProps("DC2,DC3", SSLFactory.Mode.CLIENT, trustStoreFile, "client1"));
clientSSLConfig2 = new SSLConfig(TestSSLUtils.createSslProps("DC1,DC3", SSLFactory.Mode.CLIENT, trustStoreFile, "client2"));
clientSSLConfig3 = new SSLConfig(TestSSLUtils.createSslProps("DC1,DC2", SSLFactory.Mode.CLIENT, trustStoreFile, "client3"));
serverSSLProps = new Properties();
TestSSLUtils.addSSLProperties(serverSSLProps, "DC1,DC2,DC3", SSLFactory.Mode.SERVER, trustStoreFile, "server");
TestSSLUtils.addHttp2Properties(serverSSLProps, SSLFactory.Mode.SERVER, true);
routerProps = new Properties();
routerProps.setProperty("kms.default.container.key", TestUtils.getRandomKey(32));
routerProps.setProperty("clustermap.default.partition.class", MockClusterMap.DEFAULT_PARTITION_CLASS);
TestSSLUtils.addSSLProperties(routerProps, "DC1,DC2,DC3", SSLFactory.Mode.CLIENT, trustStoreFile, "router-client");
sslCluster = new MockCluster(serverSSLProps, false, new MockTime(SystemTime.getInstance().milliseconds()));
notificationSystem = new MockNotificationSystem(sslCluster.getClusterMap());
sslCluster.initializeServers(notificationSystem);
// client
sslFactory = SSLFactory.getNewInstance(clientSSLConfig1);
SSLContext sslContext = sslFactory.getSSLContext();
clientSSLSocketFactory1 = sslContext.getSocketFactory();
sslFactory = SSLFactory.getNewInstance(clientSSLConfig2);
sslContext = sslFactory.getSSLContext();
clientSSLSocketFactory2 = sslContext.getSocketFactory();
sslFactory = SSLFactory.getNewInstance(clientSSLConfig3);
sslContext = sslFactory.getSSLContext();
clientSSLSocketFactory3 = sslContext.getSocketFactory();
}
use of com.github.ambry.utils.MockTime in project ambry by linkedin.
the class StatsManagerTest method testReplicaFromOfflineToDropped.
/**
* Test Offline-To-Dropped transition (both failure and success cases)
* @throws Exception
*/
@Test
public void testReplicaFromOfflineToDropped() throws Exception {
ClusterMapConfig clusterMapConfig = new ClusterMapConfig(verifiableProperties);
ReplicationConfig replicationConfig = new ReplicationConfig(verifiableProperties);
StoreConfig storeConfig = new StoreConfig(verifiableProperties);
MockClusterMap clusterMap = new MockClusterMap();
DataNodeId currentNode = clusterMap.getDataNodeIds().get(0);
List<ReplicaId> localReplicas = clusterMap.getReplicaIds(currentNode);
StorageManager storageManager = new StorageManager(storeConfig, new DiskManagerConfig(verifiableProperties), Utils.newScheduler(1, true), new MetricRegistry(), null, clusterMap, currentNode, null, Collections.singletonList(clusterParticipant), new MockTime(), null, new InMemAccountService(false, false));
storageManager.start();
MockStoreKeyConverterFactory storeKeyConverterFactory = new MockStoreKeyConverterFactory(null, null);
storeKeyConverterFactory.setConversionMap(new HashMap<>());
MockReplicationManager mockReplicationManager = new MockReplicationManager(replicationConfig, clusterMapConfig, storeConfig, storageManager, clusterMap, currentNode, storeKeyConverterFactory, clusterParticipant);
MockStatsManager mockStatsManager = new MockStatsManager(storageManager, localReplicas, new MetricRegistry(), statsManagerConfig, clusterParticipant);
// 1. attempt to remove replica while store is still running (remove store failure case)
ReplicaId replicaToDrop = localReplicas.get(0);
try {
clusterParticipant.onPartitionBecomeDroppedFromOffline(replicaToDrop.getPartitionId().toPathString());
fail("should fail because store is still running");
} catch (StateTransitionException e) {
assertEquals("Error code doesn't match", ReplicaOperationFailure, e.getErrorCode());
}
// 2. shutdown the store but introduce file deletion failure (put a invalid dir in store dir)
storageManager.shutdownBlobStore(replicaToDrop.getPartitionId());
File invalidDir = new File(replicaToDrop.getReplicaPath(), "invalidDir");
invalidDir.deleteOnExit();
assertTrue("Couldn't create dir within store dir", invalidDir.mkdir());
assertTrue("Could not make unreadable", invalidDir.setReadable(false));
try {
clusterParticipant.onPartitionBecomeDroppedFromOffline(replicaToDrop.getPartitionId().toPathString());
fail("should fail because store deletion fails");
} catch (StateTransitionException e) {
assertEquals("Error code doesn't match", ReplicaOperationFailure, e.getErrorCode());
}
// reset permission to allow deletion to succeed.
assertTrue("Could not make readable", invalidDir.setReadable(true));
assertTrue("Could not delete invalid dir", invalidDir.delete());
// 3. success case (remove another replica because previous replica has been removed from in-mem data structures)
ReplicaId replica = localReplicas.get(1);
storageManager.shutdownBlobStore(replica.getPartitionId());
MockHelixParticipant mockHelixParticipant = Mockito.spy(clusterParticipant);
doNothing().when(mockHelixParticipant).setPartitionDisabledState(anyString(), anyBoolean());
mockHelixParticipant.onPartitionBecomeDroppedFromOffline(replica.getPartitionId().toPathString());
// verify that the replica is no longer present in StorageManager
assertNull("Store of removed replica should not exist", storageManager.getStore(replica.getPartitionId(), true));
// purposely remove the same replica in ReplicationManager again to verify it no longer exists
assertFalse("Should return false because replica no longer exists", mockReplicationManager.removeReplica(replica));
// purposely remove the same replica in StatsManager again to verify it no longer exists
assertFalse("Should return false because replica no longer exists", mockStatsManager.removeReplica(replica));
verify(mockHelixParticipant).setPartitionDisabledState(replica.getPartitionId().toPathString(), false);
storageManager.shutdown();
mockStatsManager.shutdown();
}
use of com.github.ambry.utils.MockTime in project ambry by linkedin.
the class StatsManagerTest method testStatsManagerWithProblematicStores.
/**
* Test to verify the behavior when dealing with {@link Store} that is null and when {@link StoreException} is thrown.
* @throws Exception
*/
@Test
public void testStatsManagerWithProblematicStores() throws Exception {
DataNodeId dataNodeId = new MockDataNodeId(Collections.singletonList(new Port(6667, PortType.PLAINTEXT)), Collections.singletonList("/tmp"), "DC1");
Map<PartitionId, Store> problematicStoreMap = new HashMap<>();
PartitionId partitionId1 = new MockPartitionId(1, MockClusterMap.DEFAULT_PARTITION_CLASS, Collections.singletonList((MockDataNodeId) dataNodeId), 0);
PartitionId partitionId2 = new MockPartitionId(2, MockClusterMap.DEFAULT_PARTITION_CLASS, Collections.singletonList((MockDataNodeId) dataNodeId), 0);
problematicStoreMap.put(partitionId1, null);
Store exceptionStore = new MockStore(new MockStoreStats(new HashMap<>(), true));
problematicStoreMap.put(partitionId2, exceptionStore);
StatsManager testStatsManager = new StatsManager(new MockStorageManager(problematicStoreMap, dataNodeId), Arrays.asList(partitionId1.getReplicaIds().get(0), partitionId2.getReplicaIds().get(0)), new MetricRegistry(), statsManagerConfig, new MockTime(), null, null, inMemoryAccountService);
List<PartitionId> unreachablePartitions = new ArrayList<>();
Map<Long, Map<Short, Map<Short, ContainerStorageStats>>> hostAccountStorageStatsMap = new HashMap<>();
for (PartitionId partitionId : problematicStoreMap.keySet()) {
testStatsManager.collectAndAggregateAccountStorageStats(hostAccountStorageStatsMap, partitionId, unreachablePartitions);
}
assertEquals("Aggregated map should not contain any value", 0L, hostAccountStorageStatsMap.size());
assertEquals("Unreachable store count mismatch with expected value", 2, unreachablePartitions.size());
StatsManager.AccountStatsPublisher publisher = testStatsManager.new AccountStatsPublisher(accountStatsStore);
publisher.run();
HostAccountStorageStatsWrapper statsWrapper = accountStatsStore.queryHostAccountStorageStatsByHost("localhost", 0);
List<String> unreachableStores = statsWrapper.getHeader().getUnreachableStores();
assertTrue("The unreachable store list should contain Partition1 and Partition2", unreachableStores.containsAll(Arrays.asList(partitionId1.toPathString(), partitionId2.toPathString())));
// test for the scenario where some stores are healthy and some are bad
Map<PartitionId, Store> mixedStoreMap = new HashMap<>(storeMap);
unreachablePartitions.clear();
PartitionId partitionId3 = new MockPartitionId(3, MockClusterMap.DEFAULT_PARTITION_CLASS, Collections.singletonList((MockDataNodeId) dataNodeId), 0);
PartitionId partitionId4 = new MockPartitionId(4, MockClusterMap.DEFAULT_PARTITION_CLASS, Collections.singletonList((MockDataNodeId) dataNodeId), 0);
mixedStoreMap.put(partitionId3, null);
mixedStoreMap.put(partitionId4, exceptionStore);
testStatsManager = new StatsManager(new MockStorageManager(mixedStoreMap, dataNodeId), Arrays.asList(partitionId3.getReplicaIds().get(0), partitionId4.getReplicaIds().get(0)), new MetricRegistry(), statsManagerConfig, new MockTime(), null, null, inMemoryAccountService);
hostAccountStorageStatsMap.clear();
for (PartitionId partitionId : mixedStoreMap.keySet()) {
testStatsManager.collectAndAggregateAccountStorageStats(hostAccountStorageStatsMap, partitionId, unreachablePartitions);
}
assertEquals("Unreachable store count mismatch with expected value", 2, unreachablePartitions.size());
// test fetchSnapshot method in StatsManager
unreachablePartitions.clear();
// partition 0, 1, 2 are healthy stores, partition 3, 4 are bad ones.
for (PartitionId partitionId : mixedStoreMap.keySet()) {
Map<Short, Map<Short, ContainerStorageStats>> containerStatsMapForPartition = hostAccountStorageStatsMap.get(partitionId.getId());
if (partitionId.getId() < 3) {
assertEquals("Actual map does not match with expected snapshot with partition id " + partitionId.toPathString(), hostAccountStorageStats.getStorageStats().get(partitionId.getId()), containerStatsMapForPartition);
}
}
}
Aggregations