Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id AA12D200CA3 for ; Thu, 1 Jun 2017 21:22:42 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id A8AC8160BC4; Thu, 1 Jun 2017 19:22:42 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id A1502160BC1 for ; Thu, 1 Jun 2017 21:22:41 +0200 (CEST) Received: (qmail 8338 invoked by uid 500); 1 Jun 2017 19:22:40 -0000 Mailing-List: contact commits-help@bookkeeper.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: bookkeeper-dev@bookkeeper.apache.org Delivered-To: mailing list commits@bookkeeper.apache.org Received: (qmail 8329 invoked by uid 99); 1 Jun 2017 19:22:40 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 01 Jun 2017 19:22:40 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id B97D1DFFB2; Thu, 1 Jun 2017 19:22:40 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: eolivelli@apache.org To: commits@bookkeeper.apache.org Message-Id: <6cbdab887eaf4cdd9130460af6c8e0b6@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: bookkeeper git commit: BOOKKEEPER-1056: Removed PacketHeader serialization/deserialization allocation Date: Thu, 1 Jun 2017 19:22:40 +0000 (UTC) archived-at: Thu, 01 Jun 2017 19:22:42 -0000 Repository: bookkeeper Updated Branches: refs/heads/master dd08ce1a6 -> a9fe7d94f BOOKKEEPER-1056: Removed PacketHeader serialization/deserialization allocation When parsing the request packet header, use static methods to avoid creating a `PacketHeader` instance. Author: Matteo Merli Reviewers: Enrico Olivelli , Sijie Guo , Venkateswararao Jujjuri (JV) Closes #175 from merlimat/packet-header-parsing Project: http://git-wip-us.apache.org/repos/asf/bookkeeper/repo Commit: http://git-wip-us.apache.org/repos/asf/bookkeeper/commit/a9fe7d94 Tree: http://git-wip-us.apache.org/repos/asf/bookkeeper/tree/a9fe7d94 Diff: http://git-wip-us.apache.org/repos/asf/bookkeeper/diff/a9fe7d94 Branch: refs/heads/master Commit: a9fe7d94f1890f697633fdca8abdeff23903025f Parents: dd08ce1 Author: Matteo Merli Authored: Thu Jun 1 21:20:59 2017 +0200 Committer: Enrico Olivelli Committed: Thu Jun 1 21:20:59 2017 +0200 ---------------------------------------------------------------------- .../bookkeeper/proto/BookieProtoEncoding.java | 48 ++++++++++---------- .../apache/bookkeeper/proto/BookieProtocol.java | 47 +++++++------------ 2 files changed, 40 insertions(+), 55 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/bookkeeper/blob/a9fe7d94/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java ---------------------------------------------------------------------- diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java index cd71b26..8de4323 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java @@ -101,7 +101,7 @@ public class BookieProtoEncoding { int totalHeaderSize = 4 // for the header + BookieProtocol.MASTER_KEY_LENGTH; // for the master key ByteBuf buf = allocator.buffer(totalHeaderSize); - buf.writeInt(new PacketHeader(r.getProtocolVersion(), r.getOpCode(), r.getFlags()).toInt()); + buf.writeInt(PacketHeader.toInt(r.getProtocolVersion(), r.getOpCode(), r.getFlags())); buf.writeBytes(r.getMasterKey(), 0, BookieProtocol.MASTER_KEY_LENGTH); return DoubleByteBuf.get(buf, ar.getData()); } else if (r instanceof BookieProtocol.ReadRequest) { @@ -113,7 +113,7 @@ public class BookieProtoEncoding { } ByteBuf buf = allocator.buffer(totalHeaderSize); - buf.writeInt(new PacketHeader(r.getProtocolVersion(), r.getOpCode(), r.getFlags()).toInt()); + buf.writeInt(PacketHeader.toInt(r.getProtocolVersion(), r.getOpCode(), r.getFlags())); buf.writeLong(r.getLedgerId()); buf.writeLong(r.getEntryId()); if (r.hasMasterKey()) { @@ -126,9 +126,7 @@ public class BookieProtoEncoding { int totalHeaderSize = 4; // for request type int totalSize = totalHeaderSize + am.getSerializedSize(); ByteBuf buf = allocator.buffer(totalSize); - buf.writeInt(new PacketHeader(r.getProtocolVersion(), - r.getOpCode(), - r.getFlags()).toInt()); + buf.writeInt(PacketHeader.toInt(r.getProtocolVersion(), r.getOpCode(), r.getFlags())); ByteBufOutputStream bufStream = new ByteBufOutputStream(buf); am.writeTo(bufStream); return buf; @@ -140,41 +138,43 @@ public class BookieProtoEncoding { @Override public Object decode(ByteBuf packet) throws Exception { - PacketHeader h = PacketHeader.fromInt(packet.readInt()); + int packetHeader = packet.readInt(); + byte version = PacketHeader.getVersion(packetHeader); + byte opCode = PacketHeader.getOpCode(packetHeader); + short flags = PacketHeader.getFlags(packetHeader); // packet format is different between ADDENTRY and READENTRY long ledgerId = -1; long entryId = BookieProtocol.INVALID_ENTRY_ID; - short flags = h.getFlags(); - ServerStats.getInstance().incrementPacketsReceived(); - switch (h.getOpCode()) { + switch (opCode) { case BookieProtocol.ADDENTRY: { byte[] masterKey = readMasterKey(packet); // Read ledger and entry id without advancing the reader index ledgerId = packet.getLong(packet.readerIndex()); entryId = packet.getLong(packet.readerIndex() + 8); - return new BookieProtocol.AddRequest(h.getVersion(), ledgerId, entryId, flags, masterKey, packet.retain()); + return new BookieProtocol.AddRequest(version, ledgerId, entryId, flags, masterKey, packet.retain()); } + case BookieProtocol.READENTRY: ledgerId = packet.readLong(); entryId = packet.readLong(); if ((flags & BookieProtocol.FLAG_DO_FENCING) == BookieProtocol.FLAG_DO_FENCING - && h.getVersion() >= 2) { + && version >= 2) { byte[] masterKey = readMasterKey(packet); - return new BookieProtocol.ReadRequest(h.getVersion(), ledgerId, entryId, flags, masterKey); + return new BookieProtocol.ReadRequest(version, ledgerId, entryId, flags, masterKey); } else { - return new BookieProtocol.ReadRequest(h.getVersion(), ledgerId, entryId, flags); + return new BookieProtocol.ReadRequest(version, ledgerId, entryId, flags); } case BookieProtocol.AUTH: BookkeeperProtocol.AuthMessage.Builder builder = BookkeeperProtocol.AuthMessage.newBuilder(); builder.mergeFrom(new ByteBufInputStream(packet), extensionRegistry); - return new BookieProtocol.AuthRequest(h.getVersion(), builder.build()); + return new BookieProtocol.AuthRequest(version, builder.build()); } return packet; @@ -221,8 +221,7 @@ public class BookieProtoEncoding { } BookieProtocol.Response r = (BookieProtocol.Response)msg; ByteBuf buf = allocator.buffer(24); - buf.writeInt(new PacketHeader(r.getProtocolVersion(), - r.getOpCode(), (short)0).toInt()); + buf.writeInt(PacketHeader.toInt(r.getProtocolVersion(), r.getOpCode(), (short) 0)); ServerStats.getInstance().incrementPacketsSent(); if (msg instanceof BookieProtocol.ReadResponse) { @@ -255,16 +254,17 @@ public class BookieProtoEncoding { throws Exception { int rc; long ledgerId, entryId; - final PacketHeader header; - header = PacketHeader.fromInt(buffer.readInt()); + int packetHeader = buffer.readInt(); + byte version = PacketHeader.getVersion(packetHeader); + byte opCode = PacketHeader.getOpCode(packetHeader); - switch (header.getOpCode()) { + switch (opCode) { case BookieProtocol.ADDENTRY: rc = buffer.readInt(); ledgerId = buffer.readLong(); entryId = buffer.readLong(); - return new BookieProtocol.AddResponse(header.getVersion(), rc, ledgerId, entryId); + return new BookieProtocol.AddResponse(version, rc, ledgerId, entryId); case BookieProtocol.READENTRY: rc = buffer.readInt(); ledgerId = buffer.readLong(); @@ -272,11 +272,9 @@ public class BookieProtoEncoding { if (rc == BookieProtocol.EOK) { ByteBuf content = buffer.slice(); - return new BookieProtocol.ReadResponse(header.getVersion(), rc, - ledgerId, entryId, content.retain()); + return new BookieProtocol.ReadResponse(version, rc, ledgerId, entryId, content.retain()); } else { - return new BookieProtocol.ReadResponse(header.getVersion(), rc, - ledgerId, entryId); + return new BookieProtocol.ReadResponse(version, rc, ledgerId, entryId); } case BookieProtocol.AUTH: ByteBufInputStream bufStream = new ByteBufInputStream(buffer); @@ -284,7 +282,7 @@ public class BookieProtoEncoding { = BookkeeperProtocol.AuthMessage.newBuilder(); builder.mergeFrom(bufStream, extensionRegistry); BookkeeperProtocol.AuthMessage am = builder.build(); - return new BookieProtocol.AuthResponse(header.getVersion(), am); + return new BookieProtocol.AuthResponse(version, am); default: return buffer; } http://git-wip-us.apache.org/repos/asf/bookkeeper/blob/a9fe7d94/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtocol.java ---------------------------------------------------------------------- diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtocol.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtocol.java index f0cfa58..d744d09 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtocol.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtocol.java @@ -69,18 +69,8 @@ public interface BookieProtocol { * and just had an int representing the opCode as the * first int. This handles that case also. */ - static class PacketHeader { - final byte version; - final byte opCode; - final short flags; - - public PacketHeader(byte version, byte opCode, short flags) { - this.version = version; - this.opCode = opCode; - this.flags = flags; - } - - int toInt() { + final static class PacketHeader { + public static int toInt(byte version, byte opCode, short flags) { if (version == 0) { return (int)opCode; } else { @@ -90,29 +80,26 @@ public interface BookieProtocol { } } - static PacketHeader fromInt(int i) { - byte version = (byte)(i >> 24); - byte opCode = 0; - short flags = 0; + public static byte getVersion(int packetHeader) { + return (byte)(packetHeader >> 24); + } + + public static byte getOpCode(int packetHeader) { + int version = getVersion(packetHeader); if (version == 0) { - opCode = (byte)i; + return (byte) packetHeader; } else { - opCode = (byte)((i >> 16) & 0xFF); - flags = (short)(i & 0xFFFF); + return (byte)((packetHeader >> 16) & 0xFF); } - return new PacketHeader(version, opCode, flags); - } - - byte getVersion() { - return version; } - byte getOpCode() { - return opCode; - } - - short getFlags() { - return flags; + public static short getFlags(int packetHeader) { + byte version = (byte)(packetHeader >> 24); + if (version == 0) { + return 0; + } else { + return (short)(packetHeader & 0xFFFF); + } } }