Example usage for org.apache.hadoop.hdfs.net DomainPeer getOutputStream

List of usage examples for org.apache.hadoop.hdfs.net DomainPeer getOutputStream

Introduction

In this page you can find the example usage for org.apache.hadoop.hdfs.net DomainPeer getOutputStream.

Prototype

@Override
    public OutputStream getOutputStream() throws IOException 

Source Link

Usage

From source file:BlockReaderFactory.java

License:Apache License

/**
 * Request file descriptors from a DomainPeer.
 *
 * @param peer   The peer to use for communication.
 * @param slot   If non-null, the shared memory slot to associate with the 
 *               new ShortCircuitReplica.
 * //from w  w  w .java  2  s. co m
 * @return  A ShortCircuitReplica object if we could communicate with the
 *          datanode; null, otherwise. 
 * @throws  IOException If we encountered an I/O exception while communicating
 *          with the datanode.
 */
private ShortCircuitReplicaInfo requestFileDescriptors(DomainPeer peer, Slot slot) throws IOException {
    ShortCircuitCache cache = clientContext.getShortCircuitCache();
    final DataOutputStream out = new DataOutputStream(new BufferedOutputStream(peer.getOutputStream()));
    SlotId slotId = slot == null ? null : slot.getSlotId();
    new Sender(out).requestShortCircuitFds(block, token, slotId, 1);
    DataInputStream in = new DataInputStream(peer.getInputStream());
    BlockOpResponseProto resp = BlockOpResponseProto.parseFrom(PBHelper.vintPrefixed(in));
    DomainSocket sock = peer.getDomainSocket();
    switch (resp.getStatus()) {
    case SUCCESS:
        byte buf[] = new byte[1];
        FileInputStream fis[] = new FileInputStream[2];
        sock.recvFileInputStreams(fis, buf, 0, buf.length);
        ShortCircuitReplica replica = null;
        try {
            ExtendedBlockId key = new ExtendedBlockId(block.getBlockId(), block.getBlockPoolId());
            replica = new ShortCircuitReplica(key, fis[0], fis[1], cache, Time.monotonicNow(), slot);
        } catch (IOException e) {
            // This indicates an error reading from disk, or a format error.  Since
            // it's not a socket communication problem, we return null rather than
            // throwing an exception.
            LOG.warn(this + ": error creating ShortCircuitReplica.", e);
            return null;
        } finally {
            if (replica == null) {
                IOUtils.cleanup(DFSClient.LOG, fis[0], fis[1]);
            }
        }
        return new ShortCircuitReplicaInfo(replica);
    case ERROR_UNSUPPORTED:
        if (!resp.hasShortCircuitAccessVersion()) {
            LOG.warn("short-circuit read access is disabled for " + "DataNode " + datanode + ".  reason: "
                    + resp.getMessage());
            clientContext.getDomainSocketFactory().disableShortCircuitForPath(pathInfo.getPath());
        } else {
            LOG.warn("short-circuit read access for the file " + fileName + " is disabled for DataNode "
                    + datanode + ".  reason: " + resp.getMessage());
        }
        return null;
    case ERROR_ACCESS_TOKEN:
        String msg = "access control error while " + "attempting to set up short-circuit access to " + fileName
                + resp.getMessage();
        if (LOG.isDebugEnabled()) {
            LOG.debug(this + ":" + msg);
        }
        return new ShortCircuitReplicaInfo(new InvalidToken(msg));
    default:
        LOG.warn(this + ": unknown response code " + resp.getStatus()
                + " while attempting to set up short-circuit access. " + resp.getMessage());
        clientContext.getDomainSocketFactory().disableShortCircuitForPath(pathInfo.getPath());
        return null;
    }
}