This is an automated email from the ASF dual-hosted git repository.
michaelsmith pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/impala.git
The following commit(s) were added to refs/heads/master by this push:
new d31209176 IMPALA-14670: Fix NullPointerException in
getEventProcessorSummary
d31209176 is described below
commit d312091768f122e014d2292c25c1b26c2ba472d2
Author: Venu Reddy <[email protected]>
AuthorDate: Wed Jan 14 10:19:21 2026 +0530
IMPALA-14670: Fix NullPointerException in getEventProcessorSummary
TEventBatchProgressInfo fields are populated from
MetastoreEventsProcessor state that may be updated concurrently during
event processing. To avoid inconsistent reads, the method is expected
to snapshot all required fields into local variables before using them.
However, currentFilteredEvent_ was accessed directly after a null
check, allowing it to become null concurrently and causing a
NullPointerException while populating the progress.
This change snapshots currentFilteredEvent_ into a local variable and
uses the local reference consistently, preventing the race condition.
Testing:
- Ran existing tests.
Change-Id: I3c9101811cd706e0eba487595852db3435232cf5
Reviewed-on: http://gerrit.cloudera.org:8080/23870
Reviewed-by: Quanlong Huang <[email protected]>
Tested-by: Impala Public Jenkins <[email protected]>
---
.../impala/catalog/events/MetastoreEventsProcessor.java | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git
a/fe/src/main/java/org/apache/impala/catalog/events/MetastoreEventsProcessor.java
b/fe/src/main/java/org/apache/impala/catalog/events/MetastoreEventsProcessor.java
index 8807d9e82..68ec104e3 100644
---
a/fe/src/main/java/org/apache/impala/catalog/events/MetastoreEventsProcessor.java
+++
b/fe/src/main/java/org/apache/impala/catalog/events/MetastoreEventsProcessor.java
@@ -1564,7 +1564,11 @@ public class MetastoreEventsProcessor implements
ExternalEventsProcessor {
// It's best effort to make the members in 'progressInfo' consistent but
we can't
// guarantee it.
List<NotificationEvent> eventBatch = currentEventBatch_;
+ long batchStartTimeMs = currentBatchStartTimeMs_;
List<MetastoreEvent> filteredEvents = currentFilteredEvents_;
+ MetastoreEvent filteredEvent = currentFilteredEvent_;
+ long eventStartTimeMs = currentEventStartTimeMs_;
+ int eventIndex = currentEventIndex_;
if (eventBatch != null && !eventBatch.isEmpty()) {
int numHmsEvents = eventBatch.size();
progressInfo.num_hms_events = numHmsEvents;
@@ -1573,15 +1577,14 @@ public class MetastoreEventsProcessor implements
ExternalEventsProcessor {
NotificationEvent lastEvent = eventBatch.get(numHmsEvents - 1);
progressInfo.max_event_id = lastEvent.getEventId();
progressInfo.max_event_time_s = lastEvent.getEventTime();
- progressInfo.current_batch_start_time_ms = currentBatchStartTimeMs_;
- progressInfo.current_event_start_time_ms = currentEventStartTimeMs_;
- if (filteredEvents != null) {
+ progressInfo.current_batch_start_time_ms = batchStartTimeMs;
+ if (filteredEvents != null && filteredEvent != null) {
progressInfo.num_filtered_events = filteredEvents.size();
+ progressInfo.current_event_start_time_ms = eventStartTimeMs;
+ progressInfo.current_event_index = eventIndex;
+ progressInfo.current_event_batch_size =
filteredEvent.getNumberOfEvents();
+ progressInfo.current_event = filteredEvent.metastoreNotificationEvent_;
}
- progressInfo.current_event_index = currentEventIndex_;
- progressInfo.current_event_batch_size = currentFilteredEvent_ != null ?
- currentFilteredEvent_.getNumberOfEvents() : 0;
- progressInfo.current_event = currentEvent_;
}
summaryResponse.setProgress(progressInfo);
return summaryResponse;