From 719f15312210fdd43bc50f1a953e48685691c3c0 Mon Sep 17 00:00:00 2001 From: wenbang <815204947@qq.com> Date: Mon, 25 May 2020 09:58:01 +0800 Subject: [PATCH] HBASE-24401 Cell size limit check on append should consider 0 or less value to disable the check (#1742) Signed-off-by: Guanghao Zhang --- .../hadoop/hbase/regionserver/HRegion.java | 12 +++++----- .../hbase/regionserver/RSRpcServices.java | 4 +--- .../hbase/client/TestFromClientSide5.java | 24 ++++++++++++++++++- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 2c50495fdb16..e5a9b377f792 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -8219,14 +8219,14 @@ private List reckonDeltasByStore(HStore store, Operation op, Mutation muta break; default: throw new UnsupportedOperationException(op.toString()); } - int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell); - if (newCellSize > this.maxCellSize) { - String msg = "Cell with size " + newCellSize + " exceeds limit of " + this.maxCellSize - + " bytes in region " + this; - if (LOG.isDebugEnabled()) { + if (this.maxCellSize > 0) { + int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell); + if (newCellSize > this.maxCellSize) { + String msg = "Cell with size " + newCellSize + " exceeds limit of " + this.maxCellSize + + " bytes in region " + this; LOG.debug(msg); + throw new DoNotRetryIOException(msg); } - throw new DoNotRetryIOException(msg); } cellPairs.add(new Pair<>(currentValue, newCell)); // Add to results to get returned to the Client. If null, cilent does not want results. diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java index 4119e4f80585..8f57a3725ce6 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java @@ -973,9 +973,7 @@ private void checkCellSizeLimit(final HRegion r, final Mutation m) throws IOExce int size = PrivateCellUtil.estimatedSerializedSizeOf(cells.current()); if (size > r.maxCellSize) { String msg = "Cell with size " + size + " exceeds limit of " + r.maxCellSize + " bytes"; - if (LOG.isDebugEnabled()) { - LOG.debug(msg); - } + LOG.debug(msg); throw new DoNotRetryIOException(msg); } } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide5.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide5.java index cff49596685d..0ae15cab5472 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide5.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide5.java @@ -2235,7 +2235,7 @@ public void testFilterAllRecords() throws IOException { @Test public void testCellSizeLimit() throws IOException { - final TableName tableName = TableName.valueOf("testCellSizeLimit"); + final TableName tableName = name.getTableName(); TableDescriptorBuilder.ModifyableTableDescriptor tableDescriptor = new TableDescriptorBuilder.ModifyableTableDescriptor(tableName) .setValue(HRegion.HBASE_MAX_CELL_SIZE_KEY, Integer.toString(10 * 1024)); @@ -2272,6 +2272,28 @@ public void testCellSizeLimit() throws IOException { } } + @Test + public void testCellSizeNoLimit() throws IOException { + final TableName tableName = name.getTableName(); + ColumnFamilyDescriptor familyDescriptor = + new ColumnFamilyDescriptorBuilder.ModifyableColumnFamilyDescriptor(FAMILY); + TableDescriptorBuilder.ModifyableTableDescriptor tableDescriptor = + new TableDescriptorBuilder.ModifyableTableDescriptor(tableName) + .setValue(HRegion.HBASE_MAX_CELL_SIZE_KEY, Integer.toString(0)); + tableDescriptor.setColumnFamily(familyDescriptor); + + try (Admin admin = TEST_UTIL.getAdmin()) { + admin.createTable(tableDescriptor); + } + + // Will succeed + try (Table ht = TEST_UTIL.getConnection().getTable(tableName)) { + ht.put(new Put(ROW).addColumn(FAMILY, QUALIFIER, new byte[HRegion.DEFAULT_MAX_CELL_SIZE - + 1024])); + ht.append(new Append(ROW).addColumn(FAMILY, QUALIFIER, new byte[1024 + 1])); + } + } + @Test public void testDeleteSpecifiedVersionOfSpecifiedColumn() throws Exception { final TableName tableName = name.getTableName();