HADOOP-7754. Expose file descriptors from Hadoop-wrapped local FileSystems (todd and ahmed via tucu)

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1373235 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Alejandro Abdelnur 2012-08-15 06:40:29 +00:00
parent fd8ce04dc5
commit 5aeabcdf6f
6 changed files with 84 additions and 3 deletions

View File

@ -215,6 +215,9 @@ Branch-2 ( Unreleased changes )
HADOOP-8581. add support for HTTPS to the web UIs. (tucu) HADOOP-8581. add support for HTTPS to the web UIs. (tucu)
HADOOP-7754. Expose file descriptors from Hadoop-wrapped local
FileSystems (todd and ahmed via tucu)
IMPROVEMENTS IMPROVEMENTS
HADOOP-8340. SNAPSHOT build versions should compare as less than their eventual HADOOP-8340. SNAPSHOT build versions should compare as less than their eventual

View File

@ -18,6 +18,8 @@
package org.apache.hadoop.fs; package org.apache.hadoop.fs;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceAudience;
@ -31,7 +33,7 @@
@InterfaceAudience.Private @InterfaceAudience.Private
@InterfaceStability.Unstable @InterfaceStability.Unstable
public class BufferedFSInputStream extends BufferedInputStream public class BufferedFSInputStream extends BufferedInputStream
implements Seekable, PositionedReadable { implements Seekable, PositionedReadable, HasFileDescriptor {
/** /**
* Creates a <code>BufferedFSInputStream</code> * Creates a <code>BufferedFSInputStream</code>
* with the specified buffer size, * with the specified buffer size,
@ -97,4 +99,13 @@ public void readFully(long position, byte[] buffer, int offset, int length) thro
public void readFully(long position, byte[] buffer) throws IOException { public void readFully(long position, byte[] buffer) throws IOException {
((FSInputStream)in).readFully(position, buffer); ((FSInputStream)in).readFully(position, buffer);
} }
@Override
public FileDescriptor getFileDescriptor() throws IOException {
if (in instanceof HasFileDescriptor) {
return ((HasFileDescriptor) in).getFileDescriptor();
} else {
return null;
}
}
} }

View File

@ -28,7 +28,7 @@
@InterfaceAudience.Public @InterfaceAudience.Public
@InterfaceStability.Stable @InterfaceStability.Stable
public class FSDataInputStream extends DataInputStream public class FSDataInputStream extends DataInputStream
implements Seekable, PositionedReadable, Closeable, ByteBufferReadable { implements Seekable, PositionedReadable, Closeable, ByteBufferReadable, HasFileDescriptor {
public FSDataInputStream(InputStream in) public FSDataInputStream(InputStream in)
throws IOException { throws IOException {
@ -125,4 +125,15 @@ public int read(ByteBuffer buf) throws IOException {
throw new UnsupportedOperationException("Byte-buffer read unsupported by input stream"); throw new UnsupportedOperationException("Byte-buffer read unsupported by input stream");
} }
@Override
public FileDescriptor getFileDescriptor() throws IOException {
if (in instanceof HasFileDescriptor) {
return ((HasFileDescriptor) in).getFileDescriptor();
} else if (in instanceof FileInputStream) {
return ((FileInputStream) in).getFD();
} else {
return null;
}
}
} }

View File

@ -0,0 +1,40 @@
/**
* 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.hadoop.fs;
import java.io.FileDescriptor;
import java.io.IOException;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
/**
* Having a FileDescriptor
*/
@InterfaceAudience.Private
@InterfaceStability.Evolving
public interface HasFileDescriptor {
/**
* @return the FileDescriptor
* @throws IOException
*/
public FileDescriptor getFileDescriptor() throws IOException;
}

View File

@ -26,6 +26,7 @@
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.FileDescriptor;
import java.net.URI; import java.net.URI;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.Arrays; import java.util.Arrays;
@ -111,7 +112,7 @@ public int read(byte[] data, int offset, int length) throws IOException {
/******************************************************* /*******************************************************
* For open()'s FSInputStream. * For open()'s FSInputStream.
*******************************************************/ *******************************************************/
class LocalFSFileInputStream extends FSInputStream { class LocalFSFileInputStream extends FSInputStream implements HasFileDescriptor {
private FileInputStream fis; private FileInputStream fis;
private long position; private long position;
@ -181,6 +182,11 @@ public long skip(long n) throws IOException {
} }
return value; return value;
} }
@Override
public FileDescriptor getFileDescriptor() throws IOException {
return fis.getFD();
}
} }
public FSDataInputStream open(Path f, int bufferSize) throws IOException { public FSDataInputStream open(Path f, int bufferSize) throws IOException {

View File

@ -248,4 +248,14 @@ public void testStatistics() throws Exception {
} }
assertEquals(1, fileSchemeCount); assertEquals(1, fileSchemeCount);
} }
public void testHasFileDescriptor() throws IOException {
Configuration conf = new Configuration();
LocalFileSystem fs = FileSystem.getLocal(conf);
Path path = new Path(TEST_ROOT_DIR, "test-file");
writeFile(fs, path, 1);
BufferedFSInputStream bis = new BufferedFSInputStream(
new RawLocalFileSystem().new LocalFSFileInputStream(path), 1024);
assertNotNull(bis.getFileDescriptor());
}
} }