@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { IdleStateEvent e = (IdleStateEvent) evt; if (e.state() == READER_IDLE) { failed(ctx.channel(), () -> new IOException("Timeout(" + timeoutMs + "ms) waiting for response")); } else if (e.state() == WRITER_IDLE) { PacketHeader heartbeat = new PacketHeader(4, 0, HEART_BEAT_SEQNO, false, 0, false); int len = heartbeat.getSerializedSize(); ByteBuf buf = alloc.buffer(len); heartbeat.putInBuffer(buf.nioBuffer(0, len)); buf.writerIndex(len); ctx.channel().writeAndFlush(buf); } return; } super.userEventTriggered(ctx, evt); } }
PacketHeader header = new PacketHeader(); header.readFields(in); if (!header.sanityCheck(lastSeqNo)) { throw new IOException("BlockReader: error in packet header " + header); lastSeqNo = header.getSeqno(); dataLeft = header.getDataLen(); adjustChecksumBytes(header.getDataLen()); if (header.getDataLen() > 0) { IOUtils.readFully(in, checksumBytes.array(), 0, checksumBytes.limit()); PacketHeader hdr = new PacketHeader(); hdr.readFields(in); if (!hdr.isLastPacketInBlock() || hdr.getDataLen() != 0) { throw new IOException("Expected empty end-of-read packet! Header: " + hdr);
if (header.getOffsetInBlock() > replicaInfo.getNumBytes()) { throw new IOException("Received an out-of-sequence packet for " + block + "from " + inAddr + " at offset " + header.getOffsetInBlock() + ". Expecting packet starting at " + replicaInfo.getNumBytes()); if (header.getDataLen() < 0) { throw new IOException("Got wrong length during writeBlock(" + block + ") from " + inAddr + " at offset " + header.getOffsetInBlock() + ": " + header.getDataLen()); long offsetInBlock = header.getOffsetInBlock(); long seqno = header.getSeqno(); boolean lastPacketInBlock = header.isLastPacketInBlock(); final int len = header.getDataLen(); boolean syncBlock = header.getSyncBlock();
assert curDataSlice.capacity() == curHeader.getDataLen(); if (!curHeader.sanityCheck(lastSeqNo)) { throw new IOException("BlockReader: error in packet header " + curHeader); if (curHeader.getDataLen() > 0) { int chunks = 1 + (curHeader.getDataLen() - 1) / bytesPerChecksum; int checksumsLen = chunks * checksumSize; " checksumsLen=" + checksumsLen; lastSeqNo = curHeader.getSeqno(); if (verifyChecksum && curDataSlice.remaining() > 0) { filename, curHeader.getOffsetInBlock()); bytesNeededToFinish -= curHeader.getDataLen(); if (curHeader.getOffsetInBlock() < startOffset) { int newPos = (int) (startOffset - curHeader.getOffsetInBlock()); curDataSlice.position(newPos);
Preconditions.checkState(curHeader == null || !curHeader.isLastPacketInBlock()); curPacketBuf.get(headerBuf); if (curHeader == null) { curHeader = new PacketHeader(); curHeader.setFieldsFromData(payloadLen, headerBuf); int checksumLen = dataPlusChecksumLen - curHeader.getDataLen(); if (checksumLen < 0) { throw new IOException("Invalid packet: data length in packet header " + reslicePacket(headerLen, checksumLen, curHeader.getDataLen());
final int pktLen = HdfsConstants.BYTES_IN_INTEGER + dataLen + checksumLen; PacketHeader header = new PacketHeader( pktLen, offsetInBlock, seqno, lastPacketInBlock, dataLen, syncBlock); final int headerStart = checksumStart - header.getSerializedSize(); assert checksumStart + 1 >= header.getSerializedSize(); assert headerStart >= 0; assert headerStart + header.getSerializedSize() == checksumStart; System.arraycopy(header.getBytes(), 0, buf, headerStart, header.getSerializedSize()); buf[headerStart+header.getSerializedSize() + checksumLen + dataLen-1] ^= 0xff; stm.write(buf, headerStart, header.getSerializedSize() + checksumLen + dataLen); buf[headerStart+header.getSerializedSize() + checksumLen + dataLen-1] ^= 0xff;
public byte[] getBytes() { ByteBuffer buf = ByteBuffer.allocate(getSerializedSize()); putInBuffer(buf); return buf.array(); }
@Test public void testPacketHeader() throws IOException { PacketHeader hdr = new PacketHeader( 4, // size of packet 1024, // OffsetInBlock 100, // sequencenumber false, // lastPacketInBlock 4096, // chunk length false); ByteArrayOutputStream baos = new ByteArrayOutputStream(); hdr.write(new DataOutputStream(baos)); // Read back using DataInput PacketHeader readBack = new PacketHeader(); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); readBack.readFields(new DataInputStream(bais)); assertEquals(hdr, readBack); // Read back using ByteBuffer readBack = new PacketHeader(); readBack.readFields(ByteBuffer.wrap(baos.toByteArray())); assertEquals(hdr, readBack); assertTrue(hdr.sanityCheck(99)); assertFalse(hdr.sanityCheck(100)); }
private void readTrailingEmptyPacket() throws IOException { LOG.trace("Reading empty packet at end of read"); packetReceiver.receiveNextPacket(in); PacketHeader trailer = packetReceiver.getHeader(); if (!trailer.isLastPacketInBlock() || trailer.getDataLen() != 0) { throw new IOException("Expected empty end-of-read packet! Header: " + trailer); } }
private byte[] prepareFakePacket(byte[] data, byte[] sums) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); int packetLen = data.length + sums.length + Ints.BYTES; PacketHeader header = new PacketHeader( packetLen, OFFSET_IN_BLOCK, SEQNO, false, data.length, false); header.write(dos); dos.write(sums); dos.write(data); dos.flush(); return baos.toByteArray(); }
assertEquals(SEQNO, header.getSeqno()); assertEquals(OFFSET_IN_BLOCK, header.getOffsetInBlock()); assertEquals(dataLen + checksumsLen + Ints.BYTES, header.getPacketLen());
PacketHeader header = packetReceiver.getHeader(); String specificOffset = "specific offsets are:" + " offsetInBlock = " + header.getOffsetInBlock() + " offsetInPacket = " + ce.getPos(); LOG.warn("Checksum error in block "
PacketHeader header = new PacketHeader(); header.readFields(in); if (!header.sanityCheck(lastSeqNo)) { throw new IOException("BlockReader: error in packet header " + header); lastSeqNo = header.getSeqno(); dataLeft = header.getDataLen(); adjustChecksumBytes(header.getDataLen()); if (header.getDataLen() > 0) { IOUtils.readFully(in, checksumBytes.array(), 0, checksumBytes.limit()); PacketHeader hdr = new PacketHeader(); hdr.readFields(in); if (!hdr.isLastPacketInBlock() || hdr.getDataLen() != 0) { throw new IOException("Expected empty end-of-read packet! Header: " + hdr);
if (header.getOffsetInBlock() > replicaInfo.getNumBytes()) { throw new IOException("Received an out-of-sequence packet for " + block + "from " + inAddr + " at offset " + header.getOffsetInBlock() + ". Expecting packet starting at " + replicaInfo.getNumBytes()); if (header.getDataLen() < 0) { throw new IOException("Got wrong length during writeBlock(" + block + ") from " + inAddr + " at offset " + header.getOffsetInBlock() + ": " + header.getDataLen()); long offsetInBlock = header.getOffsetInBlock(); long seqno = header.getSeqno(); boolean lastPacketInBlock = header.isLastPacketInBlock(); final int len = header.getDataLen(); boolean syncBlock = header.getSyncBlock();
assert curDataSlice.capacity() == curHeader.getDataLen(); if (!curHeader.sanityCheck(lastSeqNo)) { throw new IOException("BlockReader: error in packet header " + curHeader); if (curHeader.getDataLen() > 0) { int chunks = 1 + (curHeader.getDataLen() - 1) / bytesPerChecksum; int checksumsLen = chunks * checksumSize; " checksumsLen=" + checksumsLen; lastSeqNo = curHeader.getSeqno(); if (verifyChecksum && curDataSlice.remaining() > 0) { filename, curHeader.getOffsetInBlock()); bytesNeededToFinish -= curHeader.getDataLen(); if (curHeader.getOffsetInBlock() < startOffset) { int newPos = (int) (startOffset - curHeader.getOffsetInBlock()); curDataSlice.position(newPos);
Preconditions.checkState(curHeader == null || !curHeader.isLastPacketInBlock()); curPacketBuf.get(headerBuf); if (curHeader == null) { curHeader = new PacketHeader(); curHeader.setFieldsFromData(payloadLen, headerBuf); int checksumLen = dataPlusChecksumLen - curHeader.getDataLen(); if (checksumLen < 0) { throw new IOException("Invalid packet: data length in packet header " + reslicePacket(headerLen, checksumLen, curHeader.getDataLen());
final int pktLen = HdfsConstants.BYTES_IN_INTEGER + dataLen + checksumLen; PacketHeader header = new PacketHeader( pktLen, offsetInBlock, seqno, lastPacketInBlock, dataLen, syncBlock); final int headerStart = checksumStart - header.getSerializedSize(); assert checksumStart + 1 >= header.getSerializedSize(); assert headerStart >= 0; assert headerStart + header.getSerializedSize() == checksumStart; System.arraycopy(header.getBytes(), 0, buf, headerStart, header.getSerializedSize()); buf[headerStart+header.getSerializedSize() + checksumLen + dataLen-1] ^= 0xff; stm.write(buf, headerStart, header.getSerializedSize() + checksumLen + dataLen); buf[headerStart+header.getSerializedSize() + checksumLen + dataLen-1] ^= 0xff;
public byte[] getBytes() { ByteBuffer buf = ByteBuffer.allocate(getSerializedSize()); putInBuffer(buf); return buf.array(); }
private void readTrailingEmptyPacket() throws IOException { if (LOG.isTraceEnabled()) { LOG.trace("Reading empty packet at end of read"); } packetReceiver.receiveNextPacket(in); PacketHeader trailer = packetReceiver.getHeader(); if (!trailer.isLastPacketInBlock() || trailer.getDataLen() != 0) { throw new IOException("Expected empty end-of-read packet! Header: " + trailer); } }
private void writeZeroLengthPacket(ExtendedBlock block, String description) throws IOException { PacketHeader hdr = new PacketHeader( 8, // size of packet block.getNumBytes(), // OffsetInBlock 100, // sequencenumber true, // lastPacketInBlock 0, // chunk length false); // sync block hdr.write(sendOut); sendOut.writeInt(0); // zero checksum //ok finally write a block with 0 len sendResponse(Status.SUCCESS, "", null, recvOut); new PipelineAck(100, new int[] {PipelineAck.combineHeader (PipelineAck.ECN.DISABLED, Status.SUCCESS)}).write (recvOut); sendRecvData(description, false); }