Quanlong Huang created IMPALA-12680:
---------------------------------------

             Summary: NullPointerException in addHmsPartitions() during 
MetastoreEventsProcessor switch state from PAUSED to ACTIVE
                 Key: IMPALA-12680
                 URL: https://issues.apache.org/jira/browse/IMPALA-12680
             Project: IMPALA
          Issue Type: Bug
          Components: Catalog
            Reporter: Quanlong Huang


Event processing is paused during a global INVALIDATE METADATA. 
catalog_.isEventProcessingActive() returns false in this state.
 
If an AlterTableAddPartition statement is running during that time, we could 
pass in a null value for the 'partitionToEventId' map in here:
{code:java}
      Map<String, Long> partitionToEventId = catalog_.isEventProcessingActive() 
?
          Maps.newHashMap() : null;
      List<Partition> addedHmsPartitions = 
addHmsPartitionsInTransaction(msClient,
          tbl, allHmsPartitionsToAdd, partitionToEventId, ifNotExists); {code}
 
https://github.com/apache/impala/blob/fcda98ad99c13324e3ab09f2e92d331d0304bb8e/fe/src/main/java/org/apache/impala/service/CatalogOpExecutor.java#L4404-L4407

If the global INVALIDATE METADATA finishes and event processing is back to the 
ACTIVE state before the AlterTableAddPartition statement runs into 
addHmsPartitions(), we will have an non-empty 'partitionToEventSubMap' here:
{code:java}
        List<NotificationEvent> events = 
getNextMetastoreEventsIfEnabled(eventId,
                event -> AddPartitionEvent.ADD_PARTITION_EVENT_TYPE
                    .equals(event.getEventType())
                    && msTbl.getDbName().equalsIgnoreCase(event.getDbName())
                    && 
msTbl.getTableName().equalsIgnoreCase(event.getTableName()));
        Map<Partition, Long> partitionToEventSubMap = Maps.newHashMap();
        getPartitionsFromEvent(events, partitionToEventSubMap);
        // set the eventId to last one which we received so the we fetch the 
next
        // set of events correctly
        if (!events.isEmpty()) {
          eventId = events.get(events.size() - 1).getEventId();
        }
        if (partitionToEventSubMap.isEmpty()) {
          // if partitions couldn't be fetched from events, use the one 
returned by
          // add_partitions call above.
          addedHmsPartitions.addAll(addedPartitions);
        } else {
          Preconditions.checkNotNull(partitionToEventId); // <-- This will 
fail{code}
https://github.com/apache/impala/blob/fcda98ad99c13324e3ab09f2e92d331d0304bb8e/fe/src/main/java/org/apache/impala/service/CatalogOpExecutor.java#L5052-L5069

Then the AlterTableAddPartition statement fails with NullPointerException:
{code:java}
I0104 02:46:32.075830  1010 jni-util.cc:302] 4a4eae34f60ba947:b6b2bcfc00000000] 
java.lang.NullPointerException
        at 
com.google.common.base.Preconditions.checkNotNull(Preconditions.java:889)
        at 
org.apache.impala.service.CatalogOpExecutor.addHmsPartitions(CatalogOpExecutor.java:5051)
        at 
org.apache.impala.service.CatalogOpExecutor.addHmsPartitionsInTransaction(CatalogOpExecutor.java:5082)
        at 
org.apache.impala.service.CatalogOpExecutor.alterTableAddPartitions(CatalogOpExecutor.java:4388)
        at 
org.apache.impala.service.CatalogOpExecutor.alterTable(CatalogOpExecutor.java:1136)
        at 
org.apache.impala.service.CatalogOpExecutor.execDdlRequest(CatalogOpExecutor.java:450)
        at 
org.apache.impala.service.JniCatalog.lambda$execDdl$3(JniCatalog.java:304)
        at 
org.apache.impala.service.JniCatalogOp.lambda$execAndSerialize$1(JniCatalogOp.java:90)
        at org.apache.impala.service.JniCatalogOp.execOp(JniCatalogOp.java:58)
        at 
org.apache.impala.service.JniCatalogOp.execAndSerialize(JniCatalogOp.java:89)
        at 
org.apache.impala.service.JniCatalogOp.execAndSerialize(JniCatalogOp.java:100)
        at 
org.apache.impala.service.JniCatalog.execAndSerialize(JniCatalog.java:233)
        at 
org.apache.impala.service.JniCatalog.execAndSerialize(JniCatalog.java:247)
        at 
org.apache.impala.service.JniCatalog.execDdl(JniCatalog.java:303){code}



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

Reply via email to