You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by el...@apache.org on 2014/03/11 19:25:24 UTC
[15/23] git commit: ACCUMULO-2433 Add a way to still use the exec
methods but provide a custom error message on failure.
ACCUMULO-2433 Add a way to still use the exec methods but provide a custom error message on failure.
Fix some tests that I've seen fail to provide better messages on failure to help future debugging
because I can't get them reproduced locally in any reasonable timeframe.
Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo
Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/4cc25caa
Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/4cc25caa
Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/4cc25caa
Branch: refs/heads/ACCUMULO-2061
Commit: 4cc25caa07ea5ca49e4d81f9e5a22908e45bba59
Parents: 72395e0
Author: Josh Elser <el...@apache.org>
Authored: Mon Mar 10 14:59:09 2014 -0400
Committer: Josh Elser <el...@apache.org>
Committed: Mon Mar 10 17:13:22 2014 -0400
----------------------------------------------------------------------
.../apache/accumulo/test/ShellServerTest.java | 128 ++++++++++++++-----
1 file changed, 99 insertions(+), 29 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/accumulo/blob/4cc25caa/test/src/test/java/org/apache/accumulo/test/ShellServerTest.java
----------------------------------------------------------------------
diff --git a/test/src/test/java/org/apache/accumulo/test/ShellServerTest.java b/test/src/test/java/org/apache/accumulo/test/ShellServerTest.java
index e2ebbcf..d66f509 100644
--- a/test/src/test/java/org/apache/accumulo/test/ShellServerTest.java
+++ b/test/src/test/java/org/apache/accumulo/test/ShellServerTest.java
@@ -31,6 +31,10 @@ import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -53,6 +57,7 @@ import org.apache.accumulo.minicluster.MiniAccumuloCluster;
import org.apache.accumulo.minicluster.MiniAccumuloConfig;
import org.apache.accumulo.server.trace.TraceServer;
import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
@@ -85,7 +90,19 @@ public class ShellServerTest {
}
}
+ private static abstract class ErrorMessageCallback {
+ public abstract String getErrorMessage();
+ }
+
+ private static class NoOpErrorMessageCallback extends ErrorMessageCallback {
+ private static final String empty = "";
+ public String getErrorMessage() {
+ return empty;
+ }
+ }
+
private static final Logger log = Logger.getLogger(ShellServerTest.class);
+ private static final NoOpErrorMessageCallback noop = new NoOpErrorMessageCallback();
private static String secret = "superSecret";
public static TemporaryFolder folder = new TemporaryFolder();
@@ -104,36 +121,51 @@ public class ShellServerTest {
}
String exec(String cmd, boolean expectGoodExit) throws IOException {
+ return exec(cmd, expectGoodExit, noop);
+ }
+
+ String exec(String cmd, boolean expectGoodExit, ErrorMessageCallback callback) throws IOException {
String result = exec(cmd);
if (expectGoodExit)
- assertGoodExit("", true);
+ assertGoodExit("", true, callback);
else
- assertBadExit("", true);
+ assertBadExit("", true, callback);
return result;
}
String exec(String cmd, boolean expectGoodExit, String expectString) throws IOException {
- return exec(cmd, expectGoodExit, expectString, true);
+ return exec(cmd, expectGoodExit, expectString, noop);
+ }
+
+ String exec(String cmd, boolean expectGoodExit, String expectString, ErrorMessageCallback callback) throws IOException {
+ return exec(cmd, expectGoodExit, expectString, true, callback);
}
String exec(String cmd, boolean expectGoodExit, String expectString, boolean stringPresent) throws IOException {
+ return exec(cmd, expectGoodExit, expectString, stringPresent, noop);
+ }
+
+ String exec(String cmd, boolean expectGoodExit, String expectString, boolean stringPresent, ErrorMessageCallback callback) throws IOException {
String result = exec(cmd);
if (expectGoodExit)
- assertGoodExit(expectString, stringPresent);
+ assertGoodExit(expectString, stringPresent, callback);
else
- assertBadExit(expectString, stringPresent);
+ assertBadExit(expectString, stringPresent, callback);
return result;
}
- void assertGoodExit(String s, boolean stringPresent) {
+ void assertGoodExit(String s, boolean stringPresent, ErrorMessageCallback callback) {
Shell.log.debug(output.get());
- assertEquals(0, shell.getExitCode());
+ if (0 != shell.getExitCode()) {
+ String errorMsg = callback.getErrorMessage();
+ assertEquals(0, shell.getExitCode());
+ }
if (s.length() > 0)
assertEquals(s + " present in " + output.get() + " was not " + stringPresent, stringPresent, output.get().contains(s));
}
- void assertBadExit(String s, boolean stringPresent) {
+ void assertBadExit(String s, boolean stringPresent, ErrorMessageCallback callback) {
Shell.log.debug(output.get());
assertTrue(shell.getExitCode() > 0);
if (s.length() > 0)
@@ -409,7 +441,16 @@ public class ShellServerTest {
final String table = name.getMethodName();
// addauths
exec("createtable " + table + " -evc");
- exec("insert a b c d -l foo", false, "does not have authorization", true);
+ exec("insert a b c d -l foo", false, "does not have authorization", true, new ErrorMessageCallback() {
+ public String getErrorMessage() {
+ try {
+ Connector c = new ZooKeeperInstance(cluster.getInstanceName(), cluster.getZooKeepers()).getConnector("root", new PasswordToken(secret));
+ return "Current auths for root are: " + c.securityOperations().getUserAuthorizations("root").toString();
+ } catch (Exception e) {
+ return "Could not check authorizations";
+ }
+ }
+ });
exec("addauths -s foo,bar", true);
exec("getauths", true, "foo", true);
exec("getauths", true, "bar", true);
@@ -486,10 +527,10 @@ public class ShellServerTest {
exec("flush -w");
exec("insert n 1 2 3");
exec("flush -w");
- oldCount = countFiles(tableId);
+ List<String> oldFiles = getFiles(tableId);
// at this point there are 4 files in the default tablet
- assertEquals(4, oldCount);
+ assertEquals("Files that were found: " + oldFiles, 4, oldFiles.size());
// compact some data:
exec("compact -b g -e z -w");
@@ -564,7 +605,8 @@ public class ShellServerTest {
exec("addsplits row5 row7");
make10();
exec("flush -w -t " + table);
- assertEquals(3, countFiles(tableId));
+ List<String> files = getFiles(tableId);
+ assertEquals("Found the following files: " + files, 3, files.size());
exec("deleterows -t " + table + " -b row5 -e row7", true);
assertEquals(2, countFiles(tableId));
exec("deletetable -f " + table);
@@ -767,12 +809,13 @@ public class ShellServerTest {
final String table = name.getMethodName();
exec("createtable " + table, true);
+
+ // Should be about a 3 second scan
+ for (int i = 0; i < 6; i++) {
+ exec("insert " + i + " cf cq value", true);
+ }
exec("config -t " + table + " -s table.iterator.scan.slow=30,org.apache.accumulo.test.functional.SlowIterator", true);
- exec("config -t " + table + " -s table.iterator.scan.slow.opt.sleepTime=1000", true);
- exec("insert a cf cq value", true);
- exec("insert b cf cq value", true);
- exec("insert c cf cq value", true);
- exec("insert d cf cq value", true);
+ exec("config -t " + table + " -s table.iterator.scan.slow.opt.sleepTime=500", true);
Thread thread = new Thread() {
public void run() {
try {
@@ -788,14 +831,30 @@ public class ShellServerTest {
}
};
thread.start();
- exec("sleep 0.1", true);
- String scans = exec("listscans", true);
- String lines[] = scans.split("\n");
- String last = lines[lines.length - 1];
- assertTrue(last.contains("RUNNING"));
- String parts[] = last.split("\\|");
- assertEquals(13, parts.length);
+
+ List<String> scans = new ArrayList<String>();
+ // Try to find the active scan for about 5seconds
+ for (int i = 0; i < 50 && scans.isEmpty(); i++) {
+ String currentScans = exec("listscans", true);
+ String[] lines = currentScans.split("\n");
+ for (int scanOffset = 2; i < lines.length; i++) {
+ String currentScan = lines[scanOffset];
+ if (currentScan.contains(table)) {
+ scans.add(currentScan);
+ }
+ }
+ UtilWaitThread.sleep(100);
+ }
thread.join();
+
+ assertFalse("Could not find any active scans over table " + table, scans.isEmpty());
+
+ for (String scan : scans) {
+ assertTrue("Scan does not appear to be a 'RUNNING' scan: '" + scan + "'", scan.contains("RUNNING"));
+ String parts[] = scan.split("\\|");
+ assertEquals("Expected 13 colums, but found " + parts.length + " instead for '" + Arrays.toString(parts) + "'", 13, parts.length);
+ }
+
exec("deletetable -f " + table, true);
}
@@ -873,13 +932,24 @@ public class ShellServerTest {
exec(String.format("insert row%d cf col%d value", i, i));
}
}
+
+ private List<String> getFiles(String tableId) throws IOException {
+ output.clear();
- private int countFiles(String tableId) throws IOException {
exec("scan -t !METADATA -np -c file -b " + tableId + " -e " + tableId + "~");
-
- log.debug("countFiles(): " + output.get());
-
- return output.get().split("\n").length - 1;
+
+ String[] lines = StringUtils.split(output.get(), "\n");
+ output.clear();
+
+ if (0 == lines.length) {
+ return Collections.emptyList();
+ }
+
+ return Arrays.asList(Arrays.copyOfRange(lines, 1, lines.length));
+ }
+
+ private int countFiles(String tableId) throws IOException {
+ return getFiles(tableId).size();
}
private String getTableId(String tableName) throws Exception {