From ae6b1ea89cc74c96ab29f4593d834208a52f2305 Mon Sep 17 00:00:00 2001 From: Eli Collins Date: Fri, 10 Aug 2012 03:47:12 +0000 Subject: [PATCH] HDFS-3758. TestFuseDFS test failing. Contributed by Colin Patrick McCabe git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1371556 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 2 + .../native/fuse-dfs/test/TestFuseDFS.java | 55 ++++++++++++++++--- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index b25170c2779..9befdb61f42 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -424,6 +424,8 @@ Release 2.0.1-alpha - UNRELEASED HDFS-3721. hsync support broke wire compatibility. (todd and atm) + HDFS-3758. TestFuseDFS test failing. (Colin Patrick McCabe via eli) + BREAKDOWN OF HDFS-3042 SUBTASKS HDFS-2185. HDFS portion of ZK-based FailoverController (todd) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/native/fuse-dfs/test/TestFuseDFS.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/native/fuse-dfs/test/TestFuseDFS.java index c9827da145b..dcb666fd650 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/native/fuse-dfs/test/TestFuseDFS.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/native/fuse-dfs/test/TestFuseDFS.java @@ -44,6 +44,7 @@ public class TestFuseDFS { private static MiniDFSCluster cluster; private static FileSystem fs; + private static Process fuseProcess; private static Runtime r; private static String mountPoint; @@ -137,8 +138,28 @@ private static void checkFile(File f, String expectedContents) assertEquals("File content differs", expectedContents, s); } + private static class RedirectToStdoutThread extends Thread { + private InputStream is; + + RedirectToStdoutThread(InputStream is) { + this.is = is; + } + public void run() { + try { + InputStreamReader isr = new InputStreamReader(is); + BufferedReader br = new BufferedReader(isr); + String line=null; + while ( (line = br.readLine()) != null) { + LOG.error("FUSE_LINE:" + line); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + /** Run a fuse-dfs process to mount the given DFS */ - private static void establishMount(URI uri) throws IOException { + private static Process establishMount(URI uri) throws IOException { Runtime r = Runtime.getRuntime(); String cp = System.getProperty("java.class.path"); @@ -163,6 +184,8 @@ private static void establishMount(URI uri) throws IOException { "-obig_writes", // Allow >4kb writes "-oentry_timeout=0.1", // Don't cache dents long "-oattribute_timeout=0.1", // Don't cache attributes long + "-ononempty", // Don't complain about junk in mount point + "-f", // Don't background the process "-ordbuffer=32768", // Read buffer size in kb "rw" }; @@ -178,17 +201,35 @@ private static void establishMount(URI uri) throws IOException { execAssertSucceeds("mkdir -p " + mountPoint); // Mount the mini cluster - try { - Process fuseProcess = r.exec(mountCmd, env); - assertEquals(0, fuseProcess.waitFor()); - } catch (InterruptedException ie) { - fail("Failed to mount"); + String cmdStr = ""; + for (String c : mountCmd) { + cmdStr += (" " + c); } + LOG.info("now mounting with:" + cmdStr); + Process fuseProcess = r.exec(mountCmd, env); + RedirectToStdoutThread stdoutThread = + new RedirectToStdoutThread(fuseProcess.getInputStream()); + RedirectToStdoutThread stderrThread = + new RedirectToStdoutThread(fuseProcess.getErrorStream()); + stdoutThread.start(); + stderrThread.start(); + // Wait for fusermount to start up, so that we know we're operating on the + // FUSE FS when we run the tests. + try { + Thread.sleep(50000); + } catch (InterruptedException e) { + } + return fuseProcess; } /** Tear down the fuse-dfs process and mount */ private static void teardownMount() throws IOException { execWaitRet("fusermount -u " + mountPoint); + try { + assertEquals(0, fuseProcess.waitFor()); // fuse_dfs should exit cleanly + } catch (InterruptedException e) { + fail("interrupted while waiting for fuse_dfs process to exit."); + } } @BeforeClass @@ -200,7 +241,7 @@ public static void startUp() throws IOException { cluster = new MiniDFSCluster.Builder(conf).build(); cluster.waitClusterUp(); fs = cluster.getFileSystem(); - establishMount(fs.getUri()); + fuseProcess = establishMount(fs.getUri()); } @AfterClass