diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 65376479f21..7711888d8f3 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -396,6 +396,8 @@ Release 2.4.0 - UNRELEASED HADOOP-10328. loadGenerator exit code is not reliable. (Haohui Mai via cnauroth) + HADOOP-10355. Fix TestLoadGenerator#testLoadGenerator. (Haohui Mai via jing9) + Release 2.3.1 - UNRELEASED INCOMPATIBLE CHANGES diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/loadGenerator/LoadGenerator.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/loadGenerator/LoadGenerator.java index fcdcc1d9bfe..994b9b2506d 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/loadGenerator/LoadGenerator.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/loadGenerator/LoadGenerator.java @@ -45,6 +45,8 @@ import org.apache.hadoop.util.Time; import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; +import com.google.common.base.Preconditions; + /** The load generator is a tool for testing NameNode behavior under * different client loads. * It allows the user to generate different mixes of read, write, @@ -488,7 +490,35 @@ public class LoadGenerator extends Configured implements Tool { return initFileDirTables(); } - + + private static void parseScriptLine(String line, ArrayList duration, + ArrayList readProb, ArrayList writeProb) { + String[] a = line.split("\\s"); + + if (a.length != 3) { + throw new IllegalArgumentException("Incorrect number of parameters: " + + line); + } + + try { + long d = Long.parseLong(a[0]); + double r = Double.parseDouble(a[1]); + double w = Double.parseDouble(a[2]); + + Preconditions.checkArgument(d >= 0, "Invalid duration: " + d); + Preconditions.checkArgument(0 <= r && r <= 1.0, + "The read probability must be [0, 1]: " + r); + Preconditions.checkArgument(0 <= w && w <= 1.0, + "The read probability must be [0, 1]: " + w); + + readProb.add(r); + duration.add(d); + writeProb.add(w); + } catch (NumberFormatException nfe) { + throw new IllegalArgumentException("Cannot parse: " + line); + } + } + /** * Read a script file of the form: lines of text with duration in seconds, * read probability and write probability, separated by white space. @@ -508,47 +538,19 @@ public class LoadGenerator extends Configured implements Tool { String line; // Read script, parse values, build array of duration, read and write probs - while ((line = br.readLine()) != null) { - lineNum++; - if (line.startsWith("#") || line.isEmpty()) // skip comments and blanks - continue; + try { + while ((line = br.readLine()) != null) { + lineNum++; + if (line.startsWith("#") || line.isEmpty()) // skip comments and blanks + continue; - String[] a = line.split("\\s"); - if (a.length != 3) { - System.err.println("Line " + lineNum - + ": Incorrect number of parameters: " + line); - } - - try { - long d = Long.parseLong(a[0]); - if (d < 0) { - System.err.println("Line " + lineNum + ": Invalid duration: " + d); - return -1; - } - - double r = Double.parseDouble(a[1]); - if (r < 0.0 || r > 1.0) { - System.err.println("Line " + lineNum - + ": The read probability must be [0, 1]: " + r); - return -1; - } - - double w = Double.parseDouble(a[2]); - if (w < 0.0 || w > 1.0) { - System.err.println("Line " + lineNum - + ": The read probability must be [0, 1]: " + r); - return -1; - } - - readProb.add(r); - duration.add(d); - writeProb.add(w); - } catch (NumberFormatException nfe) { - System.err.println(lineNum + ": Can't parse: " + line); - return -1; - } finally { - IOUtils.cleanup(LOG, br); + parseScriptLine(line, duration, readProb, writeProb); } + } catch (IllegalArgumentException e) { + System.err.println("Line: " + lineNum + ", " + e.getMessage()); + return -1; + } finally { + IOUtils.cleanup(LOG, br); } // Copy vectors to arrays of values, to avoid autoboxing overhead later