[
https://issues.apache.org/jira/browse/HADOOP-15415?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Yiqun Lin updated HADOOP-15415:
-------------------------------
Status: Patch Available (was: Open)
> copyBytes hangs when the configuration file is corrupted
> --------------------------------------------------------
>
> Key: HADOOP-15415
> URL: https://issues.apache.org/jira/browse/HADOOP-15415
> Project: Hadoop Common
> Issue Type: Bug
> Components: common
> Affects Versions: 2.5.0, 0.23.0, 3.1.0
> Reporter: John Doe
> Assignee: Yiqun Lin
> Priority: Minor
> Attachments: HADOOP-15415.001.patch
>
>
> The third parameter, buffSize, is read from the configuration files or
> user-specified.
> When the configuration file is corrupted or the user configures with a wrong
> value, i.e., 0, the bytesRead will always be 0, making the while loop's
> condition always true, hanging IOUtils.copyBytes() endlessly.
> Here is the snippet of the code. There are four copyBytes in the following
> code. The 3rd and 4th copyBytes calls the 1st one. The 1st one calls the 2nd
> one. Hang happens in the while loop of the second copyBytes function.
>
> {code:java}
> //1st copyBytes
> public static void copyBytes(InputStream in, OutputStream out, int
> buffSize, boolean close)
> throws IOException {
> try {
> copyBytes(in, out, buffSize);
> if(close) {
> out.close();
> out = null;
> in.close();
> in = null;
> }
> } finally {
> if(close) {
> closeStream(out);
> closeStream(in);
> }
> }
> }
>
> //2nd copyBytes
> public static void copyBytes(InputStream in, OutputStream out, int
> buffSize)
> throws IOException {
> PrintStream ps = out instanceof PrintStream ? (PrintStream)out : null;
> byte buf[] = new byte[buffSize];
> int bytesRead = in.read(buf);
> while (bytesRead >= 0) {
> out.write(buf, 0, bytesRead);
> if ((ps != null) && ps.checkError()) {
> throw new IOException("Unable to write to output stream.");
> }
> bytesRead = in.read(buf);
> }
> }
> //3rd copyBytes
> public static void copyBytes(InputStream in, OutputStream out,
> Configuration conf)
> throws IOException {
> copyBytes(in, out, conf.getInt("io.file.buffer.size", 4096), true);
> }
>
> //4th copyBytes
> public static void copyBytes(InputStream in, OutputStream out,
> Configuration conf, boolean close)
> throws IOException {
> copyBytes(in, out, conf.getInt("io.file.buffer.size", 4096), close);
> }
> {code}
>
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]