From 8bfa8aaaca4560855cb672a0e8232d3849d93c85 Mon Sep 17 00:00:00 2001 From: anoopsamjohn Date: Tue, 6 Jun 2017 12:25:15 +0530 Subject: [PATCH] HBASE-18030 Per Cell TTL tags may get duplicated with increments/Append causing tags length overflow. --- .../java/org/apache/hadoop/hbase/TagUtil.java | 10 ++++ .../org/apache/hadoop/hbase/TestTagUtil.java | 49 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 hbase-common/src/test/java/org/apache/hadoop/hbase/TestTagUtil.java diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/TagUtil.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/TagUtil.java index 936d8c27e41..46820356722 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/TagUtil.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/TagUtil.java @@ -277,6 +277,16 @@ public final class TagUtil { // tag-handling). if (tags == null) { tags = new ArrayList<>(1); + } else { + // Remove existing TTL tags if any + Iterator tagsItr = tags.iterator(); + while (tagsItr.hasNext()) { + Tag tag = tagsItr.next(); + if (tag.getType() == TagType.TTL_TAG_TYPE) { + tagsItr.remove(); + break; + } + } } tags.add(new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(ttl))); return tags; diff --git a/hbase-common/src/test/java/org/apache/hadoop/hbase/TestTagUtil.java b/hbase-common/src/test/java/org/apache/hadoop/hbase/TestTagUtil.java new file mode 100644 index 00000000000..d7894f44f5a --- /dev/null +++ b/hbase-common/src/test/java/org/apache/hadoop/hbase/TestTagUtil.java @@ -0,0 +1,49 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hbase; + +import static org.junit.Assert.assertEquals; + +import java.util.List; + +import org.apache.hadoop.hbase.testclassification.MiscTests; +import org.apache.hadoop.hbase.testclassification.SmallTests; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +@Category({ MiscTests.class, SmallTests.class }) +public class TestTagUtil { + + @Test + public void testCarryForwardTTLTag() throws Exception { + // No tags so far and the TTL tag must get added to the Tags list + long ttl = 10 * 1000; + List tags = TagUtil.carryForwardTTLTag(null, ttl); + assertEquals(1, tags.size()); + Tag ttlTag = tags.get(0); + assertEquals(TagType.TTL_TAG_TYPE, ttlTag.getType()); + assertEquals(ttl, TagUtil.getValueAsLong(ttlTag)); + // Already having a TTL tag in the list. So the call must remove the old tag + long ttl2 = 30 * 1000; + tags = TagUtil.carryForwardTTLTag(tags, ttl2); + assertEquals(1, tags.size()); + ttlTag = tags.get(0); + assertEquals(TagType.TTL_TAG_TYPE, ttlTag.getType()); + assertEquals(ttl2, TagUtil.getValueAsLong(ttlTag)); + } +}