This is an automated email from the ASF dual-hosted git repository.

jackie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new 330f37f  Fix the NPE when no segment exists in RealtimeSegmentSelector 
(#5138)
330f37f is described below

commit 330f37f4024c5c7ab20f7fdd729bb029f511ad4f
Author: Xiaotian (Jackie) Jiang <[email protected]>
AuthorDate: Tue Mar 10 21:18:23 2020 -0700

    Fix the NPE when no segment exists in RealtimeSegmentSelector (#5138)
    
    1. When no HLC or LLC segment exists, return empty list
    2. Fix the external view version in RoutingManager for non-existing 
external view
---
 .../org/apache/pinot/broker/routing/RoutingManager.java   | 15 +++++++++++++--
 .../routing/segmentselector/RealtimeSegmentSelector.java  |  3 +++
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git 
a/pinot-broker/src/main/java/org/apache/pinot/broker/routing/RoutingManager.java
 
b/pinot-broker/src/main/java/org/apache/pinot/broker/routing/RoutingManager.java
index 8b87872..6d2eebc 100644
--- 
a/pinot-broker/src/main/java/org/apache/pinot/broker/routing/RoutingManager.java
+++ 
b/pinot-broker/src/main/java/org/apache/pinot/broker/routing/RoutingManager.java
@@ -20,6 +20,7 @@ package org.apache.pinot.broker.routing;
 
 import com.google.common.base.Preconditions;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -289,13 +290,21 @@ public class RoutingManager implements 
ClusterChangeHandler {
 
     TableConfig tableConfig = 
ZKMetadataProvider.getTableConfig(_propertyStore, tableNameWithType);
     Preconditions.checkState(tableConfig != null, "Failed to find table config 
for table: {}", tableNameWithType);
-    // NOTE: External view might be null for new created tables. In such case, 
create an empty one.
+
     ExternalView externalView = getExternalView(tableNameWithType);
+    int externalViewVersion;
+    // NOTE: External view might be null for new created tables. In such case, 
create an empty one and set the version
+    // to -1 to ensure the version does not match the next external view
     if (externalView == null) {
       externalView = new ExternalView(tableNameWithType);
+      externalViewVersion = -1;
+    } else {
+      externalViewVersion = externalView.getRecord().getVersion();
     }
+
     Set<String> onlineSegments = getOnlineSegments(tableNameWithType);
     Preconditions.checkState(onlineSegments != null, "Failed to find ideal 
state for table: {}", tableNameWithType);
+
     Set<String> enabledInstances = _enabledServerInstanceMap.keySet();
 
     SegmentSelector segmentSelector = 
SegmentSelectorFactory.getSegmentSelector(tableConfig);
@@ -306,7 +315,6 @@ public class RoutingManager implements ClusterChangeHandler 
{
     }
     InstanceSelector instanceSelector = 
InstanceSelectorFactory.getInstanceSelector(tableConfig, _brokerMetrics);
     instanceSelector.init(enabledInstances, externalView, onlineSegments);
-    int externalViewVersion = externalView.getRecord().getVersion();
 
     // Add time boundary manager if both offline and real-time part exist for 
a hybrid table
     TimeBoundaryManager timeBoundaryManager = null;
@@ -511,6 +519,9 @@ public class RoutingManager implements ClusterChangeHandler 
{
 
     Map<String, String> calculateSegmentToInstanceMap(BrokerRequest 
brokerRequest) {
       List<String> selectedSegments = _segmentSelector.select(brokerRequest);
+      if (selectedSegments.isEmpty()) {
+        return Collections.emptyMap();
+      }
       for (SegmentPruner segmentPruner : _segmentPruners) {
         selectedSegments = segmentPruner.prune(brokerRequest, 
selectedSegments);
       }
diff --git 
a/pinot-broker/src/main/java/org/apache/pinot/broker/routing/segmentselector/RealtimeSegmentSelector.java
 
b/pinot-broker/src/main/java/org/apache/pinot/broker/routing/segmentselector/RealtimeSegmentSelector.java
index cd95279..b89961a 100644
--- 
a/pinot-broker/src/main/java/org/apache/pinot/broker/routing/segmentselector/RealtimeSegmentSelector.java
+++ 
b/pinot-broker/src/main/java/org/apache/pinot/broker/routing/segmentselector/RealtimeSegmentSelector.java
@@ -136,6 +136,9 @@ public class RealtimeSegmentSelector implements 
SegmentSelector {
 
   @Override
   public List<String> select(BrokerRequest brokerRequest) {
+    if (_hlcSegments == null && _llcSegments == null) {
+      return Collections.emptyList();
+    }
     if (_hlcSegments == null) {
       return selectLLCSegments();
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to