You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bookkeeper.apache.org by eo...@apache.org on 2017/06/01 19:22:40 UTC
bookkeeper git commit: BOOKKEEPER-1056: Removed PacketHeader
serialization/deserialization allocation
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 <mm...@yahoo-inc.com>
Reviewers: Enrico Olivelli <None>, Sijie Guo <None>, Venkateswararao Jujjuri (JV) <None>
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 <mm...@yahoo-inc.com>
Authored: Thu Jun 1 21:20:59 2017 +0200
Committer: Enrico Olivelli <eo...@localhost.localdomain>
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);
+ }
}
}