This is an automated email from the ASF dual-hosted git repository. stoty pushed a commit to branch branch-3 in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-3 by this push: new 7f60bd4b2c0 HBASE-28646 Use Streams to unmarshall protobuf REST data (#5974) 7f60bd4b2c0 is described below commit 7f60bd4b2c05cabf96178c500a70f647ec7f8a2a Author: Istvan Toth <st...@apache.org> AuthorDate: Tue Jun 11 20:00:44 2024 +0200 HBASE-28646 Use Streams to unmarshall protobuf REST data (#5974) Signed-off-by: Duo Zhang <zhang...@apache.org> (cherry picked from commit 91b351264dec4ecf08103577c6bfa51da1197c39) --- .../hadoop/hbase/rest/ProtobufMessageHandler.java | 33 ++++++++++++++++------ .../org/apache/hadoop/hbase/rest/RestUtil.java | 17 +++++++++++ .../apache/hadoop/hbase/rest/model/CellModel.java | 7 +++-- .../hadoop/hbase/rest/model/CellSetModel.java | 7 +++-- .../hbase/rest/model/NamespacesInstanceModel.java | 6 ++-- .../hadoop/hbase/rest/model/NamespacesModel.java | 6 ++-- .../apache/hadoop/hbase/rest/model/RowModel.java | 3 +- .../hadoop/hbase/rest/model/ScannerModel.java | 7 +++-- .../rest/model/StorageClusterStatusModel.java | 7 +++-- .../hadoop/hbase/rest/model/TableInfoModel.java | 7 +++-- .../hadoop/hbase/rest/model/TableListModel.java | 7 +++-- .../hadoop/hbase/rest/model/TableSchemaModel.java | 7 +++-- .../hadoop/hbase/rest/model/VersionModel.java | 7 +++-- .../consumer/ProtobufMessageBodyConsumer.java | 16 +---------- 14 files changed, 84 insertions(+), 53 deletions(-) diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/ProtobufMessageHandler.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/ProtobufMessageHandler.java index 962e5dfae86..1b84dc7c93d 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/ProtobufMessageHandler.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/ProtobufMessageHandler.java @@ -18,9 +18,11 @@ package org.apache.hadoop.hbase.rest; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import org.apache.yetus.audience.InterfaceAudience; +import org.apache.hbase.thirdparty.com.google.protobuf.CodedInputStream; import org.apache.hbase.thirdparty.com.google.protobuf.CodedOutputStream; import org.apache.hbase.thirdparty.com.google.protobuf.Message; @@ -47,7 +49,7 @@ public interface ProtobufMessageHandler { } /** - * Returns the protobuf represention of the model in a byte array Use + * Returns the protobuf represention of the model in a byte array. Use * {@link org.apache.hadoop.hbase.rest.ProtobufMessageHandler#writeProtobufOutput(OutputStream)} * for better performance * @return the protobuf encoded object in a byte array @@ -63,15 +65,28 @@ public interface ProtobufMessageHandler { Message messageFromObject(); /** - * Initialize the model from a protobuf representation. + * Initialize the model from a protobuf representation. Use + * {@link org.apache.hadoop.hbase.rest.ProtobufMessageHandler#getObjectFromMessage(InputStream)} + * for better performance * @param message the raw bytes of the protobuf message * @return reference to self for convenience */ - // TODO implement proper stream handling for unmarshalling. - // Using byte array here lets us use ProtobufUtil.mergeFrom in the implementations to - // avoid the CodedOutputStream size limitation, but is slow - // and memory intensive. We could use the ProtobufUtil.mergeFrom() variant that takes - // an inputStream and sets the size limit to maxInt. - // This would help both on the client side, and when processing large Puts on the server. - ProtobufMessageHandler getObjectFromMessage(byte[] message) throws IOException; + default ProtobufMessageHandler getObjectFromMessage(byte[] message) throws IOException { + final CodedInputStream codedInput = CodedInputStream.newInstance(message); + codedInput.setSizeLimit(message.length); + return getObjectFromMessage(codedInput); + } + + /** + * Initialize the model from a protobuf representation. + * @param is InputStream providing the protobuf message + * @return reference to self for convenience + */ + default ProtobufMessageHandler getObjectFromMessage(InputStream is) throws IOException { + final CodedInputStream codedInput = CodedInputStream.newInstance(is); + codedInput.setSizeLimit(Integer.MAX_VALUE); + return getObjectFromMessage(codedInput); + } + + ProtobufMessageHandler getObjectFromMessage(CodedInputStream cis) throws IOException; } diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/RestUtil.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/RestUtil.java index 5f884c510d6..ffd5fb208d7 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/RestUtil.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/RestUtil.java @@ -17,12 +17,16 @@ */ package org.apache.hadoop.hbase.rest; +import java.io.IOException; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.rest.model.CellModel; import org.apache.hadoop.hbase.rest.model.RowModel; import org.apache.yetus.audience.InterfaceAudience; +import org.apache.hbase.thirdparty.com.google.protobuf.CodedInputStream; +import org.apache.hbase.thirdparty.com.google.protobuf.Message; + @InterfaceAudience.Private public final class RestUtil { @@ -45,4 +49,17 @@ public final class RestUtil { } return rowModel; } + + /** + * Merges the object from codedInput, then calls checkLastTagWas. This is based on + * ProtobufUtil.mergeFrom, but we have already taken care of setSizeLimit() before calling, so + * only the checkLastTagWas() call is retained. + * @param builder protobuf object builder + * @param codedInput encoded object data + */ + public static void mergeFrom(Message.Builder builder, CodedInputStream codedInput) + throws IOException { + builder.mergeFrom(codedInput); + codedInput.checkLastTagWas(0); + } } diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/CellModel.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/CellModel.java index 3d8806b7dc0..00475518103 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/CellModel.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/CellModel.java @@ -34,12 +34,13 @@ import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.rest.ProtobufMessageHandler; +import org.apache.hadoop.hbase.rest.RestUtil; import org.apache.yetus.audience.InterfaceAudience; +import org.apache.hbase.thirdparty.com.google.protobuf.CodedInputStream; import org.apache.hbase.thirdparty.com.google.protobuf.Message; import org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations; -import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.shaded.rest.protobuf.generated.CellMessage.Cell; /** @@ -218,9 +219,9 @@ public class CellModel implements ProtobufMessageHandler, Serializable { } @Override - public ProtobufMessageHandler getObjectFromMessage(byte[] message) throws IOException { + public ProtobufMessageHandler getObjectFromMessage(CodedInputStream cis) throws IOException { Cell.Builder builder = Cell.newBuilder(); - ProtobufUtil.mergeFrom(builder, message); + RestUtil.mergeFrom(builder, cis); setColumn(builder.getColumn().toByteArray()); setValue(builder.getData().toByteArray()); if (builder.hasTimestamp()) { diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/CellSetModel.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/CellSetModel.java index 8486be2762f..2a746274254 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/CellSetModel.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/CellSetModel.java @@ -29,12 +29,13 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.rest.ProtobufMessageHandler; +import org.apache.hadoop.hbase.rest.RestUtil; import org.apache.yetus.audience.InterfaceAudience; +import org.apache.hbase.thirdparty.com.google.protobuf.CodedInputStream; import org.apache.hbase.thirdparty.com.google.protobuf.Message; import org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations; -import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.shaded.rest.protobuf.generated.CellMessage.Cell; import org.apache.hadoop.hbase.shaded.rest.protobuf.generated.CellSetMessage.CellSet; @@ -139,9 +140,9 @@ public class CellSetModel implements Serializable, ProtobufMessageHandler { } @Override - public ProtobufMessageHandler getObjectFromMessage(byte[] message) throws IOException { + public ProtobufMessageHandler getObjectFromMessage(CodedInputStream cis) throws IOException { CellSet.Builder builder = CellSet.newBuilder(); - ProtobufUtil.mergeFrom(builder, message); + RestUtil.mergeFrom(builder, cis); for (CellSet.Row row : builder.getRowsList()) { RowModel rowModel = new RowModel(row.getKey().toByteArray()); for (Cell cell : row.getValuesList()) { diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/NamespacesInstanceModel.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/NamespacesInstanceModel.java index 78f64720385..ee5fed13b57 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/NamespacesInstanceModel.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/NamespacesInstanceModel.java @@ -29,8 +29,10 @@ import javax.xml.bind.annotation.XmlTransient; import org.apache.hadoop.hbase.NamespaceDescriptor; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.rest.ProtobufMessageHandler; +import org.apache.hadoop.hbase.rest.RestUtil; import org.apache.yetus.audience.InterfaceAudience; +import org.apache.hbase.thirdparty.com.google.protobuf.CodedInputStream; import org.apache.hbase.thirdparty.com.google.protobuf.Message; import org.apache.hadoop.hbase.shaded.rest.protobuf.generated.NamespacePropertiesMessage.NamespaceProperties; @@ -157,9 +159,9 @@ public class NamespacesInstanceModel implements Serializable, ProtobufMessageHan } @Override - public ProtobufMessageHandler getObjectFromMessage(byte[] message) throws IOException { + public ProtobufMessageHandler getObjectFromMessage(CodedInputStream cis) throws IOException { NamespaceProperties.Builder builder = NamespaceProperties.newBuilder(); - builder.mergeFrom(message); + RestUtil.mergeFrom(builder, cis); List<NamespaceProperties.Property> properties = builder.getPropsList(); for (NamespaceProperties.Property property : properties) { addProperty(property.getKey(), property.getValue()); diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/NamespacesModel.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/NamespacesModel.java index 90e4f6560a5..e13e5633322 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/NamespacesModel.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/NamespacesModel.java @@ -29,8 +29,10 @@ import javax.xml.bind.annotation.XmlRootElement; import org.apache.hadoop.hbase.NamespaceDescriptor; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.rest.ProtobufMessageHandler; +import org.apache.hadoop.hbase.rest.RestUtil; import org.apache.yetus.audience.InterfaceAudience; +import org.apache.hbase.thirdparty.com.google.protobuf.CodedInputStream; import org.apache.hbase.thirdparty.com.google.protobuf.Message; import org.apache.hadoop.hbase.shaded.rest.protobuf.generated.NamespacesMessage.Namespaces; @@ -104,9 +106,9 @@ public class NamespacesModel implements Serializable, ProtobufMessageHandler { } @Override - public ProtobufMessageHandler getObjectFromMessage(byte[] message) throws IOException { + public ProtobufMessageHandler getObjectFromMessage(CodedInputStream cis) throws IOException { Namespaces.Builder builder = Namespaces.newBuilder(); - builder.mergeFrom(message); + RestUtil.mergeFrom(builder, cis); namespaces = builder.getNamespaceList(); return this; } diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/RowModel.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/RowModel.java index e200dfbc1f3..3b5e274d442 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/RowModel.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/RowModel.java @@ -36,6 +36,7 @@ import org.apache.hadoop.hbase.rest.ProtobufMessageHandler; import org.apache.hadoop.hbase.util.Bytes; import org.apache.yetus.audience.InterfaceAudience; +import org.apache.hbase.thirdparty.com.google.protobuf.CodedInputStream; import org.apache.hbase.thirdparty.com.google.protobuf.Message; /** @@ -187,7 +188,7 @@ public class RowModel implements ProtobufMessageHandler, Serializable { } @Override - public ProtobufMessageHandler getObjectFromMessage(byte[] message) throws IOException { + public ProtobufMessageHandler getObjectFromMessage(CodedInputStream is) throws IOException { // there is no standalone row protobuf message throw new UnsupportedOperationException("no protobuf equivalent to RowModel"); } diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/ScannerModel.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/ScannerModel.java index 9bd740c1b3b..a18a9ba427a 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/ScannerModel.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/ScannerModel.java @@ -67,17 +67,18 @@ import org.apache.hadoop.hbase.filter.TimestampsFilter; import org.apache.hadoop.hbase.filter.ValueFilter; import org.apache.hadoop.hbase.filter.WhileMatchFilter; import org.apache.hadoop.hbase.rest.ProtobufMessageHandler; +import org.apache.hadoop.hbase.rest.RestUtil; import org.apache.hadoop.hbase.security.visibility.Authorizations; import org.apache.hadoop.hbase.util.Bytes; import org.apache.yetus.audience.InterfaceAudience; import org.apache.hbase.thirdparty.com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; import org.apache.hbase.thirdparty.com.google.protobuf.ByteString; +import org.apache.hbase.thirdparty.com.google.protobuf.CodedInputStream; import org.apache.hbase.thirdparty.com.google.protobuf.Message; import org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations; import org.apache.hbase.thirdparty.javax.ws.rs.core.MediaType; -import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.shaded.rest.protobuf.generated.ScannerMessage.Scanner; /** @@ -925,9 +926,9 @@ public class ScannerModel implements ProtobufMessageHandler, Serializable { } @Override - public ProtobufMessageHandler getObjectFromMessage(byte[] message) throws IOException { + public ProtobufMessageHandler getObjectFromMessage(CodedInputStream cis) throws IOException { Scanner.Builder builder = Scanner.newBuilder(); - ProtobufUtil.mergeFrom(builder, message); + RestUtil.mergeFrom(builder, cis); if (builder.hasStartRow()) { startRow = builder.getStartRow().toByteArray(); } diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/StorageClusterStatusModel.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/StorageClusterStatusModel.java index c9370cad901..ae3671a509f 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/StorageClusterStatusModel.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/StorageClusterStatusModel.java @@ -27,13 +27,14 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import org.apache.hadoop.hbase.rest.ProtobufMessageHandler; +import org.apache.hadoop.hbase.rest.RestUtil; import org.apache.hadoop.hbase.util.Bytes; import org.apache.yetus.audience.InterfaceAudience; +import org.apache.hbase.thirdparty.com.google.protobuf.CodedInputStream; import org.apache.hbase.thirdparty.com.google.protobuf.Message; import org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations; -import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.shaded.rest.protobuf.generated.StorageClusterStatusMessage.StorageClusterStatus; /** @@ -713,9 +714,9 @@ public class StorageClusterStatusModel implements Serializable, ProtobufMessageH } @Override - public ProtobufMessageHandler getObjectFromMessage(byte[] message) throws IOException { + public ProtobufMessageHandler getObjectFromMessage(CodedInputStream cis) throws IOException { StorageClusterStatus.Builder builder = StorageClusterStatus.newBuilder(); - ProtobufUtil.mergeFrom(builder, message); + RestUtil.mergeFrom(builder, cis); if (builder.hasRegions()) { regions = builder.getRegions(); } diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/TableInfoModel.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/TableInfoModel.java index 43b131fcb70..9656f0c8214 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/TableInfoModel.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/TableInfoModel.java @@ -25,12 +25,13 @@ import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import org.apache.hadoop.hbase.rest.ProtobufMessageHandler; +import org.apache.hadoop.hbase.rest.RestUtil; import org.apache.yetus.audience.InterfaceAudience; +import org.apache.hbase.thirdparty.com.google.protobuf.CodedInputStream; import org.apache.hbase.thirdparty.com.google.protobuf.Message; import org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations; -import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.shaded.rest.protobuf.generated.TableInfoMessage.TableInfo; /** @@ -140,9 +141,9 @@ public class TableInfoModel implements Serializable, ProtobufMessageHandler { } @Override - public ProtobufMessageHandler getObjectFromMessage(byte[] message) throws IOException { + public ProtobufMessageHandler getObjectFromMessage(CodedInputStream cis) throws IOException { TableInfo.Builder builder = TableInfo.newBuilder(); - ProtobufUtil.mergeFrom(builder, message); + RestUtil.mergeFrom(builder, cis); setName(builder.getName()); for (TableInfo.Region region : builder.getRegionsList()) { add( diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/TableListModel.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/TableListModel.java index 63b2e809279..7a3430e03d4 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/TableListModel.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/TableListModel.java @@ -24,11 +24,12 @@ import java.util.List; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlRootElement; import org.apache.hadoop.hbase.rest.ProtobufMessageHandler; +import org.apache.hadoop.hbase.rest.RestUtil; import org.apache.yetus.audience.InterfaceAudience; +import org.apache.hbase.thirdparty.com.google.protobuf.CodedInputStream; import org.apache.hbase.thirdparty.com.google.protobuf.Message; -import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.shaded.rest.protobuf.generated.TableListMessage.TableList; /** @@ -101,9 +102,9 @@ public class TableListModel implements Serializable, ProtobufMessageHandler { } @Override - public ProtobufMessageHandler getObjectFromMessage(byte[] message) throws IOException { + public ProtobufMessageHandler getObjectFromMessage(CodedInputStream cis) throws IOException { TableList.Builder builder = TableList.newBuilder(); - ProtobufUtil.mergeFrom(builder, message); + RestUtil.mergeFrom(builder, cis); for (String table : builder.getNameList()) { this.add(new TableModel(table)); } diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/TableSchemaModel.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/TableSchemaModel.java index f2a8c4c7060..3e28afdfbae 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/TableSchemaModel.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/TableSchemaModel.java @@ -39,12 +39,13 @@ import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder; import org.apache.hadoop.hbase.client.TableDescriptor; import org.apache.hadoop.hbase.client.TableDescriptorBuilder; import org.apache.hadoop.hbase.rest.ProtobufMessageHandler; +import org.apache.hadoop.hbase.rest.RestUtil; import org.apache.hadoop.hbase.util.Bytes; import org.apache.yetus.audience.InterfaceAudience; +import org.apache.hbase.thirdparty.com.google.protobuf.CodedInputStream; import org.apache.hbase.thirdparty.com.google.protobuf.Message; -import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.shaded.rest.protobuf.generated.ColumnSchemaMessage.ColumnSchema; import org.apache.hadoop.hbase.shaded.rest.protobuf.generated.TableSchemaMessage.TableSchema; @@ -287,9 +288,9 @@ public class TableSchemaModel implements Serializable, ProtobufMessageHandler { } @Override - public ProtobufMessageHandler getObjectFromMessage(byte[] message) throws IOException { + public ProtobufMessageHandler getObjectFromMessage(CodedInputStream cis) throws IOException { TableSchema.Builder builder = TableSchema.newBuilder(); - ProtobufUtil.mergeFrom(builder, message); + RestUtil.mergeFrom(builder, cis); this.setName(builder.getName()); for (TableSchema.Attribute attr : builder.getAttrsList()) { this.addAttribute(attr.getName(), attr.getValue()); diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/VersionModel.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/VersionModel.java index 65eca57ac5a..359211ef5e2 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/VersionModel.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/VersionModel.java @@ -24,12 +24,13 @@ import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; import org.apache.hadoop.hbase.rest.ProtobufMessageHandler; import org.apache.hadoop.hbase.rest.RESTServlet; +import org.apache.hadoop.hbase.rest.RestUtil; import org.apache.yetus.audience.InterfaceAudience; +import org.apache.hbase.thirdparty.com.google.protobuf.CodedInputStream; import org.apache.hbase.thirdparty.com.google.protobuf.Message; import org.apache.hbase.thirdparty.org.glassfish.jersey.servlet.ServletContainer; -import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.shaded.rest.protobuf.generated.VersionMessage.Version; /** @@ -174,9 +175,9 @@ public class VersionModel implements Serializable, ProtobufMessageHandler { } @Override - public ProtobufMessageHandler getObjectFromMessage(byte[] message) throws IOException { + public ProtobufMessageHandler getObjectFromMessage(CodedInputStream cis) throws IOException { Version.Builder builder = Version.newBuilder(); - ProtobufUtil.mergeFrom(builder, message); + RestUtil.mergeFrom(builder, cis); if (builder.hasRestVersion()) { restVersion = builder.getRestVersion(); } diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/provider/consumer/ProtobufMessageBodyConsumer.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/provider/consumer/ProtobufMessageBodyConsumer.java index 7c3f6f8ea40..340962730e7 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/provider/consumer/ProtobufMessageBodyConsumer.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/provider/consumer/ProtobufMessageBodyConsumer.java @@ -17,7 +17,6 @@ */ package org.apache.hadoop.hbase.rest.provider.consumer; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.lang.annotation.Annotation; @@ -59,23 +58,10 @@ public class ProtobufMessageBodyConsumer implements MessageBodyReader<ProtobufMe ProtobufMessageHandler obj = null; try { obj = type.getDeclaredConstructor().newInstance(); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte[] buffer = new byte[4096]; - int read; - do { - read = inputStream.read(buffer, 0, buffer.length); - if (read > 0) { - baos.write(buffer, 0, read); - } - } while (read > 0); - if (LOG.isTraceEnabled()) { - LOG.trace(getClass() + ": read " + baos.size() + " bytes from " + inputStream); - } - obj = obj.getObjectFromMessage(baos.toByteArray()); + return obj.getObjectFromMessage(inputStream); } catch (InstantiationException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { throw new WebApplicationException(e); } - return obj; } }