From 904016c4b70a52b1a98d5b115fee6651c7fd1acc Mon Sep 17 00:00:00 2001
From: Alexander Sterligov <sterligovak@joom.it>
Date: Wed, 5 Jul 2017 13:42:49 +0300
Subject: [PATCH] KYLIN-2711 avoid NPE if output is lost

---
 .../org/apache/kylin/rest/service/JobService.java  |  4 +++
 .../apache/kylin/rest/service/JobServiceTest.java  | 33 ++++++++++++++++++++++
 2 files changed, 37 insertions(+)

diff --git a/server-base/src/main/java/org/apache/kylin/rest/service/JobService.java b/server-base/src/main/java/org/apache/kylin/rest/service/JobService.java
index 6451d66..5bf684a 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/service/JobService.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/service/JobService.java
@@ -462,6 +462,10 @@ public class JobService extends BasicService implements InitializingBean {
                     public boolean apply(CubingJob executable) {
                         try {
                             Output output = allOutputs.get(executable.getId());
+                            if (output == null){
+                                return false;
+                            }
+                            
                             ExecutableState state = output.getState();
                             boolean ret = statusList.contains(state);
                             return ret;
diff --git a/server/src/test/java/org/apache/kylin/rest/service/JobServiceTest.java b/server/src/test/java/org/apache/kylin/rest/service/JobServiceTest.java
index 0932748..fce6027 100644
--- a/server/src/test/java/org/apache/kylin/rest/service/JobServiceTest.java
+++ b/server/src/test/java/org/apache/kylin/rest/service/JobServiceTest.java
@@ -19,9 +19,14 @@
 package org.apache.kylin.rest.service;
 
 import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
 
+import org.apache.kylin.engine.mr.CubingJob;
 import org.apache.kylin.job.constant.JobTimeFilterEnum;
+import org.apache.kylin.job.exception.ExecuteException;
 import org.apache.kylin.job.exception.JobException;
+import org.apache.kylin.job.execution.*;
 import org.apache.kylin.metadata.project.ProjectInstance;
 import org.junit.Assert;
 import org.junit.Test;
@@ -50,4 +55,32 @@ public class JobServiceTest extends ServiceTestBase {
         Assert.assertNull(jobService.getJobInstance("job_not_exist"));
         Assert.assertNotNull(jobService.searchJobs(null, null, null, 0, 0, JobTimeFilterEnum.ALL));
     }
+
+    @Test
+    public void testExceptionOnLostJobOutput() {
+        ExecutableManager manager = ExecutableManager.getInstance(jobService.getConfig());
+        AbstractExecutable executable = new TestJob();
+        manager.addJob(executable);
+        List<CubingJob> jobs = jobService.innerSearchCubingJobs("cube",
+                "jobName",
+                Collections.<ExecutableState>emptySet(),
+                0,
+                Long.MAX_VALUE,
+                Collections.<String, Output>emptyMap(),
+                true,
+                "project");
+        Assert.assertEquals(0, jobs.size());
+    }
+
+    public static class TestJob extends CubingJob {
+
+        public TestJob(){
+            super();
+        }
+
+        @Override
+        protected ExecuteResult doWork(ExecutableContext context) throws ExecuteException {
+            return new ExecuteResult(ExecuteResult.State.SUCCEED, "");
+        }
+    }
 }
-- 
2.7.4

