Repository: hadoop Updated Branches: refs/heads/trunk 889ab074d -> b7f4a3156
http://git-wip-us.apache.org/repos/asf/hadoop/blob/b7f4a315/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsVolumeListTest.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsVolumeListTest.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsVolumeListTest.java new file mode 100644 index 0000000..f92d949 --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsVolumeListTest.java @@ -0,0 +1,94 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.hadoop.hdfs.server.datanode.fsdataset.impl; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FileSystemTestHelper; +import org.apache.hadoop.hdfs.StorageType; +import org.apache.hadoop.hdfs.server.datanode.fsdataset.FsVolumeReference; +import org.apache.hadoop.hdfs.server.datanode.fsdataset.RoundRobinVolumeChoosingPolicy; +import org.apache.hadoop.hdfs.server.datanode.fsdataset.VolumeChoosingPolicy; +import org.junit.Before; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; +import static org.mockito.Mockito.mock; + +public class FsVolumeListTest { + + private final Configuration conf = new Configuration(); + private VolumeChoosingPolicy<FsVolumeImpl> blockChooser = + new RoundRobinVolumeChoosingPolicy<>(); + private FsDatasetImpl dataset = null; + private String baseDir; + + @Before + public void setUp() { + dataset = mock(FsDatasetImpl.class); + baseDir = new FileSystemTestHelper().getTestRootDir(); + } + + @Test + public void testGetNextVolumeWithClosedVolume() throws IOException { + FsVolumeList volumeList = new FsVolumeList(0, blockChooser); + List<FsVolumeImpl> volumes = new ArrayList<>(); + for (int i = 0; i < 3; i++) { + File curDir = new File(baseDir, "nextvolume-" + i); + curDir.mkdirs(); + FsVolumeImpl volume = new FsVolumeImpl(dataset, "storage-id", curDir, + conf, StorageType.DEFAULT); + volume.setCapacityForTesting(1024 * 1024 * 1024); + volumes.add(volume); + volumeList.addVolume(volume); + } + + // Close the second volume. + volumes.get(1).closeAndWait(); + for (int i = 0; i < 10; i++) { + try (FsVolumeReference ref = + volumeList.getNextVolume(StorageType.DEFAULT, 128)) { + // volume No.2 will not be chosen. + assertNotEquals(ref.getVolume(), volumes.get(1)); + } + } + } + + @Test + public void testCheckDirsWithClosedVolume() throws IOException { + FsVolumeList volumeList = new FsVolumeList(0, blockChooser); + List<FsVolumeImpl> volumes = new ArrayList<>(); + for (int i = 0; i < 3; i++) { + File curDir = new File(baseDir, "volume-" + i); + curDir.mkdirs(); + FsVolumeImpl volume = new FsVolumeImpl(dataset, "storage-id", curDir, + conf, StorageType.DEFAULT); + volumes.add(volume); + volumeList.addVolume(volume); + } + + // Close the 2nd volume. + volumes.get(1).closeAndWait(); + // checkDirs() should ignore the 2nd volume since it is closed. + volumeList.checkDirs(); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/b7f4a315/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/TestFsDatasetImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/TestFsDatasetImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/TestFsDatasetImpl.java index aa4b68c..0120dfe 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/TestFsDatasetImpl.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/TestFsDatasetImpl.java @@ -31,6 +31,7 @@ import org.apache.hadoop.hdfs.server.datanode.DNConf; import org.apache.hadoop.hdfs.server.datanode.DataBlockScanner; import org.apache.hadoop.hdfs.server.datanode.DataNode; import org.apache.hadoop.hdfs.server.datanode.DataStorage; +import org.apache.hadoop.hdfs.server.datanode.ReplicaHandler; import org.apache.hadoop.hdfs.server.datanode.StorageLocation; import org.apache.hadoop.hdfs.server.datanode.fsdataset.RoundRobinVolumeChoosingPolicy; import org.apache.hadoop.hdfs.server.protocol.NamespaceInfo; @@ -160,14 +161,16 @@ public class TestFsDatasetImpl { assertEquals(actualVolumes, expectedVolumes); } - @Test + @Test(timeout = 30000) public void testRemoveVolumes() throws IOException { // Feed FsDataset with block metadata. final int NUM_BLOCKS = 100; for (int i = 0; i < NUM_BLOCKS; i++) { String bpid = BLOCK_POOL_IDS[NUM_BLOCKS % BLOCK_POOL_IDS.length]; ExtendedBlock eb = new ExtendedBlock(bpid, i); - dataset.createRbw(StorageType.DEFAULT, eb, false); + try (ReplicaHandler replica = + dataset.createRbw(StorageType.DEFAULT, eb, false)) { + } } final String[] dataDirs = conf.get(DFSConfigKeys.DFS_DATANODE_DATA_DIR_KEY).split(","); http://git-wip-us.apache.org/repos/asf/hadoop/blob/b7f4a315/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/TestWriteToReplica.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/TestWriteToReplica.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/TestWriteToReplica.java index 60c6d03..5aafc9c 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/TestWriteToReplica.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/TestWriteToReplica.java @@ -29,6 +29,7 @@ import org.apache.hadoop.hdfs.server.datanode.FinalizedReplica; import org.apache.hadoop.hdfs.server.datanode.ReplicaAlreadyExistsException; import org.apache.hadoop.hdfs.server.datanode.ReplicaBeingWritten; import org.apache.hadoop.hdfs.server.datanode.ReplicaInPipeline; +import org.apache.hadoop.hdfs.server.datanode.ReplicaInPipelineInterface; import org.apache.hadoop.hdfs.server.datanode.ReplicaInfo; import org.apache.hadoop.hdfs.server.datanode.ReplicaNotFoundException; import org.apache.hadoop.hdfs.server.datanode.ReplicaUnderRecovery; @@ -148,7 +149,8 @@ public class TestWriteToReplica { }; ReplicaMap replicasMap = dataSet.volumeMap; - FsVolumeImpl vol = dataSet.volumes.getNextVolume(StorageType.DEFAULT, 0); + FsVolumeImpl vol = (FsVolumeImpl) dataSet.volumes + .getNextVolume(StorageType.DEFAULT, 0).getVolume(); ReplicaInfo replicaInfo = new FinalizedReplica( blocks[FINALIZED].getLocalBlock(), vol, vol.getCurrentDir().getParentFile()); replicasMap.add(bpid, replicaInfo); @@ -157,10 +159,10 @@ public class TestWriteToReplica { replicasMap.add(bpid, new ReplicaInPipeline( blocks[TEMPORARY].getBlockId(), - blocks[TEMPORARY].getGenerationStamp(), vol, + blocks[TEMPORARY].getGenerationStamp(), vol, vol.createTmpFile(bpid, blocks[TEMPORARY].getLocalBlock()).getParentFile(), 0)); - replicaInfo = new ReplicaBeingWritten(blocks[RBW].getLocalBlock(), vol, + replicaInfo = new ReplicaBeingWritten(blocks[RBW].getLocalBlock(), vol, vol.createRbwFile(bpid, blocks[RBW].getLocalBlock()).getParentFile(), null); replicasMap.add(bpid, replicaInfo); replicaInfo.getBlockFile().createNewFile(); @@ -489,8 +491,8 @@ public class TestWriteToReplica { long newGenStamp = blocks[NON_EXISTENT].getGenerationStamp() * 10; blocks[NON_EXISTENT].setGenerationStamp(newGenStamp); try { - ReplicaInPipeline replicaInfo = - dataSet.createTemporary(StorageType.DEFAULT, blocks[NON_EXISTENT]); + ReplicaInPipelineInterface replicaInfo = + dataSet.createTemporary(StorageType.DEFAULT, blocks[NON_EXISTENT]).getReplica(); Assert.assertTrue(replicaInfo.getGenerationStamp() == newGenStamp); Assert.assertTrue( replicaInfo.getBlockId() == blocks[NON_EXISTENT].getBlockId());
