HDFS-11703. [READ] Tests for ProvidedStorageMap
This commit is contained in:
parent
aa5ec85f7f
commit
89b9faf529
|
@ -28,6 +28,7 @@ import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.ConcurrentSkipListMap;
|
import java.util.concurrent.ConcurrentSkipListMap;
|
||||||
|
|
||||||
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.fs.StorageType;
|
import org.apache.hadoop.fs.StorageType;
|
||||||
import org.apache.hadoop.hdfs.DFSConfigKeys;
|
import org.apache.hadoop.hdfs.DFSConfigKeys;
|
||||||
|
@ -121,6 +122,11 @@ public class ProvidedStorageMap {
|
||||||
return dn.getStorageInfo(s.getStorageID());
|
return dn.getStorageInfo(s.getStorageID());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
public DatanodeStorageInfo getProvidedStorageInfo() {
|
||||||
|
return providedStorageInfo;
|
||||||
|
}
|
||||||
|
|
||||||
public LocatedBlockBuilder newLocatedBlocks(int maxValue) {
|
public LocatedBlockBuilder newLocatedBlocks(int maxValue) {
|
||||||
if (!providedEnabled) {
|
if (!providedEnabled) {
|
||||||
return new LocatedBlockBuilder(maxValue);
|
return new LocatedBlockBuilder(maxValue);
|
||||||
|
|
|
@ -0,0 +1,153 @@
|
||||||
|
/**
|
||||||
|
* 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.blockmanagement;
|
||||||
|
|
||||||
|
import org.apache.hadoop.conf.Configurable;
|
||||||
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.fs.StorageType;
|
||||||
|
import org.apache.hadoop.hdfs.DFSConfigKeys;
|
||||||
|
import org.apache.hadoop.hdfs.DFSTestUtil;
|
||||||
|
import org.apache.hadoop.hdfs.HdfsConfiguration;
|
||||||
|
import org.apache.hadoop.hdfs.protocol.Block;
|
||||||
|
import org.apache.hadoop.hdfs.server.protocol.DatanodeStorage;
|
||||||
|
import org.apache.hadoop.hdfs.util.RwLock;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class tests the {@link ProvidedStorageMap}.
|
||||||
|
*/
|
||||||
|
public class TestProvidedStorageMap {
|
||||||
|
|
||||||
|
private Configuration conf;
|
||||||
|
private BlockManager bm;
|
||||||
|
private RwLock nameSystemLock;
|
||||||
|
private String providedStorageID;
|
||||||
|
|
||||||
|
static class TestBlockProvider extends BlockProvider
|
||||||
|
implements Configurable {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setConf(Configuration conf) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Configuration getConf() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<Block> iterator() {
|
||||||
|
return new Iterator<Block>() {
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public Block next() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void remove() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
providedStorageID = DFSConfigKeys.DFS_PROVIDER_STORAGEUUID_DEFAULT;
|
||||||
|
conf = new HdfsConfiguration();
|
||||||
|
conf.set(DFSConfigKeys.DFS_PROVIDER_STORAGEUUID,
|
||||||
|
providedStorageID);
|
||||||
|
conf.setBoolean(DFSConfigKeys.DFS_NAMENODE_PROVIDED_ENABLED, true);
|
||||||
|
conf.setClass(DFSConfigKeys.DFS_NAMENODE_BLOCK_PROVIDER_CLASS,
|
||||||
|
TestBlockProvider.class, BlockProvider.class);
|
||||||
|
|
||||||
|
bm = mock(BlockManager.class);
|
||||||
|
nameSystemLock = mock(RwLock.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
private DatanodeDescriptor createDatanodeDescriptor(int port) {
|
||||||
|
return DFSTestUtil.getDatanodeDescriptor("127.0.0.1", port, "defaultRack",
|
||||||
|
"localhost");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testProvidedStorageMap() throws IOException {
|
||||||
|
ProvidedStorageMap providedMap = new ProvidedStorageMap(
|
||||||
|
nameSystemLock, bm, conf);
|
||||||
|
DatanodeStorageInfo providedMapStorage =
|
||||||
|
providedMap.getProvidedStorageInfo();
|
||||||
|
//the provided storage cannot be null
|
||||||
|
assertNotNull(providedMapStorage);
|
||||||
|
|
||||||
|
//create a datanode
|
||||||
|
DatanodeDescriptor dn1 = createDatanodeDescriptor(5000);
|
||||||
|
|
||||||
|
//associate two storages to the datanode
|
||||||
|
DatanodeStorage dn1ProvidedStorage = new DatanodeStorage(
|
||||||
|
providedStorageID,
|
||||||
|
DatanodeStorage.State.NORMAL,
|
||||||
|
StorageType.PROVIDED);
|
||||||
|
DatanodeStorage dn1DiskStorage = new DatanodeStorage(
|
||||||
|
"sid-1", DatanodeStorage.State.NORMAL, StorageType.DISK);
|
||||||
|
|
||||||
|
when(nameSystemLock.hasWriteLock()).thenReturn(true);
|
||||||
|
DatanodeStorageInfo dns1Provided = providedMap.getStorage(dn1,
|
||||||
|
dn1ProvidedStorage);
|
||||||
|
DatanodeStorageInfo dns1Disk = providedMap.getStorage(dn1,
|
||||||
|
dn1DiskStorage);
|
||||||
|
|
||||||
|
assertTrue("The provided storages should be equal",
|
||||||
|
dns1Provided == providedMapStorage);
|
||||||
|
assertTrue("Disk storage has not yet been registered with block manager",
|
||||||
|
dns1Disk == null);
|
||||||
|
//add the disk storage to the datanode.
|
||||||
|
DatanodeStorageInfo dnsDisk = new DatanodeStorageInfo(dn1, dn1DiskStorage);
|
||||||
|
dn1.injectStorage(dnsDisk);
|
||||||
|
assertTrue("Disk storage must match the injected storage info",
|
||||||
|
dnsDisk == providedMap.getStorage(dn1, dn1DiskStorage));
|
||||||
|
|
||||||
|
//create a 2nd datanode
|
||||||
|
DatanodeDescriptor dn2 = createDatanodeDescriptor(5010);
|
||||||
|
//associate a provided storage with the datanode
|
||||||
|
DatanodeStorage dn2ProvidedStorage = new DatanodeStorage(
|
||||||
|
providedStorageID,
|
||||||
|
DatanodeStorage.State.NORMAL,
|
||||||
|
StorageType.PROVIDED);
|
||||||
|
|
||||||
|
DatanodeStorageInfo dns2Provided = providedMap.getStorage(
|
||||||
|
dn2, dn2ProvidedStorage);
|
||||||
|
assertTrue("The provided storages should be equal",
|
||||||
|
dns2Provided == providedMapStorage);
|
||||||
|
assertTrue("The DatanodeDescriptor should contain the provided storage",
|
||||||
|
dn2.getStorageInfo(providedStorageID) == providedMapStorage);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue