[ 
https://issues.apache.org/jira/browse/HDFS-5445?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14275399#comment-14275399
 ] 

Hudson commented on HDFS-5445:
------------------------------

SUCCESS: Integrated in Hadoop-Mapreduce-trunk #2023 (See 
[https://builds.apache.org/job/Hadoop-Mapreduce-trunk/2023/])
HDFS-5445. PacketReceiver populates the packetLen field in PacketHeader 
incorrectly (Jonathan Mace via Colin P. McCabe) (cmccabe: rev 
f761bd8fe472c311bdff7c9d469f2805b867855a)
* 
hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/protocol/datatransfer/TestPacketReceiver.java
* 
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocol/datatransfer/PacketReceiver.java
* hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt


> PacketReceiver populates the packetLen field in PacketHeader incorrectly
> ------------------------------------------------------------------------
>
>                 Key: HDFS-5445
>                 URL: https://issues.apache.org/jira/browse/HDFS-5445
>             Project: Hadoop HDFS
>          Issue Type: Bug
>          Components: datanode
>    Affects Versions: 2.1.0-beta, 2.2.0
>         Environment: Ubuntu 12.10, Hadoop 2.1.0-beta
>            Reporter: Jonathan Mace
>            Assignee: Jonathan Mace
>            Priority: Minor
>              Labels: easyfix
>             Fix For: 2.7.0
>
>         Attachments: HDFS-5445.001.patch
>
>   Original Estimate: 1h
>  Remaining Estimate: 1h
>
> Summary: PacketReceiver reconstructs PacketHeaders with a packetLen 4 bytes 
> fewer than it should be.  It doesn't cause any exceptions because the 
> reconstructed header is never reserialized, and the packetLen field is not 
> used in this part of the code.
> In the BlockSender class, when a Packet is constructed it must be passed the 
> field packetLen, which is defined as the data length, checksum data length, 
> PLUS the length of the packetLen field itself (4 byte integer).
> {code:title=BlockSender.java|borderStyle=solid}
> 484:  private int sendPacket(ByteBuffer pkt, int maxChunks, OutputStream out,
> 485:      boolean transferTo, DataTransferThrottler throttler) throws 
> IOException {
> ...
> 491:    int packetLen = dataLen + checksumDataLen + 4;
> ...
> 504:    int headerLen = writePacketHeader(pkt, dataLen, packetLen);
> ...
> 586:  }
> ...
> 792:  private int writePacketHeader(ByteBuffer pkt, int dataLen, int 
> packetLen) {
> 793:    pkt.clear();
> 794:    // both syncBlock and syncPacket are false
> 795:    PacketHeader header = new PacketHeader(packetLen, offset, seqno,
> 796:        (dataLen == 0), dataLen, false);
> ...
> 802:  }
> {code}
> In the PacketReceiver class, the PacketHeader is reconstructed using the 
> method setFieldsFromData.  However, the 4 bytes for the packetLen field 
> length are missing.
> {code:title=PacketReceiver.java|borderStyle=solid}
> 112:  private void doRead(ReadableByteChannel ch, InputStream in)
> 113:      throws IOException {
> ...
> 136:    int payloadLen = curPacketBuf.getInt();
> ...
> 144:    int dataPlusChecksumLen = payloadLen - Ints.BYTES;
> ...
> 181:    curHeader.setFieldsFromData(dataPlusChecksumLen, headerBuf);
> ...
> 192:  }
> {code}
> The solution would be instead to do:
> {code:title=PacketReceiver.java|borderStyle=solid}
> 181:    curHeader.setFieldsFromData(payloadLen, headerBuf);
> {code}
> I found this because I was making small modifications to the code that 
> exposed this inconsistency.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to