You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2021/07/25 13:12:54 UTC
[hbase] branch master updated: HBASE-26091 Remove
FirstKeyValueMatchingQualifiersFilter (#3497)
This is an automated email from the ASF dual-hosted git repository.
zhangduo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/master by this push:
new 8ae3942 HBASE-26091 Remove FirstKeyValueMatchingQualifiersFilter (#3497)
8ae3942 is described below
commit 8ae394285ac6955c1c9772e4ec34e2996d4f29fe
Author: GeorryHuang <21...@qq.com>
AuthorDate: Sun Jul 25 21:12:20 2021 +0800
HBASE-26091 Remove FirstKeyValueMatchingQualifiersFilter (#3497)
Signed-off-by: Duo Zhang <zh...@apache.org>
---
.../FirstKeyValueMatchingQualifiersFilter.java | 106 ++-------------------
.../src/main/protobuf/client/Filter.proto | 2 +
.../hbase/TestPartialResultsFromClientSide.java | 10 +-
.../hbase/filter/TestFilterSerialization.java | 20 ----
.../TestFirstKeyValueMatchingQualifiersFilter.java | 81 ----------------
5 files changed, 13 insertions(+), 206 deletions(-)
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FirstKeyValueMatchingQualifiersFilter.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FirstKeyValueMatchingQualifiersFilter.java
index 31866b8..91d0295 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FirstKeyValueMatchingQualifiersFilter.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FirstKeyValueMatchingQualifiersFilter.java
@@ -18,31 +18,15 @@
package org.apache.hadoop.hbase.filter;
-import java.util.Objects;
-import java.util.Set;
-import java.util.TreeSet;
-
-import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.CellUtil;
import org.apache.yetus.audience.InterfaceAudience;
import org.apache.hadoop.hbase.exceptions.DeserializationException;
-import org.apache.hadoop.hbase.shaded.protobuf.generated.FilterProtos;
-import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hbase.thirdparty.com.google.protobuf.ByteString;
-import org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException;
-import org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations;
/**
- * The filter looks for the given columns in KeyValue. Once there is a match for
- * any one of the columns, it returns ReturnCode.NEXT_ROW for remaining
- * KeyValues in the row.
- * <p>
- * Note : It may emit KVs which do not have the given columns in them, if
- * these KVs happen to occur before a KV which does have a match. Given this
- * caveat, this filter is only useful for special cases
- * like org.apache.hadoop.hbase.mapreduce.RowCounter.
- * <p>
+ * This filter was deprecated in 2.0.0 and should be removed in 3.0.0. We keep the code here
+ * to prevent the proto serialization exceptions puzzle those users who use older version clients
+ * to communicate with newer version servers.
+ *
* @deprecated Deprecated in 2.0.0 and will be removed in 3.0.0.
* @see <a href="https://issues.apache.org/jira/browse/HBASE-13347">HBASE-13347</a>
*/
@@ -50,50 +34,6 @@ import org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations;
@Deprecated
public class FirstKeyValueMatchingQualifiersFilter extends FirstKeyOnlyFilter {
- private Set<byte []> qualifiers;
-
- /**
- * Constructor which takes a set of columns. As soon as first KeyValue
- * matching any of these columns is found, filter moves to next row.
- *
- * @param qualifiers the set of columns to me matched.
- */
- public FirstKeyValueMatchingQualifiersFilter(Set<byte []> qualifiers) {
- this.qualifiers = qualifiers;
- }
-
- @Override
- public ReturnCode filterCell(final Cell c) {
- if (hasFoundKV()) {
- return ReturnCode.NEXT_ROW;
- } else if (hasOneMatchingQualifier(c)) {
- setFoundKV(true);
- }
- return ReturnCode.INCLUDE;
- }
-
- private boolean hasOneMatchingQualifier(Cell c) {
- for (byte[] q : qualifiers) {
- if (CellUtil.matchingQualifier(c, q)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * @return The filter serialized using pb
- */
- @Override
- public byte [] toByteArray() {
- FilterProtos.FirstKeyValueMatchingQualifiersFilter.Builder builder =
- FilterProtos.FirstKeyValueMatchingQualifiersFilter.newBuilder();
- for (byte[] qualifier : qualifiers) {
- if (qualifier != null) builder.addQualifiers(UnsafeByteOperations.unsafeWrap(qualifier));
- }
- return builder.build().toByteArray();
- }
-
/**
* @param pbBytes A pb serialized {@link FirstKeyValueMatchingQualifiersFilter} instance
* @return An instance of {@link FirstKeyValueMatchingQualifiersFilter} made from <code>bytes</code>
@@ -102,41 +42,7 @@ public class FirstKeyValueMatchingQualifiersFilter extends FirstKeyOnlyFilter {
*/
public static FirstKeyValueMatchingQualifiersFilter parseFrom(final byte [] pbBytes)
throws DeserializationException {
- FilterProtos.FirstKeyValueMatchingQualifiersFilter proto;
- try {
- proto = FilterProtos.FirstKeyValueMatchingQualifiersFilter.parseFrom(pbBytes);
- } catch (InvalidProtocolBufferException e) {
- throw new DeserializationException(e);
- }
-
- TreeSet<byte []> qualifiers = new TreeSet<>(Bytes.BYTES_COMPARATOR);
- for (ByteString qualifier : proto.getQualifiersList()) {
- qualifiers.add(qualifier.toByteArray());
- }
- return new FirstKeyValueMatchingQualifiersFilter(qualifiers);
- }
-
- /**
- * @param o the other filter to compare with
- * @return true if and only if the fields of the filter that are serialized
- * are equal to the corresponding fields in other. Used for testing.
- */
- @Override
- boolean areSerializedFieldsEqual(Filter o) {
- if (o == this) return true;
- if (!(o instanceof FirstKeyValueMatchingQualifiersFilter)) return false;
-
- FirstKeyValueMatchingQualifiersFilter other = (FirstKeyValueMatchingQualifiersFilter)o;
- return this.qualifiers.equals(other.qualifiers);
- }
-
- @Override
- public boolean equals(Object obj) {
- return obj instanceof Filter && areSerializedFieldsEqual((Filter) obj);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(this.qualifiers);
+ throw new DeserializationException(
+ "Stop using FirstKeyValueMatchingQualifiersFilter, which has been permanently removed");
}
}
diff --git a/hbase-protocol-shaded/src/main/protobuf/client/Filter.proto b/hbase-protocol-shaded/src/main/protobuf/client/Filter.proto
index a35047d0..b44b093 100644
--- a/hbase-protocol-shaded/src/main/protobuf/client/Filter.proto
+++ b/hbase-protocol-shaded/src/main/protobuf/client/Filter.proto
@@ -89,6 +89,8 @@ message FirstKeyOnlyFilter {
}
message FirstKeyValueMatchingQualifiersFilter {
+ //Just deprecate it to guarantee old client could communicate with server
+ option deprecated = true;
repeated bytes qualifiers = 1;
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestPartialResultsFromClientSide.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestPartialResultsFromClientSide.java
index 1b2b262..776fd2a 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestPartialResultsFromClientSide.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestPartialResultsFromClientSide.java
@@ -21,14 +21,13 @@ import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.LinkedHashSet;
import java.util.List;
-import java.util.Set;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.RegionInfo;
@@ -795,9 +794,10 @@ public class TestPartialResultsFromClientSide {
testPartialResultsWithColumnFilter(new ColumnRangeFilter(Bytes.toBytes("testQualifer1"), true,
Bytes.toBytes("testQualifier7"), true));
- Set<byte[]> qualifiers = new LinkedHashSet<>();
- qualifiers.add(Bytes.toBytes("testQualifier5"));
- testPartialResultsWithColumnFilter(new FirstKeyValueMatchingQualifiersFilter(qualifiers));
+ //Throw an Exception to the old version client to remind them not to use this filter anymore
+ assertThrows("Stop using", DoNotRetryIOException.class,
+ () -> testPartialResultsWithColumnFilter(
+ new FirstKeyValueMatchingQualifiersFilter()));
}
public void testPartialResultsWithColumnFilter(Filter filter) throws Exception {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestFilterSerialization.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestFilterSerialization.java
index ad1bb8a..9f39184 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestFilterSerialization.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestFilterSerialization.java
@@ -22,7 +22,6 @@ import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
-import java.util.TreeSet;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.HBaseClassTestRule;
import org.apache.hadoop.hbase.filter.MultiRowRangeFilter.RowRange;
@@ -132,25 +131,6 @@ public class TestFilterSerialization {
ProtobufUtil.toFilter(ProtobufUtil.toFilter(filterWrapper))));
}
- @SuppressWarnings("deprecation")
- @Test
- public void testFirstKeyValueMatchingQualifiersFilter() throws Exception {
- // empty qualifiers set
- TreeSet<byte []> set = new TreeSet<>(Bytes.BYTES_COMPARATOR);
- FirstKeyValueMatchingQualifiersFilter firstKeyValueMatchingQualifiersFilter =
- new FirstKeyValueMatchingQualifiersFilter(set);
- assertTrue(firstKeyValueMatchingQualifiersFilter.areSerializedFieldsEqual(
- ProtobufUtil.toFilter(ProtobufUtil.toFilter(firstKeyValueMatchingQualifiersFilter))));
-
- // non-empty qualifiers set
- set.add(Bytes.toBytes("col0"));
- set.add(Bytes.toBytes("col1"));
- firstKeyValueMatchingQualifiersFilter =
- new FirstKeyValueMatchingQualifiersFilter(set);
- assertTrue(firstKeyValueMatchingQualifiersFilter.areSerializedFieldsEqual(
- ProtobufUtil.toFilter(ProtobufUtil.toFilter(firstKeyValueMatchingQualifiersFilter))));
- }
-
@Test
public void testFirstKeyOnlyFilter() throws Exception {
FirstKeyOnlyFilter firstKeyOnlyFilter = new FirstKeyOnlyFilter();
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestFirstKeyValueMatchingQualifiersFilter.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestFirstKeyValueMatchingQualifiersFilter.java
deleted file mode 100644
index 95dde36..0000000
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestFirstKeyValueMatchingQualifiersFilter.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * 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.filter;
-
-import java.util.Set;
-import java.util.TreeSet;
-import junit.framework.TestCase;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
-import org.apache.hadoop.hbase.KeyValue;
-import org.apache.hadoop.hbase.testclassification.FilterTests;
-import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.ClassRule;
-import org.junit.experimental.categories.Category;
-
-@SuppressWarnings("deprecation")
-@Category({FilterTests.class, SmallTests.class})
-public class TestFirstKeyValueMatchingQualifiersFilter extends TestCase {
-
- @ClassRule
- public static final HBaseClassTestRule CLASS_RULE =
- HBaseClassTestRule.forClass(TestFirstKeyValueMatchingQualifiersFilter.class);
-
- private static final byte[] ROW = Bytes.toBytes("test");
- private static final byte[] COLUMN_FAMILY = Bytes.toBytes("test");
- private static final byte[] COLUMN_QUALIFIER_1 = Bytes.toBytes("foo");
- private static final byte[] COLUMN_QUALIFIER_2 = Bytes.toBytes("foo_2");
- private static final byte[] COLUMN_QUALIFIER_3 = Bytes.toBytes("foo_3");
- private static final byte[] VAL_1 = Bytes.toBytes("a");
-
- /**
- * Test the functionality of
- * {@link FirstKeyValueMatchingQualifiersFilter#filterCell(org.apache.hadoop.hbase.Cell)}
- *
- * @throws Exception
- */
- public void testFirstKeyMatchingQualifierFilter() throws Exception {
- Set<byte[]> quals = new TreeSet<>(Bytes.BYTES_COMPARATOR);
- quals.add(COLUMN_QUALIFIER_1);
- quals.add(COLUMN_QUALIFIER_2);
- Filter filter = new FirstKeyValueMatchingQualifiersFilter(quals);
-
- // Match in first attempt
- KeyValue cell;
- cell = new KeyValue(ROW, COLUMN_FAMILY, COLUMN_QUALIFIER_1, VAL_1);
- assertTrue("includeAndSetFlag",
- filter.filterCell(cell) == Filter.ReturnCode.INCLUDE);
- cell = new KeyValue(ROW, COLUMN_FAMILY, COLUMN_QUALIFIER_2, VAL_1);
- assertTrue("flagIsSetSkipToNextRow",
- filter.filterCell(cell) == Filter.ReturnCode.NEXT_ROW);
-
- // A mismatch in first attempt and match in second attempt.
- filter.reset();
- cell = new KeyValue(ROW, COLUMN_FAMILY, COLUMN_QUALIFIER_3, VAL_1);
- System.out.println(filter.filterCell(cell));
- assertTrue("includeFlagIsUnset",
- filter.filterCell(cell) == Filter.ReturnCode.INCLUDE);
- cell = new KeyValue(ROW, COLUMN_FAMILY, COLUMN_QUALIFIER_2, VAL_1);
- assertTrue("includeAndSetFlag",
- filter.filterCell(cell) == Filter.ReturnCode.INCLUDE);
- cell = new KeyValue(ROW, COLUMN_FAMILY, COLUMN_QUALIFIER_1, VAL_1);
- assertTrue("flagIsSetSkipToNextRow",
- filter.filterCell(cell) == Filter.ReturnCode.NEXT_ROW);
- }
-
-}