Exemple #1
0
 /// <exception cref="System.IO.IOException"/>
 public override void RequestShortCircuitShm(string clientName)
 {
     DataTransferProtos.ShortCircuitShmRequestProto.Builder builder = DataTransferProtos.ShortCircuitShmRequestProto
                                                                      .NewBuilder().SetClientName(clientName);
     if (Trace.IsTracing())
     {
         Span s = Trace.CurrentSpan();
         builder.SetTraceInfo(DataTransferProtos.DataTransferTraceInfoProto.NewBuilder().SetTraceId
                                  (s.GetTraceId()).SetParentId(s.GetSpanId()));
     }
     DataTransferProtos.ShortCircuitShmRequestProto proto = ((DataTransferProtos.ShortCircuitShmRequestProto
                                                              )builder.Build());
     Send(@out, OP.RequestShortCircuitShm, proto);
 }
Exemple #2
0
 /// <exception cref="System.IO.IOException"/>
 public override void ReleaseShortCircuitFds(ShortCircuitShm.SlotId slotId)
 {
     DataTransferProtos.ReleaseShortCircuitAccessRequestProto.Builder builder = DataTransferProtos.ReleaseShortCircuitAccessRequestProto
                                                                                .NewBuilder().SetSlotId(PBHelper.Convert(slotId));
     if (Trace.IsTracing())
     {
         Span s = Trace.CurrentSpan();
         builder.SetTraceInfo(DataTransferProtos.DataTransferTraceInfoProto.NewBuilder().SetTraceId
                                  (s.GetTraceId()).SetParentId(s.GetSpanId()));
     }
     DataTransferProtos.ReleaseShortCircuitAccessRequestProto proto = ((DataTransferProtos.ReleaseShortCircuitAccessRequestProto
                                                                        )builder.Build());
     Send(@out, OP.ReleaseShortCircuitFds, proto);
 }
 internal static DataTransferProtos.BaseHeaderProto BuildBaseHeader(ExtendedBlock
                                                                    blk, Org.Apache.Hadoop.Security.Token.Token <BlockTokenIdentifier> blockToken)
 {
     DataTransferProtos.BaseHeaderProto.Builder builder = DataTransferProtos.BaseHeaderProto
                                                          .NewBuilder().SetBlock(PBHelper.Convert(blk)).SetToken(PBHelper.Convert(blockToken
                                                                                                                                  ));
     if (Trace.IsTracing())
     {
         Span s = Trace.CurrentSpan();
         builder.SetTraceInfo(DataTransferProtos.DataTransferTraceInfoProto.NewBuilder().SetTraceId
                                  (s.GetTraceId()).SetParentId(s.GetSpanId()));
     }
     return((DataTransferProtos.BaseHeaderProto)builder.Build());
 }
Exemple #4
0
 public static RpcHeaderProtos.RpcRequestHeaderProto MakeRpcRequestHeader(RPC.RpcKind
                                                                          rpcKind, RpcHeaderProtos.RpcRequestHeaderProto.OperationProto operation, int callId
                                                                          , int retryCount, byte[] uuid)
 {
     RpcHeaderProtos.RpcRequestHeaderProto.Builder result = RpcHeaderProtos.RpcRequestHeaderProto
                                                            .NewBuilder();
     result.SetRpcKind(Convert(rpcKind)).SetRpcOp(operation).SetCallId(callId).SetRetryCount
         (retryCount).SetClientId(ByteString.CopyFrom(uuid));
     // Add tracing info if we are currently tracing.
     if (Trace.IsTracing())
     {
         Span s = Trace.CurrentSpan();
         result.SetTraceInfo(((RpcHeaderProtos.RPCTraceInfoProto)RpcHeaderProtos.RPCTraceInfoProto
                              .NewBuilder().SetParentId(s.GetSpanId()).SetTraceId(s.GetTraceId()).Build()));
     }
     return((RpcHeaderProtos.RpcRequestHeaderProto)result.Build());
 }
Exemple #5
0
        /// <summary>
        /// Queries datanodes for the blocks specified in <code>datanodeBlocks</code>,
        /// making one RPC to each datanode.
        /// </summary>
        /// <remarks>
        /// Queries datanodes for the blocks specified in <code>datanodeBlocks</code>,
        /// making one RPC to each datanode. These RPCs are made in parallel using a
        /// threadpool.
        /// </remarks>
        /// <param name="datanodeBlocks">Map of datanodes to the blocks present on the DN</param>
        /// <returns>metadatas Map of datanodes to block metadata of the DN</returns>
        /// <exception cref="Org.Apache.Hadoop.Hdfs.Security.Token.Block.InvalidBlockTokenException
        ///     ">if client does not have read access on a requested block</exception>
        internal static IDictionary <DatanodeInfo, HdfsBlocksMetadata> QueryDatanodesForHdfsBlocksMetadata
            (Configuration conf, IDictionary <DatanodeInfo, IList <LocatedBlock> > datanodeBlocks
            , int poolsize, int timeoutMs, bool connectToDnViaHostname)
        {
            IList <BlockStorageLocationUtil.VolumeBlockLocationCallable> callables = CreateVolumeBlockLocationCallables
                                                                                         (conf, datanodeBlocks, timeoutMs, connectToDnViaHostname, Trace.CurrentSpan());
            // Use a thread pool to execute the Callables in parallel
            IList <Future <HdfsBlocksMetadata> > futures = new AList <Future <HdfsBlocksMetadata> >
                                                               ();
            ExecutorService executor = new ScheduledThreadPoolExecutor(poolsize);

            try
            {
                futures = executor.InvokeAll(callables, timeoutMs, TimeUnit.Milliseconds);
            }
            catch (Exception)
            {
            }
            // Swallow the exception here, because we can return partial results
            executor.Shutdown();
            IDictionary <DatanodeInfo, HdfsBlocksMetadata> metadatas = Maps.NewHashMapWithExpectedSize
                                                                           (datanodeBlocks.Count);

            // Fill in metadatas with results from DN RPCs, where possible
            for (int i = 0; i < futures.Count; i++)
            {
                BlockStorageLocationUtil.VolumeBlockLocationCallable callable = callables[i];
                DatanodeInfo datanode = callable.GetDatanodeInfo();
                Future <HdfsBlocksMetadata> future = futures[i];
                try
                {
                    HdfsBlocksMetadata metadata = future.Get();
                    metadatas[callable.GetDatanodeInfo()] = metadata;
                }
                catch (CancellationException e)
                {
                    Log.Info("Cancelled while waiting for datanode " + datanode.GetIpcAddr(false) + ": "
                             + e.ToString());
                }
                catch (ExecutionException e)
                {
                    Exception t = e.InnerException;
                    if (t is InvalidBlockTokenException)
                    {
                        Log.Warn("Invalid access token when trying to retrieve " + "information from datanode "
                                 + datanode.GetIpcAddr(false));
                        throw (InvalidBlockTokenException)t;
                    }
                    else
                    {
                        if (t is NotSupportedException)
                        {
                            Log.Info("Datanode " + datanode.GetIpcAddr(false) + " does not support" + " required #getHdfsBlocksMetadata() API"
                                     );
                            throw (NotSupportedException)t;
                        }
                        else
                        {
                            Log.Info("Failed to query block locations on datanode " + datanode.GetIpcAddr(false
                                                                                                          ) + ": " + t);
                        }
                    }
                    if (Log.IsDebugEnabled())
                    {
                        Log.Debug("Could not fetch information from datanode", t);
                    }
                }
                catch (Exception)
                {
                    // Shouldn't happen, because invokeAll waits for all Futures to be ready
                    Log.Info("Interrupted while fetching HdfsBlocksMetadata");
                }
            }
            return(metadatas);
        }