Rushabh Shah created PHOENIX-7280:
-------------------------------------

             Summary: Test failure: 
ViewMetadataIT#testViewAndTableAndDropCascadeWithIndexes
                 Key: PHOENIX-7280
                 URL: https://issues.apache.org/jira/browse/PHOENIX-7280
             Project: Phoenix
          Issue Type: Sub-task
            Reporter: Rushabh Shah


Test failure: 
https://ci-hadoop.apache.org/job/Phoenix/job/Phoenix-PreCommit-GitHub-PR/job/PR-1778/56/testReport/junit/org.apache.phoenix.end2end/ViewMetadataIT/testViewAndTableAndDropCascadeWithIndexes/
The test is doing following:
1. Create a data table
2. Create 2 views on the data table.
3. Create 3 indexes, one on data table and 2 indexes on 2 views.
4. Drop data table with CASCADE option.
5. Run drop child views task.
6. Validate view1 and view2 doesn't exist.

The test is failing in step5 while dropping view view2.

It fails with the following error while doing getTable call on the base table.
{noformat}
2024-03-15T11:58:51,682 ERROR 
[RpcServer.Metadata.Fifo.handler=3,queue=0,port=61097] 
coprocessor.MetaDataEndpointImpl(715): getTable failed
java.lang.IllegalArgumentException: offset (0) must be < array length (0)
        at 
org.apache.hbase.thirdparty.com.google.common.base.Preconditions.checkArgument(Preconditions.java:302)
 ~[hbase-shaded-miscellaneous-4.1.5.jar:4.1.5]
        at org.apache.hadoop.hbase.TableName.valueOf(TableName.java:408) 
~[hbase-common-2.5.7-hadoop3.jar:2.5.7-hadoop3]
        at org.apache.hadoop.hbase.TableName.valueOf(TableName.java:395) 
~[hbase-common-2.5.7-hadoop3.jar:2.5.7-hadoop3]
        at 
org.apache.phoenix.coprocessor.MetaDataEndpointImpl.getTable(MetaDataEndpointImpl.java:675)
 ~[classes/:?]
        at 
org.apache.phoenix.coprocessor.generated.MetaDataProtos$MetaDataService.callMethod(MetaDataProtos.java:17524)
 ~[classes/:?]
        at 
org.apache.hadoop.hbase.regionserver.HRegion.execService(HRegion.java:7930) 
~[hbase-server-2.5.7-hadoop3.jar:2.5.7-hadoop3]
        at 
org.apache.hadoop.hbase.regionserver.RSRpcServices.execServiceOnRegion(RSRpcServices.java:2535)
 ~[hbase-server-2.5.7-hadoop3.jar:2.5.7-hadoop3]
        at 
org.apache.hadoop.hbase.regionserver.RSRpcServices.execService(RSRpcServices.java:2509)
 ~[hbase-server-2.5.7-hadoop3.jar:2.5.7-hadoop3]
        at 
org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:45014)
 ~[hbase-protocol-shaded-2.5.7-hadoop3.jar:2.5.7-hadoop3]
        at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:415) 
~[hbase-server-2.5.7-hadoop3.jar:?]
        at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:124) 
~[hbase-server-2.5.7-hadoop3.jar:?]
        at org.apache.hadoop.hbase.ipc.RpcHandler.run(RpcHandler.java:102) 
~[hbase-server-2.5.7-hadoop3.jar:?]
        at org.apache.hadoop.hbase.ipc.RpcHandler.run(RpcHandler.java:82) 
~[hbase-server-2.5.7-hadoop3.jar:?]
{noformat}

 The base table is already dropped at step#4 and MDEI will cache the Deleted 
Table Marker in its cache. See 
[here|https://github.com/apache/phoenix/blob/PHOENIX-6883-feature/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java#L2829-L2831]
 for more details.

{code}
                long currentTime = 
MetaDataUtil.getClientTimeStamp(tableMetadata);
                for (ImmutableBytesPtr ckey : invalidateList) {
                    metaDataCache.put(ckey, newDeletedTableMarker(currentTime));
                }
{code}

DeletedTableMarker is an empty PTable object. See 
[here|https://github.com/apache/phoenix/blob/PHOENIX-6883-feature/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java#L1870-L1881]
 for the definition.

{code}
    private static PTable newDeletedTableMarker(long timestamp) {
        try {
            return new PTableImpl.Builder()
                    .setType(PTableType.TABLE)
                    .setTimeStamp(timestamp)
                    .setPkColumns(Collections.<PColumn>emptyList())
                    .setAllColumns(Collections.<PColumn>emptyList())
                    .setFamilyAttributes(Collections.<PColumnFamily>emptyList())
                    .setRowKeySchema(RowKeySchema.EMPTY_SCHEMA)
                    .setIndexes(Collections.<PTable>emptyList())
                    .setPhysicalNames(Collections.<PName>emptyList())
                    .build();
        } catch (SQLException e) {
            // Should never happen
            return null;
        }
    }
{code}


Now while dropping view2, it is not able to find the view2 in its cache so it 
is trying to construct the view.
It has to scan the SYSCAT regionserver to construct the view.
It calls the method 
[getTableFromCells|https://github.com/apache/phoenix/blob/PHOENIX-6883-feature/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java#L1089]

Since this is a view, it will have LINK_TYPE = 2 in the view's header row which 
will link it to the physical table. It will go through the code 
[here|https://github.com/apache/phoenix/blob/PHOENIX-6883-feature/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java#L1488-L1502].

Since the parent table is an empty table in the cache, it will set the physical 
table name as empty string 
[here|https://github.com/apache/phoenix/blob/PHOENIX-6883-feature/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java#L1526-L1531].

Later on, the test fails 
[here|https://github.com/apache/phoenix/blob/PHOENIX-6883-feature/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java#L675]







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

Reply via email to