You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sqoop.apache.org by ma...@apache.org on 2016/12/02 14:59:27 UTC

sqoop git commit: SQOOP-3053: Create a cmd line argument for sqoop.throwOnError and use it through SqoopOptions

Repository: sqoop
Updated Branches:
  refs/heads/trunk 916cae19f -> 0e26d92a3


SQOOP-3053: Create a cmd line argument for
sqoop.throwOnError and use it through SqoopOptions

(Boglarka Egyed via Attila Szabo)


Project: http://git-wip-us.apache.org/repos/asf/sqoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/sqoop/commit/0e26d92a
Tree: http://git-wip-us.apache.org/repos/asf/sqoop/tree/0e26d92a
Diff: http://git-wip-us.apache.org/repos/asf/sqoop/diff/0e26d92a

Branch: refs/heads/trunk
Commit: 0e26d92a34029b21a2dff7c42839714913960513
Parents: 916cae1
Author: Attila Szabo <ma...@apache.org>
Authored: Fri Dec 2 15:34:50 2016 +0100
Committer: Attila Szabo <ma...@apache.org>
Committed: Fri Dec 2 15:34:50 2016 +0100

----------------------------------------------------------------------
 src/java/com/cloudera/sqoop/Sqoop.java          |  3 -
 src/java/com/cloudera/sqoop/SqoopOptions.java   |  4 +
 src/java/org/apache/sqoop/Sqoop.java            | 24 +++++-
 src/java/org/apache/sqoop/SqoopOptions.java     | 28 +++++++
 .../org/apache/sqoop/tool/BaseSqoopTool.java    | 31 +++++++-
 src/java/org/apache/sqoop/tool/CodeGenTool.java |  8 +-
 .../apache/sqoop/tool/CreateHiveTableTool.java  |  8 +-
 src/java/org/apache/sqoop/tool/ExportTool.java  | 15 +---
 .../apache/sqoop/tool/ImportAllTablesTool.java  | 15 +---
 src/java/org/apache/sqoop/tool/ImportTool.java  | 21 ++---
 src/java/org/apache/sqoop/tool/MergeTool.java   |  8 +-
 .../com/cloudera/sqoop/TestSqoopOptions.java    | 76 +++++++++++++++++++
 .../apache/sqoop/tool/TestBaseSqoopTool.java    | 80 ++++++++++++++++++++
 13 files changed, 255 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/sqoop/blob/0e26d92a/src/java/com/cloudera/sqoop/Sqoop.java
----------------------------------------------------------------------
diff --git a/src/java/com/cloudera/sqoop/Sqoop.java b/src/java/com/cloudera/sqoop/Sqoop.java
index c3d9725..8ec9f8f 100644
--- a/src/java/com/cloudera/sqoop/Sqoop.java
+++ b/src/java/com/cloudera/sqoop/Sqoop.java
@@ -31,9 +31,6 @@ public class Sqoop
   public static final Log SQOOP_LOG =
       org.apache.sqoop.Sqoop.SQOOP_LOG;
 
-  public static final String SQOOP_RETHROW_PROPERTY =
-      org.apache.sqoop.Sqoop.SQOOP_RETHROW_PROPERTY;
-
   public static final String SQOOP_OPTIONS_FILE_SPECIFIER =
       org.apache.sqoop.Sqoop.SQOOP_OPTIONS_FILE_SPECIFIER;
 

http://git-wip-us.apache.org/repos/asf/sqoop/blob/0e26d92a/src/java/com/cloudera/sqoop/SqoopOptions.java
----------------------------------------------------------------------
diff --git a/src/java/com/cloudera/sqoop/SqoopOptions.java b/src/java/com/cloudera/sqoop/SqoopOptions.java
index f4ababe..0863ef6 100644
--- a/src/java/com/cloudera/sqoop/SqoopOptions.java
+++ b/src/java/com/cloudera/sqoop/SqoopOptions.java
@@ -93,6 +93,10 @@ public class SqoopOptions
     return org.apache.sqoop.SqoopOptions.getHiveHomeDefault();
   }
 
+  public static boolean isSqoopRethrowSystemPropertySet() {
+    return org.apache.sqoop.SqoopOptions.isSqoopRethrowSystemPropertySet();
+  }
+
   /**
    * {@inheritDoc}.
    * @deprecated

http://git-wip-us.apache.org/repos/asf/sqoop/blob/0e26d92a/src/java/org/apache/sqoop/Sqoop.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/sqoop/Sqoop.java b/src/java/org/apache/sqoop/Sqoop.java
index 93736a6..8764aff 100644
--- a/src/java/org/apache/sqoop/Sqoop.java
+++ b/src/java/org/apache/sqoop/Sqoop.java
@@ -20,6 +20,7 @@ package org.apache.sqoop;
 
 import java.util.Arrays;
 
+import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
@@ -32,6 +33,9 @@ import com.cloudera.sqoop.cli.ToolOptions;
 import com.cloudera.sqoop.tool.SqoopTool;
 import com.cloudera.sqoop.util.OptionsFileUtil;
 
+import static com.cloudera.sqoop.SqoopOptions.isSqoopRethrowSystemPropertySet;
+import static org.apache.sqoop.tool.BaseSqoopTool.THROW_ON_ERROR_ARG;
+
 /**
  * Main entry-point for Sqoop
  * Usage: hadoop jar (this_jar_name) com.cloudera.sqoop.Sqoop (options)
@@ -174,18 +178,30 @@ public class Sqoop extends Configured implements Tool {
    * GenericOptionsParser would remove them.
    */
   public static int runSqoop(Sqoop sqoop, String [] args) {
+    String[] toolArgs = sqoop.stashChildPrgmArgs(args);
     try {
-      String [] toolArgs = sqoop.stashChildPrgmArgs(args);
       return ToolRunner.run(sqoop.getConf(), sqoop, toolArgs);
     } catch (Exception e) {
       LOG.error("Got exception running Sqoop: " + e.toString());
       e.printStackTrace();
-      if (System.getProperty(SQOOP_RETHROW_PROPERTY) != null) {
-        throw new RuntimeException(e);
-      }
+      rethrowIfRequired(toolArgs, e);
       return 1;
     }
+  }
+
+  public static void rethrowIfRequired(String[] toolArgs, Exception ex) {
+    if (!isSqoopRethrowSystemPropertySet() && !ArrayUtils.contains(toolArgs, THROW_ON_ERROR_ARG)) {
+      return;
+    }
+
+    final RuntimeException exceptionToThrow;
+    if (ex instanceof RuntimeException) {
+      exceptionToThrow = (RuntimeException) ex;
+    } else {
+      exceptionToThrow = new RuntimeException(ex);
+    }
 
+    throw exceptionToThrow;
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/sqoop/blob/0e26d92a/src/java/org/apache/sqoop/SqoopOptions.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/sqoop/SqoopOptions.java b/src/java/org/apache/sqoop/SqoopOptions.java
index ef26f16..2350c7a 100644
--- a/src/java/org/apache/sqoop/SqoopOptions.java
+++ b/src/java/org/apache/sqoop/SqoopOptions.java
@@ -52,6 +52,8 @@ import com.cloudera.sqoop.tool.SqoopTool;
 import com.cloudera.sqoop.util.RandomHash;
 import com.cloudera.sqoop.util.StoredAsProperty;
 
+import static org.apache.sqoop.Sqoop.SQOOP_RETHROW_PROPERTY;
+
 /**
  * Configurable state used by Sqoop tools.
  */
@@ -112,6 +114,10 @@ public class SqoopOptions implements Cloneable {
 
   @StoredAsProperty("temporary.dirRoot") private String tempRootDir;
 
+  // If this property is set, always throw an exception during a job, do not just
+  // exit with status 1.
+  @StoredAsProperty("sqoop.throwOnError") private boolean throwOnError;
+
   @StoredAsProperty("mapreduce.job.name") private String mapreduceJobName;
 
   @StoredAsProperty("db.connect.string") private String connectString;
@@ -1028,6 +1034,11 @@ public class SqoopOptions implements Cloneable {
     //to support backward compatibility. Do not exchange it with
     //org.apache.sqoop.tool.BaseSqoopTool#TEMP_ROOTDIR_ARG
     this.tempRootDir = System.getProperty(OLD_SQOOP_TEST_IMPORT_ROOT_DIR, "_sqoop");
+
+    //This default value is set intentionally according to SQOOP_RETHROW_PROPERTY system property
+    //to support backward compatibility. Do not exchange it.
+    this.throwOnError = isSqoopRethrowSystemPropertySet();
+
     this.isValidationEnabled = false; // validation is disabled by default
     this.validatorClass = RowCountValidator.class;
     this.validationThresholdClass = AbsoluteValidationThreshold.class;
@@ -1045,6 +1056,15 @@ public class SqoopOptions implements Cloneable {
   }
 
   /**
+   * The SQOOP_RETHROW_PROPERTY system property is considered to be set if it is set to
+   * any kind of String value, i.e. it is not null.
+   */
+  // Type of SQOOP_RETHROW_PROPERTY is String only to provide backward compatibility.
+  public static boolean isSqoopRethrowSystemPropertySet() {
+    return (System.getProperty(SQOOP_RETHROW_PROPERTY) != null);
+  }
+
+  /**
    * Given a string containing a single character or an escape sequence
    * representing a char, return that char itself.
    *
@@ -1145,6 +1165,14 @@ public class SqoopOptions implements Cloneable {
     this.tempRootDir = tempRootDir;
   }
 
+  public boolean isThrowOnError() {
+    return throwOnError;
+  }
+
+  public void setThrowOnError(boolean throwOnError) {
+    this.throwOnError = throwOnError;
+  }
+
   /**
    * Get the temporary directory; guaranteed to end in File.separator
    * (e.g., '/').

http://git-wip-us.apache.org/repos/asf/sqoop/blob/0e26d92a/src/java/org/apache/sqoop/tool/BaseSqoopTool.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/sqoop/tool/BaseSqoopTool.java b/src/java/org/apache/sqoop/tool/BaseSqoopTool.java
index 3ed0f77..6082296 100644
--- a/src/java/org/apache/sqoop/tool/BaseSqoopTool.java
+++ b/src/java/org/apache/sqoop/tool/BaseSqoopTool.java
@@ -39,7 +39,6 @@ import org.apache.sqoop.util.LoggingUtils;
 import org.apache.sqoop.util.password.CredentialProviderHelper;
 
 import com.cloudera.sqoop.ConnFactory;
-import com.cloudera.sqoop.Sqoop;
 import com.cloudera.sqoop.SqoopOptions;
 import com.cloudera.sqoop.SqoopOptions.IncrementalMode;
 import com.cloudera.sqoop.SqoopOptions.InvalidOptionsException;
@@ -171,6 +170,7 @@ public abstract class BaseSqoopTool extends com.cloudera.sqoop.tool.SqoopTool {
   public static final String CALL_ARG = "call";
   public static final String SKIP_DISTCACHE_ARG = "skip-dist-cache";
   public static final String RELAXED_ISOLATION = "relaxed-isolation";
+  public static final String THROW_ON_ERROR_ARG = "throw-on-error";
 
   // Arguments for validation.
   public static final String VALIDATE_ARG = "validate";
@@ -271,14 +271,28 @@ public abstract class BaseSqoopTool extends com.cloudera.sqoop.tool.SqoopTool {
     } catch (Exception e) {
       LOG.error("Got error creating database manager: "
           + StringUtils.stringifyException(e));
-      if (System.getProperty(Sqoop.SQOOP_RETHROW_PROPERTY) != null) {
-        throw new RuntimeException(e);
-      }
+      rethrowIfRequired(sqoopOpts, e);
     }
 
     return false;
   }
 
+  protected void rethrowIfRequired(SqoopOptions options, Exception ex) {
+    if (!options.isThrowOnError()) {
+      return;
+    }
+
+    final RuntimeException exceptionToThrow;
+    if (ex instanceof RuntimeException) {
+      exceptionToThrow = (RuntimeException) ex;
+    } else {
+      exceptionToThrow = new RuntimeException(ex);
+    }
+
+    throw exceptionToThrow;
+  }
+
+
   /**
    * Should be called in a 'finally' block at the end of the run() method.
    */
@@ -487,6 +501,10 @@ public abstract class BaseSqoopTool extends com.cloudera.sqoop.tool.SqoopTool {
         .hasArg()
         .withArgName("isolationlevel")
         .create());
+    commonOpts.addOption(OptionBuilder
+        .withDescription("Rethrow a RuntimeException on error occurred during the job")
+        .withLongOpt(THROW_ON_ERROR_ARG)
+        .create());
     // relax isolation requirements
     commonOpts.addOption(OptionBuilder
         .withDescription("Use read-uncommitted isolation for imports")
@@ -963,6 +981,11 @@ public abstract class BaseSqoopTool extends com.cloudera.sqoop.tool.SqoopTool {
       out.setTempRootDir(in.getOptionValue(TEMP_ROOTDIR_ARG));
     }
 
+    if (in.hasOption(THROW_ON_ERROR_ARG)) {
+      LOG.debug("Throw exception on error during job is enabled.");
+      out.setThrowOnError(true);
+    }
+
     if (in.hasOption(CONNECT_STRING_ARG)) {
       out.setConnectString(in.getOptionValue(CONNECT_STRING_ARG));
     }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/0e26d92a/src/java/org/apache/sqoop/tool/CodeGenTool.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/sqoop/tool/CodeGenTool.java b/src/java/org/apache/sqoop/tool/CodeGenTool.java
index b3107a2..443cbf1 100644
--- a/src/java/org/apache/sqoop/tool/CodeGenTool.java
+++ b/src/java/org/apache/sqoop/tool/CodeGenTool.java
@@ -28,7 +28,6 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.util.StringUtils;
 
-import com.cloudera.sqoop.Sqoop;
 import com.cloudera.sqoop.SqoopOptions;
 import com.cloudera.sqoop.SqoopOptions.InvalidOptionsException;
 import com.cloudera.sqoop.cli.RelatedOptions;
@@ -140,11 +139,8 @@ public class CodeGenTool extends com.cloudera.sqoop.tool.BaseSqoopTool {
     } catch (IOException ioe) {
       LOG.error("Encountered IOException running codegen job: "
           + StringUtils.stringifyException(ioe));
-      if (System.getProperty(Sqoop.SQOOP_RETHROW_PROPERTY) != null) {
-        throw new RuntimeException(ioe);
-      } else {
-        return 1;
-      }
+      rethrowIfRequired(options, ioe);
+      return 1;
     } finally {
       destroy(options);
     }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/0e26d92a/src/java/org/apache/sqoop/tool/CreateHiveTableTool.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/sqoop/tool/CreateHiveTableTool.java b/src/java/org/apache/sqoop/tool/CreateHiveTableTool.java
index 427376d..ec35491 100644
--- a/src/java/org/apache/sqoop/tool/CreateHiveTableTool.java
+++ b/src/java/org/apache/sqoop/tool/CreateHiveTableTool.java
@@ -26,7 +26,6 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.util.StringUtils;
 
-import com.cloudera.sqoop.Sqoop;
 import com.cloudera.sqoop.SqoopOptions;
 import com.cloudera.sqoop.SqoopOptions.InvalidOptionsException;
 import com.cloudera.sqoop.cli.RelatedOptions;
@@ -60,11 +59,8 @@ public class CreateHiveTableTool extends com.cloudera.sqoop.tool.BaseSqoopTool {
     } catch (IOException ioe) {
       LOG.error("Encountered IOException running create table job: "
           + StringUtils.stringifyException(ioe));
-      if (System.getProperty(Sqoop.SQOOP_RETHROW_PROPERTY) != null) {
-        throw new RuntimeException(ioe);
-      } else {
-        return 1;
-      }
+      rethrowIfRequired(options, ioe);
+      return 1;
     } finally {
       destroy(options);
     }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/0e26d92a/src/java/org/apache/sqoop/tool/ExportTool.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/sqoop/tool/ExportTool.java b/src/java/org/apache/sqoop/tool/ExportTool.java
index 89f8590..5512fa7 100644
--- a/src/java/org/apache/sqoop/tool/ExportTool.java
+++ b/src/java/org/apache/sqoop/tool/ExportTool.java
@@ -26,7 +26,6 @@ import org.apache.commons.cli.OptionBuilder;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import com.cloudera.sqoop.Sqoop;
 import com.cloudera.sqoop.SqoopOptions;
 import com.cloudera.sqoop.SqoopOptions.InvalidOptionsException;
 import com.cloudera.sqoop.SqoopOptions.UpdateMode;
@@ -100,18 +99,12 @@ public class ExportTool extends com.cloudera.sqoop.tool.BaseSqoopTool {
       exportTable(options, options.getTableName());
     } catch (IOException ioe) {
       LOG.error("Encountered IOException running export job: ", ioe);
-      if (System.getProperty(Sqoop.SQOOP_RETHROW_PROPERTY) != null) {
-        throw new RuntimeException(ioe);
-      } else {
-        return 1;
-      }
+      rethrowIfRequired(options, ioe);
+      return 1;
     } catch (ExportException ee) {
       LOG.error("Error during export: ", ee);
-      if (System.getProperty(Sqoop.SQOOP_RETHROW_PROPERTY) != null) {
-        throw new RuntimeException(ee);
-      } else {
-        return 1;
-      }
+      rethrowIfRequired(options, ee);
+      return 1;
     } finally {
       destroy(options);
     }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/0e26d92a/src/java/org/apache/sqoop/tool/ImportAllTablesTool.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/sqoop/tool/ImportAllTablesTool.java b/src/java/org/apache/sqoop/tool/ImportAllTablesTool.java
index 0952c11..d6d9f60 100644
--- a/src/java/org/apache/sqoop/tool/ImportAllTablesTool.java
+++ b/src/java/org/apache/sqoop/tool/ImportAllTablesTool.java
@@ -28,7 +28,6 @@ import org.apache.commons.cli.OptionBuilder;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import com.cloudera.sqoop.Sqoop;
 import com.cloudera.sqoop.SqoopOptions;
 import com.cloudera.sqoop.SqoopOptions.InvalidOptionsException;
 import com.cloudera.sqoop.cli.RelatedOptions;
@@ -115,18 +114,12 @@ public class ImportAllTablesTool extends com.cloudera.sqoop.tool.ImportTool {
     } catch (IOException ioe) {
       LOG.error("Encountered IOException running import job: "
           + ioe.toString());
-      if (System.getProperty(Sqoop.SQOOP_RETHROW_PROPERTY) != null) {
-        throw new RuntimeException(ioe);
-      } else {
-        return 1;
-      }
+      rethrowIfRequired(options, ioe);
+      return 1;
     } catch (ImportException ie) {
       LOG.error("Error during import: " + ie.toString());
-      if (System.getProperty(Sqoop.SQOOP_RETHROW_PROPERTY) != null) {
-        throw new RuntimeException(ie);
-      } else {
-        return 1;
-      }
+      rethrowIfRequired(options, ie);
+      return 1;
     } finally {
       destroy(options);
     }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/0e26d92a/src/java/org/apache/sqoop/tool/ImportTool.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/sqoop/tool/ImportTool.java b/src/java/org/apache/sqoop/tool/ImportTool.java
index d3f8b93..ed951ea 100644
--- a/src/java/org/apache/sqoop/tool/ImportTool.java
+++ b/src/java/org/apache/sqoop/tool/ImportTool.java
@@ -41,7 +41,6 @@ import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.util.StringUtils;
 
-import com.cloudera.sqoop.Sqoop;
 import com.cloudera.sqoop.SqoopOptions;
 import com.cloudera.sqoop.SqoopOptions.InvalidOptionsException;
 import com.cloudera.sqoop.cli.RelatedOptions;
@@ -618,25 +617,17 @@ public class ImportTool extends com.cloudera.sqoop.tool.BaseSqoopTool {
       importTable(options, options.getTableName(), hiveImport);
     } catch (IllegalArgumentException iea) {
         LOG.error("Imported Failed: " + iea.getMessage());
-        if (System.getProperty(Sqoop.SQOOP_RETHROW_PROPERTY) != null) {
-          throw iea;
-        }
-        return 1;
+      rethrowIfRequired(options, iea);
+      return 1;
     } catch (IOException ioe) {
       LOG.error("Encountered IOException running import job: "
           + StringUtils.stringifyException(ioe));
-      if (System.getProperty(Sqoop.SQOOP_RETHROW_PROPERTY) != null) {
-        throw new RuntimeException(ioe);
-      } else {
-        return 1;
-      }
+      rethrowIfRequired(options, ioe);
+      return 1;
     } catch (ImportException ie) {
       LOG.error("Error during import: " + ie.toString());
-      if (System.getProperty(Sqoop.SQOOP_RETHROW_PROPERTY) != null) {
-        throw new RuntimeException(ie);
-      } else {
-        return 1;
-      }
+      rethrowIfRequired(options, ie);
+      return 1;
     } finally {
       destroy(options);
     }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/0e26d92a/src/java/org/apache/sqoop/tool/MergeTool.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/sqoop/tool/MergeTool.java b/src/java/org/apache/sqoop/tool/MergeTool.java
index 09589d8..a710740 100644
--- a/src/java/org/apache/sqoop/tool/MergeTool.java
+++ b/src/java/org/apache/sqoop/tool/MergeTool.java
@@ -25,7 +25,6 @@ import org.apache.commons.cli.OptionBuilder;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.util.StringUtils;
-import com.cloudera.sqoop.Sqoop;
 import com.cloudera.sqoop.SqoopOptions;
 import com.cloudera.sqoop.SqoopOptions.InvalidOptionsException;
 import com.cloudera.sqoop.cli.RelatedOptions;
@@ -61,11 +60,8 @@ public class MergeTool extends com.cloudera.sqoop.tool.BaseSqoopTool {
     } catch (IOException ioe) {
       LOG.error("Encountered IOException running import job: "
           + StringUtils.stringifyException(ioe));
-      if (System.getProperty(Sqoop.SQOOP_RETHROW_PROPERTY) != null) {
-        throw new RuntimeException(ioe);
-      } else {
-        return 1;
-      }
+      rethrowIfRequired(options, ioe);
+      return 1;
     }
 
     return 0;

http://git-wip-us.apache.org/repos/asf/sqoop/blob/0e26d92a/src/test/com/cloudera/sqoop/TestSqoopOptions.java
----------------------------------------------------------------------
diff --git a/src/test/com/cloudera/sqoop/TestSqoopOptions.java b/src/test/com/cloudera/sqoop/TestSqoopOptions.java
index f9d1d54..d5d09b6 100644
--- a/src/test/com/cloudera/sqoop/TestSqoopOptions.java
+++ b/src/test/com/cloudera/sqoop/TestSqoopOptions.java
@@ -27,12 +27,29 @@ import org.apache.commons.lang.ArrayUtils;
 import com.cloudera.sqoop.lib.DelimiterSet;
 import com.cloudera.sqoop.tool.ImportTool;
 import com.cloudera.sqoop.testutil.HsqldbTestServer;
+import org.junit.Before;
+import org.junit.After;
+import org.junit.Test;
+
+import static org.apache.sqoop.Sqoop.SQOOP_RETHROW_PROPERTY;
 
 /**
  * Test aspects of the SqoopOptions class.
  */
 public class TestSqoopOptions extends TestCase {
 
+  private Properties originalSystemProperties;
+
+  @Before
+  public void setup() {
+   originalSystemProperties = System.getProperties();
+  }
+
+  @After
+  public void tearDown() {
+    System.setProperties(originalSystemProperties);
+  }
+
   // tests for the toChar() parser
   public void testNormalChar() throws Exception {
     assertEquals('a', SqoopOptions.toChar("a"));
@@ -426,6 +443,64 @@ public class TestSqoopOptions extends TestCase {
     assertEquals("_sqoop", opts.getTempRootDir());
   }
 
+  @Test
+  public void testDefaultThrowOnErrorWithNotSetSystemProperty() {
+    System.clearProperty(SQOOP_RETHROW_PROPERTY);
+    SqoopOptions opts = new SqoopOptions();
+    assertFalse(opts.isThrowOnError());
+  }
+
+  @Test
+  public void testDefaultThrowOnErrorWithSetSystemProperty() {
+    String testSqoopRethrowProperty = "";
+    System.setProperty(SQOOP_RETHROW_PROPERTY, testSqoopRethrowProperty);
+    SqoopOptions opts = new SqoopOptions();
+
+    assertTrue(opts.isThrowOnError());
+  }
+
+  @Test
+  public void testDefaultLoadedThrowOnErrorWithNotSetSystemProperty() {
+    System.clearProperty(SQOOP_RETHROW_PROPERTY);
+    SqoopOptions out = new SqoopOptions();
+    Properties props = out.writeProperties();
+    SqoopOptions opts = new SqoopOptions();
+    opts.loadProperties(props);
+
+    assertFalse(opts.isThrowOnError());
+  }
+
+  @Test
+  public void testDefaultLoadedThrowOnErrorWithSetSystemProperty() {
+    String testSqoopRethrowProperty = "";
+    System.setProperty(SQOOP_RETHROW_PROPERTY, testSqoopRethrowProperty);
+    SqoopOptions out = new SqoopOptions();
+    Properties props = out.writeProperties();
+    SqoopOptions opts = new SqoopOptions();
+    opts.loadProperties(props);
+
+    assertTrue(opts.isThrowOnError());
+  }
+
+  @Test
+  public void testThrowOnErrorWithNotSetSystemProperty() throws Exception {
+    System.clearProperty(SQOOP_RETHROW_PROPERTY);
+    String[] args = {"--throw-on-error"};
+    SqoopOptions opts = parse(args);
+
+    assertTrue(opts.isThrowOnError());
+  }
+
+  @Test
+  public void testThrowOnErrorWithSetSystemProperty() throws Exception {
+    String testSqoopRethrowProperty = "";
+    System.setProperty(SQOOP_RETHROW_PROPERTY, testSqoopRethrowProperty);
+    String[] args = {"--throw-on-error"};
+    SqoopOptions opts = parse(args);
+
+    assertTrue(opts.isThrowOnError());
+  }
+
   // test that hadoop-home is accepted as an option
   public void testHadoopHome() throws Exception {
     String [] args = {
@@ -556,4 +631,5 @@ public class TestSqoopOptions extends TestCase {
       // Expected
     }
   }
+
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/0e26d92a/src/test/org/apache/sqoop/tool/TestBaseSqoopTool.java
----------------------------------------------------------------------
diff --git a/src/test/org/apache/sqoop/tool/TestBaseSqoopTool.java b/src/test/org/apache/sqoop/tool/TestBaseSqoopTool.java
new file mode 100644
index 0000000..fbbffe9
--- /dev/null
+++ b/src/test/org/apache/sqoop/tool/TestBaseSqoopTool.java
@@ -0,0 +1,80 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.sqoop.tool;
+
+import com.cloudera.sqoop.SqoopOptions;
+import junit.framework.JUnit4TestAdapter;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.Mockito;
+
+import static org.hamcrest.CoreMatchers.sameInstance;
+import static org.mockito.Mockito.mock;
+
+@RunWith(JUnit4.class)
+public class TestBaseSqoopTool {
+
+  @Rule
+  public ExpectedException exception = ExpectedException.none();
+
+  private BaseSqoopTool testBaseSqoopTool;
+  private SqoopOptions testSqoopOptions;
+
+  @Before
+  public void setup() {
+    testBaseSqoopTool = mock(BaseSqoopTool.class, Mockito.CALLS_REAL_METHODS);
+    testSqoopOptions = new SqoopOptions();
+  }
+
+  @Test
+  public void testRethrowIfRequiredWithoutRethrowPropertySetOrThrowOnErrorOption() {
+    testSqoopOptions.setThrowOnError(false);
+
+    testBaseSqoopTool.rethrowIfRequired(testSqoopOptions, new Exception());
+  }
+
+  @Test
+  public void testRethrowIfRequiredWithRethrowPropertySetAndRuntimeException() {
+    RuntimeException expectedException = new RuntimeException();
+    testSqoopOptions.setThrowOnError(true);
+
+
+    exception.expect(sameInstance(expectedException));
+    testBaseSqoopTool.rethrowIfRequired(testSqoopOptions, expectedException);
+  }
+
+  @Test
+  public void testRethrowIfRequiredWithRethrowPropertySetAndException() {
+    Exception expectedCauseException = new Exception();
+    testSqoopOptions.setThrowOnError(true);
+
+    exception.expect(RuntimeException.class);
+    exception.expectCause(sameInstance(expectedCauseException));
+    testBaseSqoopTool.rethrowIfRequired(testSqoopOptions, expectedCauseException);
+  }
+
+  public static junit.framework.Test suite() {
+    return new JUnit4TestAdapter(TestBaseSqoopTool.class);
+  }
+
+}