Example usage for org.apache.hadoop.hdfs.protocol ClientDatanodeProtocol getReplicaVisibleLength

List of usage examples for org.apache.hadoop.hdfs.protocol ClientDatanodeProtocol getReplicaVisibleLength

Introduction

In this page you can find the example usage for org.apache.hadoop.hdfs.protocol ClientDatanodeProtocol getReplicaVisibleLength.

Prototype

long getReplicaVisibleLength(ExtendedBlock b) throws IOException;

Source Link

Document

Return the visible length of a replica.

Usage

From source file:com.mellanox.r4h.DFSInputStream.java

License:Apache License

/** Read the block length from one of the datanodes. */
private long readBlockLength(LocatedBlock locatedblock) throws IOException {
    assert locatedblock != null : "LocatedBlock cannot be null";
    int replicaNotFoundCount = locatedblock.getLocations().length;

    for (DatanodeInfo datanode : locatedblock.getLocations()) {
        ClientDatanodeProtocol cdp = null;

        try {//  w  w  w  .  j  a v  a 2 s.  co m
            cdp = DFSUtil.createClientDatanodeProtocolProxy(datanode, dfsClient.getConfiguration(),
                    dfsClient.getConf().getSocketTimeout(), dfsClient.getConf().getConnectToDnViaHostname(),
                    locatedblock);

            final long n = cdp.getReplicaVisibleLength(locatedblock.getBlock());

            if (n >= 0) {
                return n;
            }
        } catch (IOException ioe) {
            if (ioe instanceof RemoteException
                    && (((RemoteException) ioe).unwrapRemoteException() instanceof ReplicaNotFoundException)) {
                // special case : replica might not be on the DN, treat as 0 length
                replicaNotFoundCount--;
            }

            if (DFSClient.LOG.isDebugEnabled()) {
                DFSClient.LOG.debug("Failed to getReplicaVisibleLength from datanode " + datanode
                        + " for block " + locatedblock.getBlock(), ioe);
            }
        } finally {
            if (cdp != null) {
                RPC.stopProxy(cdp);
            }
        }
    }

    // Namenode told us about these locations, but none know about the replica
    // means that we hit the race between pipeline creation start and end.
    // we require all 3 because some other exception could have happened
    // on a DN that has it. we want to report that error
    if (replicaNotFoundCount == 0) {
        return 0;
    }

    throw new IOException("Cannot obtain block length for " + locatedblock);
}