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)