diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSCMMXBean.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSCMMXBean.java index 598a65fb48fc..5a9667787d66 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSCMMXBean.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSCMMXBean.java @@ -18,6 +18,7 @@ package org.apache.hadoop.hdds.scm; +import org.apache.ozone.test.NonHATests; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.hadoop.hdds.client.StandaloneReplicationConfig; @@ -27,22 +28,18 @@ import org.apache.hadoop.hdds.scm.container.ContainerInfo; import org.apache.hadoop.hdds.scm.container.ContainerManager; import org.apache.hadoop.hdds.scm.server.StorageContainerManager; -import org.apache.hadoop.ozone.MiniOzoneCluster; -import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.Timeout; import javax.management.MBeanServer; import javax.management.ObjectName; -import java.io.IOException; import java.lang.management.ManagementFactory; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Iterator; import java.util.UUID; -import java.util.concurrent.TimeoutException; import javax.management.openmbean.CompositeData; import javax.management.openmbean.TabularData; @@ -56,35 +53,20 @@ * * This class is to test JMX management interface for scm information. */ +@TestInstance(TestInstance.Lifecycle.PER_CLASS) @Timeout(300) -public class TestSCMMXBean { +public abstract class TestSCMMXBean implements NonHATests.TestCase { public static final Logger LOG = LoggerFactory.getLogger(TestSCMMXBean.class); - private static int numOfDatanodes = 3; - private static MiniOzoneCluster cluster; - private static OzoneConfiguration conf; - private static StorageContainerManager scm; - private static MBeanServer mbs; + private StorageContainerManager scm; + private MBeanServer mbs; @BeforeAll - public static void init() throws IOException, TimeoutException, - InterruptedException { - conf = new OzoneConfiguration(); - cluster = MiniOzoneCluster.newBuilder(conf) - .setNumDatanodes(numOfDatanodes) - .build(); - cluster.waitForClusterToBeReady(); - scm = cluster.getStorageContainerManager(); + void init() { + scm = cluster().getStorageContainerManager(); mbs = ManagementFactory.getPlatformMBeanServer(); } - @AfterAll - public static void shutdown() { - if (cluster != null) { - cluster.shutdown(); - } - } - @Test public void testSCMMXBean() throws Exception { ObjectName bean = new ObjectName( @@ -119,8 +101,8 @@ public void testSCMContainerStateCount() throws Exception { + "component=ServerRuntime"); TabularData data = (TabularData) mbs.getAttribute( bean, "ContainerStateCount"); - Map containerStateCount = scm.getContainerStateCount(); - verifyEquals(data, containerStateCount); + final Map originalContainerStateCount = scm.getContainerStateCount(); + verifyEquals(data, originalContainerStateCount); // Do some changes like allocate containers and change the container states ContainerManager scmContainerManager = scm.getContainerManager(); @@ -154,23 +136,16 @@ public void testSCMContainerStateCount() throws Exception { } + final String closing = HddsProtos.LifeCycleState.CLOSING.name(); + final String closed = HddsProtos.LifeCycleState.CLOSED.name(); + final Map containerStateCount = scm.getContainerStateCount(); + assertThat(containerStateCount.get(closing)) + .isGreaterThanOrEqualTo(originalContainerStateCount.getOrDefault(closing, 0) + 5); + assertThat(containerStateCount.get(closed)) + .isGreaterThanOrEqualTo(originalContainerStateCount.getOrDefault(closed, 0) + 5); data = (TabularData) mbs.getAttribute( bean, "ContainerStateCount"); - containerStateCount = scm.getContainerStateCount(); - - containerStateCount.forEach((k, v) -> { - if (k.equals(HddsProtos.LifeCycleState.CLOSING.toString())) { - assertEquals(5, (int)v); - } else if (k.equals(HddsProtos.LifeCycleState.CLOSED.toString())) { - assertEquals(5, (int)v); - } else { - // Remaining all container state count should be zero. - assertEquals(0, (int)v); - } - }); - verifyEquals(data, containerStateCount); - } diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/container/TestScmApplyTransactionFailure.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/container/TestScmApplyTransactionFailure.java index 9bf46092fa9b..cb1da5606f4d 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/container/TestScmApplyTransactionFailure.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/container/TestScmApplyTransactionFailure.java @@ -17,14 +17,11 @@ */ package org.apache.hadoop.hdds.scm.container; -import org.apache.hadoop.hdds.HddsConfigKeys; import org.apache.hadoop.hdds.client.RatisReplicationConfig; import org.apache.hadoop.hdds.client.ReplicationConfig; -import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.protocol.proto.HddsProtos; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ContainerInfoProto; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationFactor; -import org.apache.hadoop.hdds.scm.ScmConfigKeys; import org.apache.hadoop.hdds.scm.exceptions.SCMException; import org.apache.hadoop.hdds.scm.pipeline.DuplicatedPipelineIdException; import org.apache.hadoop.hdds.scm.pipeline.InvalidPipelineStateException; @@ -32,16 +29,15 @@ import org.apache.hadoop.hdds.scm.pipeline.Pipeline.PipelineState; import org.apache.hadoop.hdds.scm.pipeline.PipelineManagerImpl; import org.apache.hadoop.hdds.scm.server.StorageContainerManager; -import org.apache.hadoop.ozone.MiniOzoneCluster; import org.apache.hadoop.util.Time; +import org.apache.ozone.test.HATests; import org.apache.ratis.protocol.exceptions.StateMachineException; -import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.Timeout; import java.util.List; -import java.util.concurrent.TimeUnit; import static org.apache.hadoop.ozone.ClientVersion.CURRENT_VERSION; import static org.junit.jupiter.api.Assertions.assertInstanceOf; @@ -51,41 +47,20 @@ /** * Test-cases to verify SCMStateMachine.applyTransaction failure scenarios. */ +@TestInstance(TestInstance.Lifecycle.PER_CLASS) @Timeout(300) -public class TestScmApplyTransactionFailure { - - private static MiniOzoneCluster cluster; - private static OzoneConfiguration conf; - private static StorageContainerManager scm; - private static ContainerManager containerManager; - private static PipelineManagerImpl pipelineManager; +public abstract class TestScmApplyTransactionFailure implements HATests.TestCase { + private ContainerManager containerManager; + private PipelineManagerImpl pipelineManager; @BeforeAll - public static void init() throws Exception { - conf = new OzoneConfiguration(); - cluster = MiniOzoneCluster.newHABuilder(conf).setSCMServiceId("test") - .setNumDatanodes(3).build(); - conf.setTimeDuration(HddsConfigKeys.HDDS_HEARTBEAT_INTERVAL, 1000, - TimeUnit.MILLISECONDS); - conf.setTimeDuration(ScmConfigKeys.OZONE_SCM_PIPELINE_DESTROY_TIMEOUT, - 1000, TimeUnit.MILLISECONDS); - cluster.waitForClusterToBeReady(); - scm = cluster.getStorageContainerManager(); + public void init() throws Exception { + StorageContainerManager scm = cluster().getScmLeader(); containerManager = scm.getContainerManager(); pipelineManager = (PipelineManagerImpl) scm.getPipelineManager(); } - /** - * Shutdown MiniDFSCluster. - */ - @AfterAll - public static void shutdown() { - if (cluster != null) { - cluster.shutdown(); - } - } - @Test public void testAddContainerToClosedPipeline() throws Exception { RatisReplicationConfig replication = diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestNode2PipelineMap.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestNode2PipelineMap.java index 841d0ef16845..f9aa23bb58dc 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestNode2PipelineMap.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestNode2PipelineMap.java @@ -20,7 +20,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import org.apache.hadoop.hdds.client.RatisReplicationConfig; -import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.protocol.DatanodeDetails; import org.apache.hadoop.hdds.protocol.proto.HddsProtos; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationFactor; @@ -29,9 +28,8 @@ import org.apache.hadoop.hdds.scm.container.ContainerManager; import org.apache.hadoop.hdds.scm.container.common.helpers.ContainerWithPipeline; import org.apache.hadoop.hdds.scm.server.StorageContainerManager; -import org.apache.hadoop.ozone.MiniOzoneCluster; import org.apache.hadoop.ozone.common.statemachine.InvalidStateTransitionException; -import org.junit.jupiter.api.AfterEach; +import org.apache.ozone.test.NonHATests; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; @@ -46,26 +44,16 @@ * Test for the Node2Pipeline map. */ @Timeout(300) -public class TestNode2PipelineMap { +public abstract class TestNode2PipelineMap implements NonHATests.TestCase { - private MiniOzoneCluster cluster; - private OzoneConfiguration conf; private StorageContainerManager scm; private ContainerWithPipeline ratisContainer; private ContainerManager containerManager; private PipelineManager pipelineManager; - /** - * Create a MiniDFSCluster for testing. - * - * @throws IOException - */ @BeforeEach public void init() throws Exception { - conf = new OzoneConfiguration(); - cluster = MiniOzoneCluster.newBuilder(conf).setNumDatanodes(5).build(); - cluster.waitForClusterToBeReady(); - scm = cluster.getStorageContainerManager(); + scm = cluster().getStorageContainerManager(); containerManager = scm.getContainerManager(); pipelineManager = scm.getPipelineManager(); ContainerInfo containerInfo = containerManager.allocateContainer( @@ -76,16 +64,6 @@ public void init() throws Exception { pipelineManager = scm.getPipelineManager(); } - /** - * Shutdown MiniDFSCluster. - */ - @AfterEach - public void shutdown() { - if (cluster != null) { - cluster.shutdown(); - } - } - @Test public void testPipelineMap() throws IOException, InvalidStateTransitionException, TimeoutException { @@ -94,8 +72,8 @@ public void testPipelineMap() throws IOException, .getContainersInPipeline(ratisContainer.getPipeline().getId()); ContainerID cId = ratisContainer.getContainerInfo().containerID(); - assertEquals(1, set.size()); - set.forEach(containerID -> assertEquals(containerID, cId)); + assertThat(set).contains(cId); + final int size = set.size(); List dns = ratisContainer.getPipeline().getNodes(); assertEquals(3, dns.size()); @@ -113,7 +91,7 @@ public void testPipelineMap() throws IOException, .updateContainerState(cId, HddsProtos.LifeCycleEvent.CLOSE); Set set2 = pipelineManager.getContainersInPipeline( ratisContainer.getPipeline().getId()); - assertEquals(0, set2.size()); + assertEquals(size - 1, set2.size()); pipelineManager.closePipeline(ratisContainer.getPipeline().getId()); pipelineManager.deletePipeline(ratisContainer.getPipeline().getId()); diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestSCMPipelineMetrics.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestSCMPipelineMetrics.java index cf41fc60933e..3c0bddaafd35 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestSCMPipelineMetrics.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestSCMPipelineMetrics.java @@ -18,18 +18,17 @@ package org.apache.hadoop.hdds.scm.pipeline; -import org.apache.hadoop.hdds.HddsConfigKeys; import org.apache.hadoop.hdds.client.RatisReplicationConfig; -import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationFactor; import org.apache.hadoop.hdds.scm.container.common.helpers.AllocatedBlock; import org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList; import org.apache.hadoop.metrics2.MetricsRecordBuilder; import org.apache.hadoop.ozone.MiniOzoneCluster; -import org.junit.jupiter.api.AfterEach; +import org.apache.ozone.test.NonHATests; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.Timeout; import java.io.IOException; @@ -41,27 +40,21 @@ import static org.apache.ozone.test.MetricsAsserts.getMetrics; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test cases to verify the metrics exposed by SCMPipelineManager. */ +@TestInstance(TestInstance.Lifecycle.PER_CLASS) @Timeout(300) -public class TestSCMPipelineMetrics { +public abstract class TestSCMPipelineMetrics implements NonHATests.TestCase { private MiniOzoneCluster cluster; @BeforeEach public void setup() throws Exception { - OzoneConfiguration conf = new OzoneConfiguration(); - conf.set(HddsConfigKeys.HDDS_SCM_SAFEMODE_PIPELINE_AVAILABILITY_CHECK, - Boolean.TRUE.toString()); - cluster = MiniOzoneCluster.newBuilder(conf) - .setNumDatanodes(3) - .build(); - cluster.waitForClusterToBeReady(); + cluster = cluster(); } /** @@ -82,6 +75,9 @@ public void testPipelineCreation() { */ @Test public void testPipelineDestroy() { + final String sourceName = SCMPipelineMetrics.class.getSimpleName(); + final String metricName = "NumPipelineDestroyed"; + final long initialDestroyed = getLongCounter(metricName, getMetrics(sourceName)); PipelineManager pipelineManager = cluster .getStorageContainerManager().getPipelineManager(); Optional pipeline = pipelineManager @@ -93,9 +89,7 @@ public void testPipelineDestroy() { pm.closePipeline(pipeline.get().getId()); pm.deletePipeline(pipeline.get().getId()); }); - MetricsRecordBuilder metrics = getMetrics( - SCMPipelineMetrics.class.getSimpleName()); - assertCounter("NumPipelineDestroyed", 1L, metrics); + assertCounter(metricName, initialDestroyed + 1, getMetrics(sourceName)); } @Test @@ -110,7 +104,7 @@ public void testNumBlocksAllocated() throws IOException, TimeoutException { Pipeline pipeline = block.getPipeline(); final String metricName = SCMPipelineMetrics.getBlockAllocationMetricName(pipeline); long numBlocksAllocated = getLongCounter(metricName, metrics); - assertEquals(1, numBlocksAllocated); + assertThat(numBlocksAllocated).isPositive(); // destroy the pipeline assertDoesNotThrow(() -> @@ -123,9 +117,4 @@ public void testNumBlocksAllocated() throws IOException, TimeoutException { getLongCounter(metricName, finalMetrics)); assertThat(t).hasMessageContaining(metricName); } - - @AfterEach - public void teardown() { - cluster.shutdown(); - } } diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/admin/om/lease/TestLeaseRecoverer.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/admin/om/lease/TestLeaseRecoverer.java index 004338483bb0..6ce9eee9a721 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/admin/om/lease/TestLeaseRecoverer.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/admin/om/lease/TestLeaseRecoverer.java @@ -19,26 +19,24 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; +import java.net.URI; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; import org.apache.hadoop.fs.LeaseRecoverable; -import org.apache.hadoop.hdds.scm.OzoneClientConfig; +import org.apache.ozone.test.NonHATests; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.Timeout; import picocli.CommandLine; -import org.apache.hadoop.fs.CommonConfigurationKeysPublic; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; -import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.utils.IOUtils; -import org.apache.hadoop.ozone.MiniOzoneCluster; -import org.apache.hadoop.ozone.OzoneConfigKeys; import org.apache.hadoop.ozone.TestDataUtil; import org.apache.hadoop.ozone.client.OzoneBucket; import org.apache.hadoop.ozone.client.OzoneClient; @@ -54,33 +52,15 @@ /** * Test cases for LeaseRecoverer. */ +@TestInstance(TestInstance.Lifecycle.PER_CLASS) @Timeout(value = 120000, unit = TimeUnit.MILLISECONDS) -public class TestLeaseRecoverer { - private static MiniOzoneCluster cluster = null; - private static OzoneConfiguration conf; - private static OzoneBucket fsoOzoneBucket; - private static OzoneClient client; - - /** - * Create a MiniDFSCluster for testing. - *

- * - * @throws IOException - */ +public abstract class TestLeaseRecoverer implements NonHATests.TestCase { + private OzoneBucket fsoOzoneBucket; + private OzoneClient client; + @BeforeAll - public static void init() throws Exception { - conf = new OzoneConfiguration(); - conf.setBoolean(OzoneConfigKeys.OZONE_HBASE_ENHANCEMENTS_ALLOWED, true); - conf.setBoolean("ozone.client.hbase.enhancements.allowed", true); - conf.setBoolean(OzoneConfigKeys.OZONE_FS_HSYNC_ENABLED, true); - conf.set(OzoneConfigKeys.OZONE_OM_LEASE_SOFT_LIMIT, "0s"); - OzoneClientConfig clientConfig = conf.getObject(OzoneClientConfig.class); - clientConfig.setStreamBufferFlushDelay(false); - conf.setFromObject(clientConfig); - // Set the number of keys to be processed during batch operate. - cluster = MiniOzoneCluster.newBuilder(conf).build(); - cluster.waitForClusterToBeReady(); - client = cluster.newClient(); + void init() throws Exception { + client = cluster().newClient(); // create a volume and a FSO bucket fsoOzoneBucket = TestDataUtil @@ -88,22 +68,23 @@ public static void init() throws Exception { } @AfterAll - public static void teardownClass() { + void teardownClass() { IOUtils.closeQuietly(client); - if (cluster != null) { - cluster.shutdown(); - } } @Test public void testCLI() throws IOException { final String rootPath = String.format("%s://%s/", - OZONE_OFS_URI_SCHEME, conf.get(OZONE_OM_ADDRESS_KEY)); - conf.set(CommonConfigurationKeysPublic.FS_DEFAULT_NAME_KEY, rootPath); - FileSystem fs = FileSystem.get(conf); + OZONE_OFS_URI_SCHEME, cluster().getConf().get(OZONE_OM_ADDRESS_KEY)); final String dir = rootPath + fsoOzoneBucket.getVolumeName() + OZONE_URI_DELIMITER + fsoOzoneBucket.getName(); final Path file = new Path(dir, "file"); + try (FileSystem fs = FileSystem.get(URI.create(rootPath), cluster().getConf())) { + testWithFS(fs, file); + } + } + + private void testWithFS(FileSystem fs, Path file) throws IOException { final int dataSize = 1024; final byte[] data = new byte[dataSize]; ThreadLocalRandom.current().nextBytes(data); diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestDiscardPreallocatedBlocks.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestDiscardPreallocatedBlocks.java index 478915868271..26b0cb719d09 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestDiscardPreallocatedBlocks.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestDiscardPreallocatedBlocks.java @@ -17,126 +17,85 @@ package org.apache.hadoop.ozone.client.rpc; -import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.UUID; -import java.util.concurrent.TimeUnit; import org.apache.hadoop.conf.StorageUnit; import org.apache.hadoop.hdds.client.ReplicationType; -import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.protocol.DatanodeDetails; -import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ChecksumType; -import org.apache.hadoop.hdds.scm.OzoneClientConfig; -import org.apache.hadoop.hdds.scm.ScmConfigKeys; import org.apache.hadoop.hdds.scm.container.ContainerID; import org.apache.hadoop.hdds.scm.container.ContainerInfo; import org.apache.hadoop.hdds.scm.pipeline.Pipeline; import org.apache.hadoop.hdds.utils.IOUtils; import org.apache.hadoop.ozone.MiniOzoneCluster; -import org.apache.hadoop.ozone.OzoneConfigKeys; -import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.client.ObjectStore; import org.apache.hadoop.ozone.client.OzoneClient; -import org.apache.hadoop.ozone.client.OzoneClientFactory; import org.apache.hadoop.ozone.client.io.BlockOutputStreamEntry; import org.apache.hadoop.ozone.client.io.KeyOutputStream; import org.apache.hadoop.ozone.client.io.OzoneOutputStream; import org.apache.hadoop.ozone.container.ContainerTestHelper; -import org.apache.hadoop.ozone.container.TestHelper; import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo; import static java.nio.charset.StandardCharsets.UTF_8; -import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_STALENODE_INTERVAL; +import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_SCM_BLOCK_SIZE; +import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_SCM_BLOCK_SIZE_DEFAULT; +import static org.apache.hadoop.ozone.container.TestHelper.createKey; +import static org.apache.hadoop.ozone.container.TestHelper.waitForContainerClose; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotEquals; + +import org.apache.ozone.test.NonHATests; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.Timeout; /** - * Tests Close Container Exception handling by Ozone Client. + * Tests that unused block pre-allocated for write is discarded when container is closed. */ +@TestInstance(TestInstance.Lifecycle.PER_CLASS) @Timeout(300) -public class TestDiscardPreallocatedBlocks { - private static MiniOzoneCluster cluster; - private static OzoneConfiguration conf = new OzoneConfiguration(); - private static OzoneClient client; - private static ObjectStore objectStore; - private static int chunkSize; - private static int blockSize; - private static String volumeName; - private static String bucketName; - private static String keyString; - - /** - * Create a MiniDFSCluster for testing. - *

- * Ozone is made active by setting OZONE_ENABLED = true - * - * @throws IOException - */ +public abstract class TestDiscardPreallocatedBlocks implements NonHATests.TestCase { + private MiniOzoneCluster cluster; + private OzoneClient client; + private ObjectStore objectStore; + private int blockSize; + private String volumeName; + private String bucketName; + private String keyString; @BeforeAll - public static void init() throws Exception { - chunkSize = (int) OzoneConsts.MB; - blockSize = 4 * chunkSize; - - OzoneClientConfig config = conf.getObject(OzoneClientConfig.class); - config.setChecksumType(ChecksumType.NONE); - conf.setFromObject(config); + void init() throws Exception { + blockSize = (int) cluster().getConf().getStorageSize(OZONE_SCM_BLOCK_SIZE, + OZONE_SCM_BLOCK_SIZE_DEFAULT, StorageUnit.BYTES); - conf.setTimeDuration(OZONE_SCM_STALENODE_INTERVAL, 3, TimeUnit.SECONDS); - conf.setQuietMode(false); - conf.setStorageSize(OzoneConfigKeys.OZONE_SCM_BLOCK_SIZE, 4, - StorageUnit.MB); - conf.setInt(ScmConfigKeys.OZONE_DATANODE_PIPELINE_LIMIT, 1); - conf.setInt(ScmConfigKeys.OZONE_SCM_PIPELINE_OWNER_CONTAINER_COUNT, 1); - cluster = MiniOzoneCluster.newBuilder(conf).setNumDatanodes(3).build(); - cluster.waitForClusterToBeReady(); - //the easiest way to create an open container is creating a key - client = OzoneClientFactory.getRpcClient(conf); + cluster = cluster(); + client = cluster.newClient(); objectStore = client.getObjectStore(); keyString = UUID.randomUUID().toString(); - volumeName = "closecontainerexceptionhandlingtest"; - bucketName = volumeName; + volumeName = UUID.randomUUID().toString(); + bucketName = "bucket"; objectStore.createVolume(volumeName); objectStore.getVolume(volumeName).createBucket(bucketName); } - private String getKeyName() { - return UUID.randomUUID().toString(); - } - - /** - * Shutdown MiniDFSCluster. - */ - @AfterAll - public static void shutdown() { + void cleanup() { IOUtils.closeQuietly(client); - if (cluster != null) { - cluster.shutdown(); - } } @Test public void testDiscardPreallocatedBlocks() throws Exception { - String keyName = getKeyName(); + String keyName = "key"; OzoneOutputStream key = - createKey(keyName, ReplicationType.RATIS, 2 * blockSize); + createKey(keyName, ReplicationType.RATIS, 2L * blockSize, objectStore, volumeName, bucketName); KeyOutputStream keyOutputStream = assertInstanceOf(KeyOutputStream.class, key.getOutputStream()); // With the initial size provided, it should have pre allocated 2 blocks assertEquals(2, keyOutputStream.getStreamEntries().size()); - long containerID1 = keyOutputStream.getStreamEntries().get(0) - .getBlockID().getContainerID(); - long containerID2 = keyOutputStream.getStreamEntries().get(1) - .getBlockID().getContainerID(); - assertEquals(containerID1, containerID2); String dataString = ContainerTestHelper.getFixedLengthString(keyString, (1 * blockSize)); byte[] data = dataString.getBytes(UTF_8); @@ -154,7 +113,7 @@ public void testDiscardPreallocatedBlocks() throws Exception { .getPipeline(container.getPipelineID()); List datanodes = pipeline.getNodes(); assertEquals(3, datanodes.size()); - waitForContainerClose(key); + waitForContainerClose(key, cluster); dataString = ContainerTestHelper.getFixedLengthString(keyString, (1 * blockSize)); data = dataString.getBytes(UTF_8); @@ -169,19 +128,6 @@ public void testDiscardPreallocatedBlocks() throws Exception { assertNotEquals(locationStreamInfos.get(1).getBlockID(), keyOutputStream.getLocationInfoList().get(1).getBlockID()); key.close(); - - } - - private OzoneOutputStream createKey(String keyName, ReplicationType type, - long size) throws Exception { - return TestHelper - .createKey(keyName, type, size, objectStore, volumeName, bucketName); - } - - private void waitForContainerClose(OzoneOutputStream outputStream) - throws Exception { - TestHelper - .waitForContainerClose(outputStream, cluster); } } diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestBucketLayoutWithOlderClient.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestBucketLayoutWithOlderClient.java index e1b2a59d78c2..637b1bc573c1 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestBucketLayoutWithOlderClient.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestBucketLayoutWithOlderClient.java @@ -20,19 +20,19 @@ import org.apache.hadoop.ozone.MiniOzoneCluster; import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.TestDataUtil; -import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.ozone.client.OzoneBucket; import org.apache.hadoop.ozone.client.OzoneClient; import org.apache.hadoop.ozone.om.helpers.BucketLayout; import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; import org.apache.hadoop.security.UserGroupInformation; +import org.apache.ozone.test.NonHATests; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.Timeout; -import java.io.IOException; import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -41,42 +41,36 @@ /** * Tests to verify bucket ops with older version client. */ +@TestInstance(TestInstance.Lifecycle.PER_CLASS) @Timeout(1200) -public class TestBucketLayoutWithOlderClient { +public abstract class TestBucketLayoutWithOlderClient implements NonHATests.TestCase { - private static MiniOzoneCluster cluster = null; - private static OzoneConfiguration conf; - private static OzoneClient client; + private MiniOzoneCluster cluster; + private OzoneClient client; - /** - * Create a MiniDFSCluster for testing. - *

- * - * @throws IOException - */ @BeforeAll - public static void init() throws Exception { - conf = new OzoneConfiguration(); - conf.set(OMConfigKeys.OZONE_DEFAULT_BUCKET_LAYOUT, - BucketLayout.OBJECT_STORE.name()); - cluster = MiniOzoneCluster.newBuilder(conf).build(); - cluster.waitForClusterToBeReady(); + void init() throws Exception { + cluster = cluster(); client = cluster.newClient(); } @Test public void testCreateBucketWithOlderClient() throws Exception { // create a volume and a bucket without bucket layout argument + BucketLayout defaultLayout = cluster().getConf().getEnum(OMConfigKeys.OZONE_DEFAULT_BUCKET_LAYOUT, + BucketLayout.FILE_SYSTEM_OPTIMIZED); OzoneBucket bucket = TestDataUtil.createVolumeAndBucket(client, null); String volumeName = bucket.getVolumeName(); // OM defaulted bucket layout - assertEquals(BucketLayout.OBJECT_STORE, bucket.getBucketLayout()); + assertEquals(defaultLayout, bucket.getBucketLayout()); // Sets bucket layout explicitly. OzoneBucket fsobucket = TestDataUtil .createVolumeAndBucket(client, BucketLayout.FILE_SYSTEM_OPTIMIZED); assertEquals(BucketLayout.FILE_SYSTEM_OPTIMIZED, fsobucket.getBucketLayout()); + OzoneBucket obsBucket = TestDataUtil.createVolumeAndBucket(client, BucketLayout.OBJECT_STORE); + assertEquals(BucketLayout.OBJECT_STORE, obsBucket.getBucketLayout()); // Create bucket request by an older client. // Here sets ClientVersion.DEFAULT_VERSION @@ -113,14 +107,8 @@ public void testCreateBucketWithOlderClient() throws Exception { assertEquals(BucketLayout.LEGACY, bucketInfo.getBucketLayout()); } - /** - * Shutdown MiniDFSCluster. - */ @AfterAll - public static void shutdown() { + void cleanup() { IOUtils.closeQuietly(client); - if (cluster != null) { - cluster.shutdown(); - } } } diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/ClusterForTests.java b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/ClusterForTests.java index c09bff04c563..9712aa3045ec 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/ClusterForTests.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/ClusterForTests.java @@ -20,6 +20,7 @@ import org.apache.hadoop.hdds.conf.DatanodeRatisServerConfig; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.ratis.conf.RatisClientConfig; +import org.apache.hadoop.hdds.scm.OzoneClientConfig; import org.apache.hadoop.hdds.utils.IOUtils; import org.apache.hadoop.ozone.MiniOzoneCluster; import org.junit.jupiter.api.AfterAll; @@ -27,9 +28,11 @@ import org.junit.jupiter.api.TestInstance; import java.time.Duration; +import java.util.concurrent.TimeUnit; import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_FS_HSYNC_ENABLED; import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_HBASE_ENHANCEMENTS_ALLOWED; +import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_OM_LEASE_SOFT_LIMIT; /** * Base class for Ozone integration tests. Manages lifecycle of {@link MiniOzoneCluster}. @@ -59,9 +62,14 @@ protected static OzoneConfiguration createBaseConfiguration() { raftClientConfig.setRpcWatchRequestTimeout(Duration.ofSeconds(10)); conf.setFromObject(raftClientConfig); + OzoneClientConfig clientConfig = conf.getObject(OzoneClientConfig.class); + clientConfig.setStreamBufferFlushDelay(false); + conf.setFromObject(clientConfig); + conf.setBoolean(OZONE_HBASE_ENHANCEMENTS_ALLOWED, true); conf.setBoolean("ozone.client.hbase.enhancements.allowed", true); conf.setBoolean(OZONE_FS_HSYNC_ENABLED, true); + conf.setTimeDuration(OZONE_OM_LEASE_SOFT_LIMIT, 0, TimeUnit.SECONDS); return conf; } diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/HATests.java b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/HATests.java index f01a9ed3a04f..0dc00c5a6599 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/HATests.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/HATests.java @@ -56,6 +56,14 @@ public MiniOzoneHAClusterImpl cluster() { } } + @Nested + class ScmApplyTransactionFailure extends org.apache.hadoop.hdds.scm.container.TestScmApplyTransactionFailure { + @Override + public MiniOzoneHAClusterImpl cluster() { + return getCluster(); + } + } + @Nested class GetClusterTreeInformation extends org.apache.hadoop.ozone.TestGetClusterTreeInformation { @Override diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/NonHATests.java b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/NonHATests.java index 8e0e32868815..0566b356b301 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/NonHATests.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/NonHATests.java @@ -74,6 +74,14 @@ public MiniOzoneCluster cluster() { } } + @Nested + class SCMMXBean extends org.apache.hadoop.hdds.scm.TestSCMMXBean { + @Override + public MiniOzoneCluster cluster() { + return getCluster(); + } + } + @Nested class SCMNodeManagerMXBean extends org.apache.hadoop.hdds.scm.TestSCMNodeManagerMXBean { @Override @@ -82,6 +90,14 @@ public MiniOzoneCluster cluster() { } } + @Nested + class Node2PipelineMap extends org.apache.hadoop.hdds.scm.pipeline.TestNode2PipelineMap { + @Override + public MiniOzoneCluster cluster() { + return getCluster(); + } + } + @Nested class PipelineManagerMXBean extends org.apache.hadoop.hdds.scm.pipeline.TestPipelineManagerMXBean { @Override @@ -90,6 +106,14 @@ public MiniOzoneCluster cluster() { } } + @Nested + class SCMPipelineMetrics extends org.apache.hadoop.hdds.scm.pipeline.TestSCMPipelineMetrics { + @Override + public MiniOzoneCluster cluster() { + return getCluster(); + } + } + @Nested class CpuMetrics extends org.apache.hadoop.ozone.TestCpuMetrics { @Override @@ -98,6 +122,14 @@ public MiniOzoneCluster cluster() { } } + @Nested + class DiscardPreallocatedBlocks extends org.apache.hadoop.ozone.client.rpc.TestDiscardPreallocatedBlocks { + @Override + public MiniOzoneCluster cluster() { + return getCluster(); + } + } + @Nested class DNRPCLoadGenerator extends org.apache.hadoop.ozone.freon.TestDNRPCLoadGenerator { @Override @@ -106,6 +138,14 @@ public MiniOzoneCluster cluster() { } } + @Nested + class LeaseRecoverer extends org.apache.hadoop.ozone.admin.om.lease.TestLeaseRecoverer { + @Override + public MiniOzoneCluster cluster() { + return getCluster(); + } + } + @Nested class ObjectStore extends org.apache.hadoop.ozone.om.TestObjectStore { @Override @@ -114,6 +154,14 @@ public MiniOzoneCluster cluster() { } } + @Nested + class BucketLayoutWithOlderClient extends org.apache.hadoop.ozone.om.TestBucketLayoutWithOlderClient { + @Override + public MiniOzoneCluster cluster() { + return getCluster(); + } + } + @Nested class ObjectStoreWithFSO extends org.apache.hadoop.ozone.om.TestObjectStoreWithFSO { @Override