[ https://issues.apache.org/jira/browse/HBASE-16891?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15604201#comment-15604201 ]
ramkrishna.s.vasudevan commented on HBASE-16891: ------------------------------------------------ The hack that I tried here. Just pasting the snippet. I am already working on a full fledged patch\ In AsyncProtobufWriter#append {code} length.addAndGet(buf.size()); output.write(buf.getBuffer(), 0, buf.size()); buf.reset(); for (Cell cell : entry.getEdit().getCells()) { length.addAndGet(((KeyValue)cell).getLength()); output.write(((KeyValue)cell).getBuffer(), ((KeyValue)cell).getOffset(), ((KeyValue)cell).getLength()); } {code} And inside the Asyncoutput write I tried writing the length and the data together at one shot. Something like this {code} buf.ensureWritable(len + Bytes.SIZEOF_INT); if (cryptoCodec == null) { buf.writeInt(len); buf.writeBytes(b, off, len); } else { ByteBuffer inBuffer = ByteBuffer.wrap(b, off, len); cryptoCodec.encrypt(inBuffer, buf.nioBuffer(buf.writerIndex(), len)); buf.writerIndex(buf.writerIndex() + len); } {code} > Try copying to the Netty ByteBuf directly from the WALEdit > ---------------------------------------------------------- > > Key: HBASE-16891 > URL: https://issues.apache.org/jira/browse/HBASE-16891 > Project: HBase > Issue Type: Sub-task > Components: wal > Affects Versions: 2.0.0 > Reporter: ramkrishna.s.vasudevan > Assignee: ramkrishna.s.vasudevan > Fix For: 2.0.0 > > > -> The FanOutOneBlockAsyncDFSOutput is a much sophisticated dfs client model > that works with Netty ByteBuf. Here we hold on connection to the datanodes > using > Netty Channels. And the idea is to write data direclty to these channels. > AsyncHLog gets an append call. The AysncWAL uses the HBase's > ByteArrayOutputSTream and so the content of the cell is written to this BAOS > and that is again > copied to the netty Bytebuf in the FanOutOneBlockAsyncDFSOutput. > So when the sync call happens this FanoutDFSoutput does the checksum > calcualtion itself and then writes the content of this buffer direclty to the > DN channel. > -> In case of FSHLOg this is different. When an append call comes we direclty > write the content to the FSDataOutputStream (it is copied to this stream). > Then here internally there is a checkSum calculation that happens. when a > sync call happens there is noth ing to do except to notify the NN to flush > the latest > data. > AS we can see from the above that there are two copies in AsyncWAL > -> From the Cell to the BAOS > -> From the BAOS to the Netty byte buf > -> On sync() call, do check sum and finally flush the netty byte buf to the > DN channel > In case of FSHLog > -> From cell to the FSDataoutputstream. data is copied. Check sum happens > here. > -> Sync call just tries to notify the NN. -- This message was sent by Atlassian JIRA (v6.3.4#6332)