Repository: hbase Updated Branches: refs/heads/master 59448cddd -> 8bfa8aaac
HBASE-18030 Per Cell TTL tags may get duplicated with increments/Append causing tags length overflow. Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/8bfa8aaa Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/8bfa8aaa Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/8bfa8aaa Branch: refs/heads/master Commit: 8bfa8aaaca4560855cb672a0e8232d3849d93c85 Parents: 59448cd Author: anoopsamjohn <anoopsamj...@gmail.com> Authored: Tue Jun 6 12:25:15 2017 +0530 Committer: anoopsamjohn <anoopsamj...@gmail.com> Committed: Tue Jun 6 12:25:15 2017 +0530 ---------------------------------------------------------------------- .../java/org/apache/hadoop/hbase/TagUtil.java | 10 ++++ .../org/apache/hadoop/hbase/TestTagUtil.java | 49 ++++++++++++++++++++ 2 files changed, 59 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/8bfa8aaa/hbase-common/src/main/java/org/apache/hadoop/hbase/TagUtil.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 936d8c2..4682035 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<Tag> 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; http://git-wip-us.apache.org/repos/asf/hbase/blob/8bfa8aaa/hbase-common/src/test/java/org/apache/hadoop/hbase/TestTagUtil.java ---------------------------------------------------------------------- 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 0000000..d7894f4 --- /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<Tag> 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)); + } +}