This is an automated email from the ASF dual-hosted git repository.

chenglei pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-2 by this push:
     new c55c289  Revert "HBASE-26869 RSRpcServices.scan should deep clone 
cells when RpcCallContext is null (#4262)" (#4263)
c55c289 is described below

commit c55c289e997ce97ace66268609238af0beb94ac1
Author: chenglei <[email protected]>
AuthorDate: Wed Mar 23 17:52:11 2022 +0800

    Revert "HBASE-26869 RSRpcServices.scan should deep clone cells when 
RpcCallContext is null (#4262)" (#4263)
    
    This reverts commit d889746bc6d3cc7bebf532d3974e060c5fc2de4c.
---
 .../java/org/apache/hadoop/hbase/CellUtil.java     |  14 --
 .../apache/hadoop/hbase/regionserver/HRegion.java  |   6 +-
 .../hadoop/hbase/regionserver/RSRpcServices.java   |  24 +--
 .../hbase/regionserver/TestRegionServerScan.java   | 214 ---------------------
 4 files changed, 7 insertions(+), 251 deletions(-)

diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/CellUtil.java 
b/hbase-common/src/main/java/org/apache/hadoop/hbase/CellUtil.java
index a98df84..71f5a66 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/CellUtil.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/CellUtil.java
@@ -1764,18 +1764,4 @@ public final class CellUtil {
     if (diff != 0) return diff;
     return compareQualifiers(left, right, rqoffset, rqlength);
   }
-
-  public static void cloneIfNecessary(ArrayList<Cell> cells) {
-    if (cells == null || cells.isEmpty()) {
-      return;
-    }
-    for (int i = 0; i < cells.size(); i++) {
-      Cell cell = cells.get(i);
-      cells.set(i, cloneIfNecessary(cell));
-    }
-  }
-
-  public static Cell cloneIfNecessary(Cell cell) {
-    return (cell instanceof ByteBufferExtendedCell ? 
KeyValueUtil.copyToNewKeyValue(cell) : cell);
-  }
 }
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 a17fbc8..e0496b4 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
@@ -81,6 +81,7 @@ import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.LocatedFileStatus;
 import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hbase.ByteBufferExtendedCell;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.CellComparator;
@@ -96,6 +97,7 @@ import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HConstants.OperationStatusCode;
 import org.apache.hadoop.hbase.HDFSBlocksDistribution;
 import org.apache.hadoop.hbase.KeyValue;
+import org.apache.hadoop.hbase.KeyValueUtil;
 import org.apache.hadoop.hbase.MetaCellComparator;
 import org.apache.hadoop.hbase.NamespaceDescriptor;
 import org.apache.hadoop.hbase.NotServingRegionException;
@@ -7583,8 +7585,8 @@ public class HRegion implements HeapSize, 
PropagatingConfigurationObserver, Regi
       // This can be an EXPENSIVE call. It may make an extra copy from offheap 
to onheap buffers.
       // See more details in HBASE-26036.
       for (Cell cell : tmp) {
-        results.add(
-          CellUtil.cloneIfNecessary(cell));
+        results.add(cell instanceof ByteBufferExtendedCell ?
+            KeyValueUtil.copyToNewKeyValue(cell) : cell);
       }
     }
 
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 abbf35f..b0b6dd0 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
@@ -3340,7 +3340,7 @@ public class RSRpcServices implements 
HBaseRPCErrorHandler, AdminService.Blockin
     // This is cells inside a row. Default size is 10 so if many versions or 
many cfs,
     // then we'll resize. Resizings show in profiler. Set it higher than 10. 
For now
     // arbitrary 32. TODO: keep record of general size of results being 
returned.
-    ArrayList<Cell> values = new ArrayList<>(32);
+    List<Cell> values = new ArrayList<>(32);
     region.startRegionOperation(Operation.SCAN);
     long before = EnvironmentEdgeManager.currentTime();
     // Used to check if we've matched the row limit set on the Scan
@@ -3401,16 +3401,9 @@ public class RSRpcServices implements 
HBaseRPCErrorHandler, AdminService.Blockin
           // reset the batch progress between nextRaw invocations since we 
don't want the
           // batch progress from previous calls to affect future calls
           scannerContext.setBatchProgress(0);
-          assert values.isEmpty();
 
           // Collect values to be returned here
           moreRows = scanner.nextRaw(values, scannerContext);
-          if (context == null) {
-            // When there is no RpcCallContext,copy EC to heap, then the 
scanner would close,
-            // This can be an EXPENSIVE call. It may make an extra copy from 
offheap to onheap
-            // buffers.See more details in HBASE-26036.
-            CellUtil.cloneIfNecessary(values);
-          }
           numOfNextRawCalls++;
 
           if (!values.isEmpty()) {
@@ -3767,25 +3760,14 @@ public class RSRpcServices implements 
HBaseRPCErrorHandler, AdminService.Blockin
         if (context != null) {
           context.setCallBack(rsh.shippedCallback);
         } else {
-          // If context is null,here we call rsh.shippedCallback directly to 
reuse the logic in
-          // rsh.shippedCallback to release the internal resources in rsh,and 
lease is also added
-          // back to regionserver's LeaseManager in rsh.shippedCallback.
-          runShippedCallback(rsh);
+          // When context != null, adding back the lease will be done in 
callback set above.
+          addScannerLeaseBack(lease);
         }
       }
       quota.close();
     }
   }
 
-  private void runShippedCallback(RegionScannerHolder rsh) throws 
ServiceException {
-    assert rsh.shippedCallback != null;
-    try {
-      rsh.shippedCallback.run();
-    } catch (IOException ioe) {
-      throw new ServiceException(ioe);
-    }
-  }
-
   private void closeScanner(HRegion region, RegionScanner scanner, String 
scannerName,
       RpcCallContext context) throws IOException {
     if (region.getCoprocessorHost() != null) {
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerScan.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerScan.java
deleted file mode 100644
index 4357669..0000000
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerScan.java
+++ /dev/null
@@ -1,214 +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.regionserver;
-
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.util.Optional;
-import java.util.concurrent.atomic.AtomicReference;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
-import org.apache.hadoop.hbase.HBaseTestingUtil;
-import org.apache.hadoop.hbase.HConstants;
-import 
org.apache.hadoop.hbase.SingleProcessHBaseCluster.MiniHBaseClusterRegionServer;
-import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.client.Admin;
-import org.apache.hadoop.hbase.client.Put;
-import org.apache.hadoop.hbase.client.Result;
-import org.apache.hadoop.hbase.client.ResultScanner;
-import org.apache.hadoop.hbase.client.Scan;
-import org.apache.hadoop.hbase.client.Table;
-import org.apache.hadoop.hbase.io.ByteBuffAllocator;
-import org.apache.hadoop.hbase.io.DeallocateRewriteByteBuffAllocator;
-import org.apache.hadoop.hbase.io.hfile.BlockCacheFactory;
-import org.apache.hadoop.hbase.ipc.RpcCall;
-import org.apache.hadoop.hbase.ipc.RpcServer;
-import org.apache.hadoop.hbase.testclassification.LargeTests;
-import org.apache.hadoop.hbase.testclassification.RegionServerTests;
-import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.rules.TestName;
-
-import org.apache.hbase.thirdparty.com.google.protobuf.RpcController;
-import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;
-
-import 
org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanRequest;
-import 
org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanResponse;
-
-@Category({ RegionServerTests.class, LargeTests.class })
-public class TestRegionServerScan {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-      HBaseClassTestRule.forClass(TestRegionServerScan.class);
-
-  @Rule
-  public TestName name = new TestName();
-
-  private static final byte[] CF = Bytes.toBytes("CF");
-  private static final byte[] CQ = Bytes.toBytes("CQ");
-  private static final byte[] VALUE = new byte[1200];
-
-  private static final HBaseTestingUtil TEST_UTIL = new HBaseTestingUtil();
-  private static final Configuration conf = TEST_UTIL.getConfiguration();
-  private static Admin admin = null;
-  static final TableName tableName = TableName.valueOf("TestRegionServerScan");
-  static final byte[] r0 = Bytes.toBytes("row-0");
-  static final byte[] r1 = Bytes.toBytes("row-1");
-  static final byte[] r2 = Bytes.toBytes("row-2");
-
-  @BeforeClass
-  public static void setupBeforeClass() throws Exception {
-    /**
-     * Use {@link DeallocateRewriteByteBuffAllocator} to rewrite the 
bytebuffers right after
-     * released.
-     */
-    conf.set(ByteBuffAllocator.BYTEBUFF_ALLOCATOR_CLASS,
-      DeallocateRewriteByteBuffAllocator.class.getName());
-    conf.setBoolean(ByteBuffAllocator.ALLOCATOR_POOL_ENABLED_KEY, true);
-    conf.setInt(ByteBuffAllocator.MIN_ALLOCATE_SIZE_KEY, 0);
-    conf.setInt(BlockCacheFactory.BUCKET_CACHE_WRITER_THREADS_KEY, 20);
-    conf.setInt(ByteBuffAllocator.BUFFER_SIZE_KEY, 2048);
-    conf.set(HConstants.BUCKET_CACHE_IOENGINE_KEY, "offheap");
-    conf.setInt(HConstants.BUCKET_CACHE_SIZE_KEY, 64);
-    conf.setStrings(HConstants.REGION_SERVER_IMPL, 
MyRegionServer.class.getName());
-    conf.setInt(HConstants.HBASE_RPC_TIMEOUT_KEY, 30 * 60 * 1000);
-    conf.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 30 * 60 * 
1000);
-
-    conf.setInt(HConstants.HBASE_CLIENT_OPERATION_TIMEOUT, 60 * 60 * 1000);
-    conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 1);
-    conf.setInt(HConstants.HBASE_CLIENT_PAUSE, 10000);
-    conf.setLong(StoreScanner.STORESCANNER_PREAD_MAX_BYTES, 1024 * 1024 * 
1024);
-    TEST_UTIL.startMiniCluster(1);
-    admin = TEST_UTIL.getAdmin();
-  }
-
-  @AfterClass
-  public static void tearDownAfterClass() throws Exception {
-    TEST_UTIL.shutdownMiniCluster();
-  }
-
-  @Test
-  public void testScannWhenRpcCallContextNull() throws Exception {
-    ResultScanner resultScanner = null;
-    Table table = null;
-    try {
-      table =
-          TEST_UTIL.createTable(tableName, new byte[][] { CF }, 1, 1024, null);
-      putToTable(table, r0);
-      putToTable(table, r1);
-      putToTable(table, r2);
-
-      admin.flush(table.getName());
-
-      Scan scan = new Scan();
-      scan.setCaching(2);
-      scan.withStartRow(r0, true).withStopRow(r2, true);
-
-      MyRSRpcServices.inTest = true;
-      resultScanner = table.getScanner(scan);
-      Result result = resultScanner.next();
-      byte[] rowKey = result.getRow();
-      assertTrue(Bytes.equals(r0, rowKey));
-
-      result = resultScanner.next();
-      rowKey = result.getRow();
-      assertTrue(Bytes.equals(r1, rowKey));
-
-      result = resultScanner.next();
-      rowKey = result.getRow();
-      assertTrue(Bytes.equals(r2, rowKey));
-      assertNull(resultScanner.next());
-      assertTrue(MyRSRpcServices.exceptionRef.get() == null);
-    } finally {
-      MyRSRpcServices.inTest = false;
-      if (resultScanner != null) {
-        resultScanner.close();
-      }
-      if (table != null) {
-        table.close();
-      }
-    }
-  }
-
-  private static void putToTable(Table table, byte[] rowkey) throws 
IOException {
-    Put put = new Put(rowkey);
-    put.addColumn(CF, CQ, VALUE);
-    table.put(put);
-  }
-
-  private static class MyRegionServer extends MiniHBaseClusterRegionServer {
-    public MyRegionServer(Configuration conf) throws IOException, 
InterruptedException {
-      super(conf);
-    }
-
-    @Override
-    protected RSRpcServices createRpcServices() throws IOException {
-      return new MyRSRpcServices(this);
-    }
-  }
-
-  private static class MyRSRpcServices extends RSRpcServices {
-    private static AtomicReference<Throwable> exceptionRef = new 
AtomicReference<Throwable>(null);
-    private static volatile boolean inTest = false;
-
-    public MyRSRpcServices(HRegionServer rs) throws IOException {
-      super(rs);
-    }
-
-    @Override
-    public ScanResponse scan(RpcController controller, ScanRequest request)
-        throws ServiceException {
-      try {
-        if (!inTest) {
-          return super.scan(controller, request);
-        }
-
-        HRegion region = null;
-        if (request.hasRegion()) {
-          region = this.getRegion(request.getRegion());
-        }
-
-        if (region != null
-            && !tableName.equals(region.getTableDescriptor().getTableName())) {
-          return super.scan(controller, request);
-        }
-
-        ScanResponse result = null;
-        //Simulate RpcCallContext is null for test.
-        Optional<RpcCall> rpcCall = RpcServer.unsetCurrentCall();
-        try {
-          result = super.scan(controller, request);
-        } finally {
-          rpcCall.ifPresent(RpcServer::setCurrentCall);
-        }
-        return result;
-      } catch (Throwable e) {
-        exceptionRef.set(e);
-        throw new ServiceException(e);
-      }
-    }
-  }
-
-}

Reply via email to