package io.eguan.vold;
/*
* #%L
* Project eguan
* %%
* Copyright (C) 2012 - 2017 Oodrive
* %%
* 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.
* #L%
*/
import io.eguan.srv.BasicIopsTestHelper;
import io.eguan.srv.ClientBasicIops;
import io.eguan.vold.model.DeviceMXBean;
import io.eguan.vold.model.DummyMBeanServer;
import io.eguan.vold.model.SnapshotMXBean;
import io.eguan.vold.model.VoldTestHelper;
import io.eguan.vold.model.VvrManagerMXBean;
import io.eguan.vold.model.VvrManagerTestUtils;
import java.io.File;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public abstract class TestMultiVoldBasicIopsOnTargetAbstractL extends TestMultiVoldAbstract {
// 3 nodes, vvr started automatically
public TestMultiVoldBasicIopsOnTargetAbstractL() {
ioHelper = new BasicIopsTestHelper(BLOCKSIZE, NUMBLOCKS, LENGTH);
}
private ClientBasicIops client1;
private ClientBasicIops client2;
private final BasicIopsTestHelper ioHelper;
private final String deviceName1 = "dev0";
private final String deviceName2 = "dev1";
private final String anotherDeviceName1 = "anotherDev0";
private final String anotherDeviceName2 = "anotherDev1";
private final long deviceSize = 8192 * 1024L * 1024L;
private final long anotherDeviceSize = 8192 * 1024L;
private VvrManagerMXBean vvrManager1;
private DummyMBeanServer server1;
private DummyMBeanServer server2;
private DummyMBeanServer server3;
private VoldTestHelper voldTestHelper1;
private VoldTestHelper voldTestHelper2;
private VoldTestHelper voldTestHelper3;
private DeviceMXBean d1;
private SnapshotMXBean rootSnapshot;
@BeforeClass
public static final void init() throws Exception {
setUpVolds(3, 3, true);
}
/**
* Create a new client.
*
* @param serverIndex
*
* @return the new client
*/
public abstract ClientBasicIops createClient(final int serverIndex);
@Before
public void initialize() throws Exception {
server1 = getDummyMBeanServer(0);
Assert.assertNotNull(server1);
voldTestHelper1 = getVoldTestHelper(0);
Assert.assertNotNull(voldTestHelper1);
vvrManager1 = VvrManagerTestUtils.getVvrManagerMXBean(server1, VOLD_OWNER);
Assert.assertNotNull(vvrManager1);
server2 = getDummyMBeanServer(1);
Assert.assertNotNull(server2);
voldTestHelper2 = getVoldTestHelper(1);
Assert.assertNotNull(voldTestHelper2);
server3 = getDummyMBeanServer(2);
Assert.assertNotNull(server3);
voldTestHelper3 = getVoldTestHelper(2);
Assert.assertNotNull(voldTestHelper3);
// Create a vvr on node 1
rootSnapshot = createVvrStarted();
Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 2, server1.getNbMXBeans());
// Check if that VVR is created into the second VVR manager
Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 2, server2.getNbMXBeans());
// Check if that VVR is created into the third VVR manager
Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 2, server3.getNbMXBeans());
// Create and activate a RW device on node 1
d1 = VvrManagerTestUtils.createDevice(server1, voldTestHelper1, rootSnapshot, vvrUuid, deviceName1, deviceSize);
setDeviceRW(server1, voldTestHelper1, vvrUuid, d1);
Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 3, server1.getNbMXBeans());
// Check if that device is created into the second VVR manager
Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 3, server2.getNbMXBeans());
// Check if that device is created into the third VVR manager
Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 3, server3.getNbMXBeans());
// Create clients for the two first servers
client1 = createClient(0);
client2 = createClient(1);
}
@Test
public void testWriteReadByTwoNodes() throws Exception {
// Write data on device from node 1
final File data = ioHelper.initiatorReadWriteData(client1, deviceName1, deviceSize);
try {
// Deactivate device on node 1
setDeviceDeActivated(server1, voldTestHelper1, vvrUuid, d1);
setDeviceRO(server1, voldTestHelper1, vvrUuid, d1);
setDeviceRO(server2, voldTestHelper2, vvrUuid, getDeviceMXBeanOnOtherServer(vvrUuid, d1, server2));
// Read data on node 1 and 2
ioHelper.initiatorReadData(data, client1, deviceName1, deviceSize);
ioHelper.initiatorReadData(data, client2, deviceName1, deviceSize);
}
finally {
data.delete();
}
}
@Test
public void testWriteReadAfterStopNodeTwoDevices() throws Exception {
// Stop server2
stopNode(1);
// Create and activate a RW device on node 1
final DeviceMXBean d2 = VvrManagerTestUtils.createDevice(server1, voldTestHelper1, rootSnapshot, vvrUuid,
deviceName2, deviceSize);
setDeviceRW(server1, voldTestHelper1, vvrUuid, d2);
// Write data on device0 from node 1
final File data0 = ioHelper.initiatorReadWriteData(client1, deviceName1, deviceSize);
try {
// Deactivate device0 on node 1
setDeviceDeActivated(server1, voldTestHelper1, vvrUuid, d1);
setDeviceRO(server1, voldTestHelper1, vvrUuid, d1);
// Write data on device1 from node 1
final File data1 = ioHelper.initiatorReadWriteData(client1, deviceName2, deviceSize);
try {
// Restart server2
startNode(1);
server2 = getDummyMBeanServer(1);
Assert.assertNotNull(server2);
voldTestHelper2 = getVoldTestHelper(1);
Assert.assertNotNull(voldTestHelper2);
setDeviceRO(server2, voldTestHelper2, vvrUuid, waitDeviceMXBeanOnOtherServer(vvrUuid, d1, server2));
// Deactivate device1 on node 1
setDeviceDeActivated(server1, voldTestHelper1, vvrUuid, d2);
setDeviceRO(server1, voldTestHelper1, vvrUuid, d2);
setDeviceRO(server2, voldTestHelper2, vvrUuid, waitDeviceMXBeanOnOtherServer(vvrUuid, d2, server2));
// Read data0 on node 2
ioHelper.initiatorReadData(data0, client2, deviceName1, deviceSize);
// Stop the first node, to read from node 3
stopNode(0);
// Read data on node 2
ioHelper.initiatorReadData(data1, client2, deviceName2, deviceSize);
// Stop the last node, to read from local Ibs
stopNode(2);
// Read data on node 2
ioHelper.initiatorReadData(data0, client2, deviceName1, deviceSize);
ioHelper.initiatorReadData(data1, client2, deviceName2, deviceSize);
}
finally {
data1.delete();
}
}
finally {
data0.delete();
}
}
@Test
public void testWriteReadTwoDevices() throws Exception {
// Create and activate a RW device on node 1
final DeviceMXBean d2 = VvrManagerTestUtils.createDevice(server1, voldTestHelper1, rootSnapshot, vvrUuid,
deviceName2, deviceSize);
setDeviceRW(server1, voldTestHelper1, vvrUuid, d2);
// Create another client on the server 1
final ClientBasicIops anotherClient1 = createClient(0);
// Write on the two devices on the server1
final ExecutorService executor = Executors.newFixedThreadPool(2);
try {
final Future<File> future1 = ioHelper.multiThreadRW(executor, deviceName1, client1, deviceSize);
final Future<File> future2 = ioHelper.multiThreadRW(executor, deviceName2, anotherClient1, deviceSize);
final File dataDump1 = future1.get(1, TimeUnit.MINUTES);
try {
final File dataDump2 = future2.get(1, TimeUnit.MINUTES);
try {
// Set the device 2 read only on the two servers
setDeviceDeActivated(server1, voldTestHelper1, vvrUuid, d2);
setDeviceRO(server1, voldTestHelper1, vvrUuid, d2);
setDeviceRO(server2, voldTestHelper2, vvrUuid, getDeviceMXBeanOnOtherServer(vvrUuid, d2, server2));
// Set the device 1 read only on the two servers
setDeviceDeActivated(server1, voldTestHelper1, vvrUuid, d1);
setDeviceRO(server1, voldTestHelper1, vvrUuid, d1);
setDeviceRO(server2, voldTestHelper2, vvrUuid, getDeviceMXBeanOnOtherServer(vvrUuid, d1, server2));
// Check files on server 2
ioHelper.initiatorReadData(dataDump1, client2, deviceName1, deviceSize);
ioHelper.initiatorReadData(dataDump2, client2, deviceName2, deviceSize);
// Check them on the third node
final ClientBasicIops client3 = createClient(2);
setDeviceRO(server3, voldTestHelper3, vvrUuid, getDeviceMXBeanOnOtherServer(vvrUuid, d1, server3));
setDeviceRO(server3, voldTestHelper3, vvrUuid, getDeviceMXBeanOnOtherServer(vvrUuid, d2, server3));
ioHelper.initiatorReadData(dataDump1, client3, deviceName1, deviceSize);
ioHelper.initiatorReadData(dataDump2, client3, deviceName2, deviceSize);
}
finally {
dataDump2.delete();
}
}
finally {
dataDump1.delete();
}
}
finally {
executor.shutdownNow();
}
}
@Test
public void testWriteReadOneDeviceOnTwoNodes() throws Exception {
// Create and activate a RW device on node 2
final DeviceMXBean d2 = VvrManagerTestUtils.createDevice(server2, voldTestHelper2, rootSnapshot, vvrUuid,
deviceName2, deviceSize);
setDeviceRW(server2, voldTestHelper2, vvrUuid, d2);
final ExecutorService executor = Executors.newFixedThreadPool(2);
try {
// Write on the first device on the server1
final Future<File> future1 = ioHelper.multiThreadRW(executor, deviceName1, client1, deviceSize);
// Write on the second device on the server2
final Future<File> future2 = ioHelper.multiThreadRW(executor, deviceName2, client2, deviceSize);
final File dataDump1 = future1.get(1, TimeUnit.MINUTES);
try {
final File dataDump2 = future2.get(1, TimeUnit.MINUTES);
try {
// Set the device 1 read only on the two servers
setDeviceDeActivated(server1, voldTestHelper1, vvrUuid, d1);
setDeviceRO(server1, voldTestHelper1, vvrUuid, d1);
setDeviceRO(server2, voldTestHelper2, vvrUuid, getDeviceMXBeanOnOtherServer(vvrUuid, d1, server2));
// Set the device 2 read only on the two servers
setDeviceDeActivated(server2, voldTestHelper2, vvrUuid, d2);
setDeviceRO(server2, voldTestHelper1, vvrUuid, d2);
setDeviceRO(server1, voldTestHelper1, vvrUuid, getDeviceMXBeanOnOtherServer(vvrUuid, d2, server1));
// Check device 1 on server 2
ioHelper.initiatorReadData(dataDump1, client2, deviceName1, deviceSize);
// Check device 2 on server 1
ioHelper.initiatorReadData(dataDump2, client1, deviceName2, deviceSize);
// Check them on the third node
final ClientBasicIops client3 = createClient(2);
setDeviceRO(server3, voldTestHelper3, vvrUuid, getDeviceMXBeanOnOtherServer(vvrUuid, d1, server3));
setDeviceRO(server3, voldTestHelper3, vvrUuid, getDeviceMXBeanOnOtherServer(vvrUuid, d2, server3));
ioHelper.initiatorReadData(dataDump1, client3, deviceName1, deviceSize);
ioHelper.initiatorReadData(dataDump2, client3, deviceName2, deviceSize);
}
finally {
dataDump2.delete();
}
}
finally {
dataDump1.delete();
}
}
finally {
executor.shutdownNow();
}
}
@Test
public void testWriteReadTwoDevicesOnTwoNodes() throws Exception {
// Create and activate a RW device on node 1
final DeviceMXBean anotherD1 = VvrManagerTestUtils.createDevice(server1, voldTestHelper1, rootSnapshot,
vvrUuid, anotherDeviceName1, anotherDeviceSize);
setDeviceRW(server1, voldTestHelper1, vvrUuid, anotherD1);
// Create and activate two RW device on node 2
final DeviceMXBean d2 = VvrManagerTestUtils.createDevice(server2, voldTestHelper2, rootSnapshot, vvrUuid,
deviceName2, deviceSize);
setDeviceRW(server2, voldTestHelper2, vvrUuid, d2);
final DeviceMXBean anotherD2 = VvrManagerTestUtils.createDevice(server2, voldTestHelper2, rootSnapshot,
vvrUuid, anotherDeviceName2, anotherDeviceSize);
setDeviceRW(server2, voldTestHelper2, vvrUuid, anotherD2);
final ExecutorService executor = Executors.newFixedThreadPool(4);
try {
// Write on the first device on the server1
final Future<File> future1 = ioHelper.multiThreadRW(executor, deviceName1, client1, deviceSize);
// Write on the second device on the server1
final ClientBasicIops anotherClient1 = createClient(0);
final Future<File> anotherFuture1 = ioHelper.multiThreadRW(executor, anotherDeviceName1, anotherClient1,
anotherDeviceSize);
// Write on the first device on the server2
final Future<File> future2 = ioHelper.multiThreadRW(executor, deviceName2, client2, deviceSize);
// Write on the second device on the server2
final ClientBasicIops anotherClient2 = createClient(1);
final Future<File> anotherFuture2 = ioHelper.multiThreadRW(executor, anotherDeviceName2, anotherClient2,
anotherDeviceSize);
final File dataDump1 = future1.get(1, TimeUnit.MINUTES);
try {
final File anotherDataDump1 = anotherFuture1.get(1, TimeUnit.MINUTES);
try {
final File dataDump2 = future2.get(1, TimeUnit.MINUTES);
try {
final File anotherDataDump2 = anotherFuture2.get(1, TimeUnit.MINUTES);
try {
// Set the device 1 read only on the two servers
setDeviceDeActivated(server1, voldTestHelper1, vvrUuid, d1);
setDeviceRO(server1, voldTestHelper1, vvrUuid, d1);
setDeviceRO(server2, voldTestHelper2, vvrUuid,
getDeviceMXBeanOnOtherServer(vvrUuid, d1, server2));
// Set the other device 1 read only on the two servers
setDeviceDeActivated(server1, voldTestHelper1, vvrUuid, anotherD1);
setDeviceRO(server1, voldTestHelper1, vvrUuid, anotherD1);
setDeviceRO(server2, voldTestHelper2, vvrUuid,
getDeviceMXBeanOnOtherServer(vvrUuid, anotherD1, server2));
// Set the device 2 read only on the two servers
setDeviceDeActivated(server2, voldTestHelper2, vvrUuid, d2);
setDeviceRO(server2, voldTestHelper2, vvrUuid, d2);
setDeviceRO(server1, voldTestHelper1, vvrUuid,
getDeviceMXBeanOnOtherServer(vvrUuid, d2, server1));
// Set the other device 2 read only on the two servers
setDeviceDeActivated(server2, voldTestHelper2, vvrUuid, anotherD2);
setDeviceRO(server2, voldTestHelper2, vvrUuid, anotherD2);
setDeviceRO(server1, voldTestHelper1, vvrUuid,
getDeviceMXBeanOnOtherServer(vvrUuid, anotherD2, server1));
// Check device 1 and other device 1 on server 2
ioHelper.initiatorReadData(dataDump1, client2, deviceName1, deviceSize);
ioHelper.initiatorReadData(anotherDataDump1, client2, anotherDeviceName1, anotherDeviceSize);
// Check device 2 and other device 2 on server 1
ioHelper.initiatorReadData(dataDump2, client1, deviceName2, deviceSize);
ioHelper.initiatorReadData(anotherDataDump2, client1, anotherDeviceName2, anotherDeviceSize);
// Check them on the third node
final ClientBasicIops client3 = createClient(2);
setDeviceRO(server3, voldTestHelper3, vvrUuid,
getDeviceMXBeanOnOtherServer(vvrUuid, d1, server3));
setDeviceRO(server3, voldTestHelper3, vvrUuid,
getDeviceMXBeanOnOtherServer(vvrUuid, d2, server3));
setDeviceRO(server3, voldTestHelper3, vvrUuid,
getDeviceMXBeanOnOtherServer(vvrUuid, anotherD1, server3));
setDeviceRO(server3, voldTestHelper3, vvrUuid,
getDeviceMXBeanOnOtherServer(vvrUuid, anotherD2, server3));
ioHelper.initiatorReadData(dataDump1, client3, deviceName1, deviceSize);
ioHelper.initiatorReadData(dataDump2, client3, deviceName2, deviceSize);
ioHelper.initiatorReadData(anotherDataDump1, client3, anotherDeviceName1, anotherDeviceSize);
ioHelper.initiatorReadData(anotherDataDump2, client3, anotherDeviceName2, anotherDeviceSize);
}
finally {
anotherDataDump2.delete();
}
}
finally {
dataDump2.delete();
}
}
finally {
anotherDataDump1.delete();
}
}
finally {
dataDump1.delete();
}
}
finally {
executor.shutdownNow();
}
}
}