From 39a77a14ae95301ef9a9c5d390e444397e06b3da Mon Sep 17 00:00:00 2001 From: brandboat Date: Tue, 7 Aug 2018 21:24:28 +0800 Subject: [PATCH] HBASE-21012 Revert the change of serializing TimeRangeTracker --- .../hbase/regionserver/TimeRangeTracker.java | 27 ++++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/TimeRangeTracker.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/TimeRangeTracker.java index 5c0eee5..9e900ce 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/TimeRangeTracker.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/TimeRangeTracker.java @@ -19,7 +19,9 @@ package org.apache.hadoop.hbase.regionserver; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; import java.util.concurrent.atomic.AtomicLong; @@ -206,13 +208,24 @@ public abstract class TimeRangeTracker { } } - public static byte[] toByteArray(TimeRangeTracker tracker) { - return ProtobufUtil.prependPBMagic( - HBaseProtos.TimeRangeTracker.newBuilder() - .setFrom(tracker.getMin()) - .setTo(tracker.getMax()) - .build() - .toByteArray()); + /** + * This method used to serialize TimeRangeTracker (TRT) by protobuf while this breaks the backward + * compatible on HFile.(See HBASE-21008) In previous hbase version ( < 2.0.0 ) we use DataOut to + * serialize TRT, these old versions don't have capability to deserialize TRT which is serialized + * by protobuf. So we need to revert the change of serializing TimeRangeTracker back to DataOut. + * For more information, please check HBASE-21012. + * @param tracker TimeRangeTracker needed to be serialized. + * @return byte array filled with serialized TimeRangeTracker. + * @throws IOException + */ + public static byte[] toByteArray(TimeRangeTracker tracker) throws IOException { + try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) { + try (DataOutputStream dos = new DataOutputStream(bos)) { + dos.writeLong(tracker.getMin()); + dos.writeLong(tracker.getMax()); + return bos.toByteArray(); + } + } } /** -- 2.7.4