HDFS-9566. Remove expensive 'BlocksMap#getStorages(Block b, final DatanodeStorage.State state)' method (Contributed by Daryn Sharp)
(cherry picked from commite418bd1fb0
) Conflicts: hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java (cherry picked from commit71374cca9d
)
This commit is contained in:
parent
a9916057e3
commit
6eae76f7a5
|
@ -1684,6 +1684,9 @@ Release 2.8.0 - UNRELEASED
|
||||||
HDFS-9682. Fix a typo "aplication" in HttpFS document.
|
HDFS-9682. Fix a typo "aplication" in HttpFS document.
|
||||||
(Weiwei Yang via aajisaka)
|
(Weiwei Yang via aajisaka)
|
||||||
|
|
||||||
|
HDFS-9566. Remove expensive 'BlocksMap#getStorages(Block b, final
|
||||||
|
DatanodeStorage.State state)' method (Daryn Sharp via vinayakumarb)
|
||||||
|
|
||||||
Release 2.7.3 - UNRELEASED
|
Release 2.7.3 - UNRELEASED
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
|
|
@ -1137,7 +1137,10 @@ public class BlockManager implements BlockStatsMXBean {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
StringBuilder datanodes = new StringBuilder();
|
StringBuilder datanodes = new StringBuilder();
|
||||||
for(DatanodeStorageInfo storage : blocksMap.getStorages(b, State.NORMAL)) {
|
for (DatanodeStorageInfo storage : blocksMap.getStorages(b)) {
|
||||||
|
if (storage.getState() != State.NORMAL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
final DatanodeDescriptor node = storage.getDatanodeDescriptor();
|
final DatanodeDescriptor node = storage.getDatanodeDescriptor();
|
||||||
invalidateBlocks.add(b, node, false);
|
invalidateBlocks.add(b, node, false);
|
||||||
datanodes.append(node).append(" ");
|
datanodes.append(node).append(" ");
|
||||||
|
@ -2912,7 +2915,10 @@ public class BlockManager implements BlockStatsMXBean {
|
||||||
Collection<DatanodeStorageInfo> nonExcess = new ArrayList<DatanodeStorageInfo>();
|
Collection<DatanodeStorageInfo> nonExcess = new ArrayList<DatanodeStorageInfo>();
|
||||||
Collection<DatanodeDescriptor> corruptNodes = corruptReplicas
|
Collection<DatanodeDescriptor> corruptNodes = corruptReplicas
|
||||||
.getNodes(block);
|
.getNodes(block);
|
||||||
for(DatanodeStorageInfo storage : blocksMap.getStorages(block, State.NORMAL)) {
|
for (DatanodeStorageInfo storage : blocksMap.getStorages(block)) {
|
||||||
|
if (storage.getState() != State.NORMAL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
final DatanodeDescriptor cur = storage.getDatanodeDescriptor();
|
final DatanodeDescriptor cur = storage.getDatanodeDescriptor();
|
||||||
if (storage.areBlockContentsStale()) {
|
if (storage.areBlockContentsStale()) {
|
||||||
LOG.trace("BLOCK* processOverReplicatedBlock: Postponing {}"
|
LOG.trace("BLOCK* processOverReplicatedBlock: Postponing {}"
|
||||||
|
@ -3294,7 +3300,10 @@ public class BlockManager implements BlockStatsMXBean {
|
||||||
// else proceed with fast case
|
// else proceed with fast case
|
||||||
int live = 0;
|
int live = 0;
|
||||||
Collection<DatanodeDescriptor> nodesCorrupt = corruptReplicas.getNodes(b);
|
Collection<DatanodeDescriptor> nodesCorrupt = corruptReplicas.getNodes(b);
|
||||||
for(DatanodeStorageInfo storage : blocksMap.getStorages(b, State.NORMAL)) {
|
for (DatanodeStorageInfo storage : blocksMap.getStorages(b)) {
|
||||||
|
if (storage.getState() != State.NORMAL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
final DatanodeDescriptor node = storage.getDatanodeDescriptor();
|
final DatanodeDescriptor node = storage.getDatanodeDescriptor();
|
||||||
if ((nodesCorrupt == null) || (!nodesCorrupt.contains(node)))
|
if ((nodesCorrupt == null) || (!nodesCorrupt.contains(node)))
|
||||||
live++;
|
live++;
|
||||||
|
|
|
@ -21,13 +21,9 @@ import java.util.Iterator;
|
||||||
|
|
||||||
import org.apache.hadoop.hdfs.protocol.Block;
|
import org.apache.hadoop.hdfs.protocol.Block;
|
||||||
import org.apache.hadoop.hdfs.server.namenode.INodeId;
|
import org.apache.hadoop.hdfs.server.namenode.INodeId;
|
||||||
import org.apache.hadoop.hdfs.server.protocol.DatanodeStorage;
|
|
||||||
import org.apache.hadoop.util.GSet;
|
import org.apache.hadoop.util.GSet;
|
||||||
import org.apache.hadoop.util.LightWeightGSet;
|
import org.apache.hadoop.util.LightWeightGSet;
|
||||||
|
|
||||||
import com.google.common.base.Predicate;
|
|
||||||
import com.google.common.collect.Iterables;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class maintains the map from a block to its metadata.
|
* This class maintains the map from a block to its metadata.
|
||||||
* block's metadata currently includes blockCollection it belongs to and
|
* block's metadata currently includes blockCollection it belongs to and
|
||||||
|
@ -140,22 +136,6 @@ class BlocksMap {
|
||||||
return getStorages(blocks.get(b));
|
return getStorages(blocks.get(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Searches for the block in the BlocksMap and
|
|
||||||
* returns {@link Iterable} of the storages the block belongs to
|
|
||||||
* <i>that are of the given {@link DatanodeStorage.State state}</i>.
|
|
||||||
*
|
|
||||||
* @param state DatanodeStorage state by which to filter the returned Iterable
|
|
||||||
*/
|
|
||||||
Iterable<DatanodeStorageInfo> getStorages(Block b, final DatanodeStorage.State state) {
|
|
||||||
return Iterables.filter(getStorages(blocks.get(b)), new Predicate<DatanodeStorageInfo>() {
|
|
||||||
@Override
|
|
||||||
public boolean apply(DatanodeStorageInfo storage) {
|
|
||||||
return storage.getState() == state;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For a block that has already been retrieved from the BlocksMap
|
* For a block that has already been retrieved from the BlocksMap
|
||||||
* returns {@link Iterable} of the storages the block belongs to.
|
* returns {@link Iterable} of the storages the block belongs to.
|
||||||
|
|
Loading…
Reference in New Issue