[ 
https://issues.apache.org/jira/browse/HBASE-28301?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17805095#comment-17805095
 ] 

Nihal Jain commented on HBASE-28301:
------------------------------------

*Root Cause Analysis*
{{IntegrationTestImportTsv}} creates an anonymous subclass of {{Scan}} and 
initializes it with a block of code that sets few properties. See 
{{IntegrationTestImportTsv.java}}:148
{code:java}
 Scan scan = new Scan() {
      {
        setCacheBlocks(false);
        setCaching(1000);
      }
    };
{code}
This is a valid way to instantiate and initialize an object in Java. However, 
it's important to note that when we create an anonymous subclass like this, the 
{{getClass()} method will return the Class object representing the anonymous 
subclass, not the {{Scan}} class. This is why 
{{ReflectionUtils.newInstance(scan.getClass(), scan)}} is failing as it is 
trying to instantiate the anonymous subclass, not the Scan class, and the 
anonymous subclass doesn't have a suitable constructor. See 
{{RawAsyncTableImpl.java}}:628
{code:java}
  @Override
  public AsyncTableResultScanner getScanner(Scan scan) {
    final long maxCacheSize = resultSize2CacheSize(
      scan.getMaxResultSize() > 0 ? scan.getMaxResultSize() : 
defaultScannerMaxResultSize);
   // BELOW LINE FAILS
    final Scan scanCopy = ReflectionUtils.newInstance(scan.getClass(), scan);
    final AsyncTableResultScanner scanner =
      new AsyncTableResultScanner(tableName, scanCopy, maxCacheSize);
    scan(scan, scanner);
    return scanner;
  }
{code}
*Solution:*
Directly create {{Scan}} object using copy constructor as below:
{code:java}
    Scan scan = new Scan();
    scan.setCacheBlocks(false);
    scan.setCaching(1000);
{code}

> IntegrationTestImportTsv fails with UnsupportedOperationException
> -----------------------------------------------------------------
>
>                 Key: HBASE-28301
>                 URL: https://issues.apache.org/jira/browse/HBASE-28301
>             Project: HBase
>          Issue Type: Bug
>            Reporter: Nihal Jain
>            Assignee: Nihal Jain
>            Priority: Minor
>
> IntegrationTestImportTsv fails with UnsupportedOperationException
> {code:java}
> [INFO] -------------------------------------------------------
> [INFO]  T E S T S
> [INFO] -------------------------------------------------------
> [INFO] Running org.apache.hadoop.hbase.mapreduce.IntegrationTestImportTsv
> [ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 
> 337.526 s <<< FAILURE! - in 
> org.apache.hadoop.hbase.mapreduce.IntegrationTestImportTsv
> [ERROR] 
> org.apache.hadoop.hbase.mapreduce.IntegrationTestImportTsv.testGenerateAndLoad
>   Time elapsed: 279.783 s  <<< ERROR!
> java.lang.UnsupportedOperationException: Unable to find suitable constructor 
> for class org.apache.hadoop.hbase.mapreduce.IntegrationTestImportTsv$2
>         at 
> org.apache.hadoop.hbase.util.ReflectionUtils.findConstructor(ReflectionUtils.java:133)
>         at 
> org.apache.hadoop.hbase.util.ReflectionUtils.newInstance(ReflectionUtils.java:98)
>         at 
> org.apache.hadoop.hbase.client.RawAsyncTableImpl.getScanner(RawAsyncTableImpl.java:628)
>         at 
> org.apache.hadoop.hbase.client.RawAsyncTableImpl.getScanner(RawAsyncTableImpl.java:90)
>         at 
> org.apache.hadoop.hbase.client.TableOverAsyncTable.getScanner(TableOverAsyncTable.java:198)
>         at 
> org.apache.hadoop.hbase.mapreduce.IntegrationTestImportTsv.doLoadIncrementalHFiles(IntegrationTestImportTsv.java:156)
>         at 
> org.apache.hadoop.hbase.mapreduce.IntegrationTestImportTsv.generateAndLoad(IntegrationTestImportTsv.java:206)
>         at 
> org.apache.hadoop.hbase.mapreduce.IntegrationTestImportTsv.testGenerateAndLoad(IntegrationTestImportTsv.java:187)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>         at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>         at java.lang.reflect.Method.invoke(Method.java:498)
>         at 
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
>         at 
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
>         at 
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
>         at 
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
>         at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:61)
>         at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
>         at 
> org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
>         at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
>         at 
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
>         at 
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
>         at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
>         at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
>         at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
>         at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
>         at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
>         at 
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
>         at 
> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
>         at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
>         at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
>         at 
> org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:316)
>         at 
> org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:240)
>         at 
> org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:214)
>         at 
> org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:155)
>         at 
> org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
>         at 
> org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
>         at 
> org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
>         at 
> org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
> [INFO] 
> [INFO] Results:
> [INFO] 
> [ERROR] Errors: 
> [ERROR]   
> IntegrationTestImportTsv.testGenerateAndLoad:187->generateAndLoad:206->doLoadIncrementalHFiles:156
>  ยป UnsupportedOperation Unable to find suitable constructor for class 
> org.apache.hadoop.hbase.mapreduce.IntegrationTestImportTsv$2
> {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to