azkaban-developers

Details

diff --git a/azkaban-common/src/main/c/execute-as-user.c b/azkaban-common/src/main/c/execute-as-user.c
index 117fd88..f27d5a1 100644
--- a/azkaban-common/src/main/c/execute-as-user.c
+++ b/azkaban-common/src/main/c/execute-as-user.c
@@ -76,7 +76,7 @@ int change_user(uid_t user, gid_t group) {
 
 int main(int argc, char **argv){
 
-// set up the logging stream
+    // set up the logging stream
     if (!LOGFILE){
         LOGFILE=stdout;
     }
diff --git a/azkaban-common/src/main/java/azkaban/jobExecutor/ProcessJob.java b/azkaban-common/src/main/java/azkaban/jobExecutor/ProcessJob.java
index 5532ac1..a6e4f30 100644
--- a/azkaban-common/src/main/java/azkaban/jobExecutor/ProcessJob.java
+++ b/azkaban-common/src/main/java/azkaban/jobExecutor/ProcessJob.java
@@ -135,7 +135,7 @@ public class ProcessJob extends AbstractProcessJob {
         builder =
             new AzkabanProcessBuilder(partitionCommandLine(command))
                 .setEnv(envVars).setWorkingDir(getCwd()).setLogger(getLog())
-                .setExecuteAsUser().setExecuteAsUserBinaryPath(executeAsUserBinaryPath)
+                .enableExecuteAsUser().setExecuteAsUserBinaryPath(executeAsUserBinaryPath)
                 .setEffectiveUser(effectiveUser);
       } else {
         info("Command: " + command);
diff --git a/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcess.java b/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcess.java
index cbe6ec3..9ad88d3 100644
--- a/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcess.java
+++ b/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcess.java
@@ -40,6 +40,9 @@ import com.google.common.base.Joiner;
  * loggers.
  */
 public class AzkabanProcess {
+  
+  public static String KILL_COMMAND = "kill";
+  
   private final String workingDir;
   private final List<String> cmd;
   private final Map<String, String> env;
@@ -120,7 +123,12 @@ public class AzkabanProcess {
       errorGobbler.awaitCompletion(5000);
 
       if (exitCode != 0) {
-        throw new ProcessFailureException(exitCode, errorGobbler.getRecentLog());
+        String output =
+            new StringBuilder().append("Stdout:\n")
+                .append(outputGobbler.getRecentLog()).append("\n\n")
+                .append("Stderr:\n").append(errorGobbler.getRecentLog())
+                .append("\n").toString();
+        throw new ProcessFailureException(exitCode, output);
       }
 
     } finally {
@@ -172,11 +180,12 @@ public class AzkabanProcess {
       try {
         if (isExecuteAsUser) {
           String cmd =
-              String.format("%s %s kill %d", executeAsUserBinary,
-                  effectiveUser, processId);
+              String.format("%s %s %s %d", executeAsUserBinary,
+                  effectiveUser, KILL_COMMAND, processId);
           Runtime.getRuntime().exec(cmd);
         } else {
-          Runtime.getRuntime().exec("kill " + processId);
+          String cmd = String.format("%s %d", KILL_COMMAND, processId);
+          Runtime.getRuntime().exec(cmd);
         }
         return completeLatch.await(time, unit);
       } catch (IOException e) {
@@ -197,11 +206,12 @@ public class AzkabanProcess {
         try {
           if (isExecuteAsUser) {
             String cmd =
-                String.format("%s %s kill -9 %d", executeAsUserBinary,
-                    effectiveUser, processId);
+                String.format("%s %s %s -9 %d", executeAsUserBinary,
+                    effectiveUser, KILL_COMMAND, processId);
             Runtime.getRuntime().exec(cmd);
           } else {
-            Runtime.getRuntime().exec("kill -9 " + processId);
+            String cmd = String.format("%s -9 %d", KILL_COMMAND, processId);
+            Runtime.getRuntime().exec(cmd);
           }
         } catch (IOException e) {
           logger.error("Kill attempt failed.", e);
diff --git a/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcessBuilder.java b/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcessBuilder.java
index 91561bc..9e2c2f7 100644
--- a/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcessBuilder.java
+++ b/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcessBuilder.java
@@ -125,7 +125,7 @@ public class AzkabanProcessBuilder {
         + env + ", cwd = " + workingDir + ")";
   }
 
-  public AzkabanProcessBuilder setExecuteAsUser() {
+  public AzkabanProcessBuilder enableExecuteAsUser() {
     this.isExecuteAsUser = true;
     return this;
   }
diff --git a/azkaban-common/src/main/java/azkaban/jobtype/JobTypeManager.java b/azkaban-common/src/main/java/azkaban/jobtype/JobTypeManager.java
index ccb74c1..f1cf351 100644
--- a/azkaban-common/src/main/java/azkaban/jobtype/JobTypeManager.java
+++ b/azkaban-common/src/main/java/azkaban/jobtype/JobTypeManager.java
@@ -355,7 +355,11 @@ public class JobTypeManager {
       if (pluginLoadProps != null) {
         pluginLoadProps = PropsUtils.resolveProps(pluginLoadProps);
       } else {
+        // pluginSet.getCommonPluginLoadProps() will return null if there is no plugins directory.
+        // hence assigning default Props() if that's the case
         pluginLoadProps = pluginSet.getCommonPluginLoadProps();
+        if(pluginJobProps == null)
+          pluginJobProps = new Props();
       }
 
       job =

build.gradle 16(+16 -0)

diff --git a/build.gradle b/build.gradle
index 332e717..51e4a15 100644
--- a/build.gradle
+++ b/build.gradle
@@ -92,6 +92,22 @@ project(':azkaban-common') {
     }
   }
 
+  apply plugin: 'c'
+  model {
+    components {
+      main(NativeExecutableSpec) {
+        sources {
+          c {
+            source {
+              srcDir "src/main"
+              include "**/*.c"
+            }
+          }
+        }
+      }
+    }
+  }
+
   dependencies {
     compile('com.google.guava:guava:13.0.1')
     compile('com.h2database:h2:1.3.170')