From 8af07085802b049a7405fcef2550a34c95470700 Mon Sep 17 00:00:00 2001 From: Haohui Mai Date: Wed, 9 Apr 2014 21:29:55 +0000 Subject: [PATCH] HDFS-6170. Support GETFILESTATUS operation in WebImageViewer. Contributed by Akira Ajisaka. git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1586152 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 + .../offlineImageViewer/FSImageHandler.java | 4 +- .../offlineImageViewer/FSImageLoader.java | 19 +++++- .../TestOfflineImageViewer.java | 61 +++++++++++-------- 4 files changed, 57 insertions(+), 30 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 3bd6204d06..048516dd85 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -285,6 +285,9 @@ Release 2.5.0 - UNRELEASED HDFS-6191. Disable quota checks when replaying edit log. (kihwal) + HDFS-6170. Support GETFILESTATUS operation in WebImageViewer. + (Akira Ajisaka via wheat9) + OPTIMIZATIONS BUG FIXES diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/FSImageHandler.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/FSImageHandler.java index 814a05f773..9e73003c01 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/FSImageHandler.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/FSImageHandler.java @@ -100,7 +100,9 @@ private void handleOperation(String op, String path, MessageEvent e) String content = null; if (request.getMethod() == HttpMethod.GET){ - if (op.equals("LISTSTATUS")) { + if (op.equals("GETFILESTATUS")) { + content = loader.getFileStatus(path); + } else if (op.equals("LISTSTATUS")) { content = loader.listStatus(path); } else { response.setStatus(HttpResponseStatus.BAD_REQUEST); diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/FSImageLoader.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/FSImageLoader.java index 6d041642a5..4b03b4f2ba 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/FSImageLoader.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/FSImageLoader.java @@ -51,7 +51,7 @@ * FSImageLoader loads fsimage and provide methods to return JSON formatted * file status of the namespace of the fsimage. */ -public class FSImageLoader { +class FSImageLoader { public static final Log LOG = LogFactory.getLog(FSImageHandler.class); private static String[] stringTable; @@ -69,7 +69,7 @@ private FSImageLoader() {} * @return FSImageLoader * @throws IOException if failed to load fsimage. */ - public static FSImageLoader load(String inputFile) throws IOException { + static FSImageLoader load(String inputFile) throws IOException { Configuration conf = new Configuration(); RandomAccessFile file = new RandomAccessFile(inputFile, "r"); if (!FSImageUtil.checkFileFormat(file)) { @@ -220,13 +220,26 @@ private static void loadStringTable(InputStream in) throws IOException { } } + /** + * Return the JSON formatted FileStatus of the specified file. + * @param path a path specifies a file + * @return JSON formatted FileStatus + * @throws IOException if failed to serialize fileStatus to JSON. + */ + String getFileStatus(String path) throws IOException { + ObjectMapper mapper = new ObjectMapper(); + FsImageProto.INodeSection.INode inode = inodes.get(getINodeId(path)); + return "{\"FileStatus\":\n" + + mapper.writeValueAsString(getFileStatus(inode, false)) + "\n}\n"; + } + /** * Return the JSON formatted list of the files in the specified directory. * @param path a path specifies a directory to list * @return JSON formatted file list in the directory * @throws IOException if failed to serialize fileStatus to JSON. */ - public String listStatus(String path) throws IOException { + String listStatus(String path) throws IOException { StringBuilder sb = new StringBuilder(); ObjectMapper mapper = new ObjectMapper(); List> fileStatusList = getFileStatusList(path); diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/TestOfflineImageViewer.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/TestOfflineImageViewer.java index e4e3f30e89..6c2f8d6066 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/TestOfflineImageViewer.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/TestOfflineImageViewer.java @@ -268,45 +268,33 @@ public void testWebImageViewer() throws IOException, InterruptedException, // compare a file FileStatus status = webhdfs.listStatus(new Path("/dir0/file0"))[0]; FileStatus expected = writtenFiles.get("/dir0/file0"); - assertEquals(expected.getAccessTime(), status.getAccessTime()); - assertEquals(expected.getBlockSize(), status.getBlockSize()); - assertEquals(expected.getGroup(), status.getGroup()); - assertEquals(expected.getLen(), status.getLen()); - assertEquals(expected.getModificationTime(), - status.getModificationTime()); - assertEquals(expected.getOwner(), status.getOwner()); - assertEquals(expected.getPermission(), status.getPermission()); - assertEquals(expected.getReplication(), status.getReplication()); - assertEquals(expected.isDirectory(), status.isDirectory()); + compareFile(expected, status); // LISTSTATUS operation to a invalid path URL url = new URL("http://localhost:" + port + "/webhdfs/v1/invalid/?op=LISTSTATUS"); - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod("GET"); - connection.connect(); - assertEquals(HttpURLConnection.HTTP_NOT_FOUND, - connection.getResponseCode()); + verifyHttpResponseCode(HttpURLConnection.HTTP_NOT_FOUND, url); // LISTSTATUS operation to a invalid prefix url = new URL("http://localhost:" + port + "/webhdfs/v1?op=LISTSTATUS"); - connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod("GET"); - connection.connect(); - assertEquals(HttpURLConnection.HTTP_NOT_FOUND, - connection.getResponseCode()); + verifyHttpResponseCode(HttpURLConnection.HTTP_NOT_FOUND, url); + + // GETFILESTATUS operation + status = webhdfs.getFileStatus(new Path("/dir0/file0")); + compareFile(expected, status); + + // GETFILESTATUS operation to a invalid path + url = new URL("http://localhost:" + port + + "/webhdfs/v1/invalid/?op=GETFILESTATUS"); + verifyHttpResponseCode(HttpURLConnection.HTTP_NOT_FOUND, url); // invalid operation url = new URL("http://localhost:" + port + "/webhdfs/v1/?op=INVALID"); - connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod("GET"); - connection.connect(); - assertEquals(HttpURLConnection.HTTP_BAD_REQUEST, - connection.getResponseCode()); + verifyHttpResponseCode(HttpURLConnection.HTTP_BAD_REQUEST, url); // invalid method url = new URL("http://localhost:" + port + "/webhdfs/v1/?op=LISTSTATUS"); - connection = (HttpURLConnection) url.openConnection(); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.connect(); assertEquals(HttpURLConnection.HTTP_BAD_METHOD, @@ -316,4 +304,25 @@ public void testWebImageViewer() throws IOException, InterruptedException, viewer.shutdown(); } } + + private static void compareFile(FileStatus expected, FileStatus status) { + assertEquals(expected.getAccessTime(), status.getAccessTime()); + assertEquals(expected.getBlockSize(), status.getBlockSize()); + assertEquals(expected.getGroup(), status.getGroup()); + assertEquals(expected.getLen(), status.getLen()); + assertEquals(expected.getModificationTime(), + status.getModificationTime()); + assertEquals(expected.getOwner(), status.getOwner()); + assertEquals(expected.getPermission(), status.getPermission()); + assertEquals(expected.getReplication(), status.getReplication()); + assertEquals(expected.isDirectory(), status.isDirectory()); + } + + private void verifyHttpResponseCode(int expectedCode, URL url) + throws IOException { + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.connect(); + assertEquals(expectedCode, connection.getResponseCode()); + } }