Return-Path: Delivered-To: apmail-harmony-commits-archive@www.apache.org Received: (qmail 85271 invoked from network); 21 May 2007 09:12:38 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 21 May 2007 09:12:38 -0000 Received: (qmail 33101 invoked by uid 500); 21 May 2007 09:12:44 -0000 Delivered-To: apmail-harmony-commits-archive@harmony.apache.org Received: (qmail 32985 invoked by uid 500); 21 May 2007 09:12:44 -0000 Mailing-List: contact commits-help@harmony.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@harmony.apache.org Delivered-To: mailing list commits@harmony.apache.org Received: (qmail 32955 invoked by uid 99); 21 May 2007 09:12:43 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 21 May 2007 02:12:43 -0700 X-ASF-Spam-Status: No, hits=-100.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO brutus.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 21 May 2007 02:12:37 -0700 Received: from brutus (localhost [127.0.0.1]) by brutus.apache.org (Postfix) with ESMTP id 04FAB71407C for ; Mon, 21 May 2007 02:12:17 -0700 (PDT) Message-ID: <14755052.1179738737018.JavaMail.jira@brutus> Date: Mon, 21 May 2007 02:12:17 -0700 (PDT) From: "Alexei Zakharov (JIRA)" To: commits@harmony.apache.org Subject: [jira] Resolved: (HARMONY-3785) [classlib][nio] FileChannel.transferFrom[To] methods throw unexpected IOException In-Reply-To: <20887271.1177748535436.JavaMail.jira@brutus> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Virus-Checked: Checked by ClamAV on apache.org [ https://issues.apache.org/jira/browse/HARMONY-3785?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Alexei Zakharov resolved HARMONY-3785. -------------------------------------- Resolution: Fixed Thanks Mikhail, thanks Vera. The patch was applied at the revision 540074. Please check. > [classlib][nio] FileChannel.transferFrom[To] methods throw unexpected IOException > --------------------------------------------------------------------------------- > > Key: HARMONY-3785 > URL: https://issues.apache.org/jira/browse/HARMONY-3785 > Project: Harmony > Issue Type: Bug > Components: Classlib > Environment: Windows and Linux > Reporter: Vera Petrashkova > Assigned To: Alexei Zakharov > Attachments: H-3785.patch > > > When FileChannel.transferFrom[To] methods are invoked in several threads and they try to read from the same file > then these methods throw unexpected IOException. > IOException is also thrown by these methods when one thread which invokes transfer methods and is created and started several times. > To reproduce this bug run the following test: > ------------------test.java------------ > import java.io.*; > import java.nio.channels.FileChannel; > import java.nio.ByteBuffer; > public class test extends Thread{ > static int nThreads = 10; > static int nIters = 100; > static volatile boolean passed = true; > FileChannel from = null; > FileChannel to = null; > public static void main(String[] args) { > int fail = 0; > if (args.length >= 1) { > try { > nThreads = Integer.parseInt(args[0]); > } catch (Throwable e) { > } > } > if (args.length >= 2) { > try { > nIters = Integer.parseInt(args[1]); > } catch (Throwable e) { > } > } > for (int i = 0; i < nIters; i++) { > if (new test().test(i) != 104) { > fail ++; > } > } > if (fail == 0) { > System.err.println("Test passed"); > } > } > public int test(int step) { > File f_from = null; > passed = true; > try { > f_from = new File("test.java"); > copy(f_from); > if (!passed) { > System.err.println("Step: "+ step+" Test failed"); > return 105; > } > } catch (Throwable t) { > t.printStackTrace(); > System.err.println("Step: "+ step+" Exception thrown: " + t); > return 105; > } > return 104; > } > public void copy(File f_from) throws Exception { > Thread[] t = new Thread[nThreads]; > File[] f_to = new File[nThreads]; > FileChannel[] outChannels = new FileChannel[nThreads]; > FileChannel inChannel = null; > try { > inChannel = new FileInputStream(f_from).getChannel(); > for (int i = 0; i < t.length; ++i) { > f_to[i] = new File(f_from.getAbsolutePath() + "_copy_" + i); > outChannels[i] = new FileOutputStream(f_to[i]).getChannel(); > t[i] = new test("" + i, inChannel, outChannels[i]); > t[i].start(); > } > for (int i = 0; i < t.length; ++i) { > t[i].join(); > } > } catch (Throwable tr) { > tr.printStackTrace(); > System.err.println("Exception thrown: " + tr); > passed = false; > } finally { > if (inChannel != null){ > inChannel.close(); > } > for (int i = 0; i < outChannels.length; ++i) { > if (outChannels[i] != null) { > outChannels[i].close(); > } > if (f_to[i] != null) { > f_to[i].delete(); > } > } > } > return; > } > test (String id, FileChannel from, FileChannel to) { > super(id); > this.from = from; > this.to = to; > } > test () { > super(); > } > public void run() { > long size = 0l; > long size1 = 0l; > long transfered = 0l; > long sz = 0l; > try { > synchronized (from) { > Thread.yield(); > from.position(0); > size = from.size() / 4; > size1 = from.size() - size; > sz = size; > Thread.yield(); > transfered = to.transferFrom(from, 0, sz); > if (transfered != sz) { > System.err.println("Thread " + this.getName() + ": transferFrom transfered " + > transfered + " bytes, instead of expected " + sz + " bytes"); > passed = false; > > } > transfered = 0; > sz = size1; > to.force(false); > to.position(size); > transfered = from.transferTo(size, sz, to); > if (transfered != size1) { > System.err.println("Thread " + this.getName() + ": transferTo transfered " + > transfered + " bytes, instead of expected " + sz + " bytes "); > passed = false; > > } > to.force(false); > } > } catch (Exception e) { > e.printStackTrace(); > System.err.println("Thread " + this + ": " + e > + " while transferFrom/To() operation"+" size: " > + sz+" transfered: "+transfered +" "//); > + from+" "+to); > passed = false; > } > } > } > ------------------------ > Run test creating several threads or one thread > java test 10 > java test 1 1000 > Test passes on RI in both cases but it fails on Harmony. > Output for one thread is: > =================== > Apache Harmony Launcher : (c) Copyright 1991, 2006 The Apache Software Foundation or its l > icensors, as applicable. > java version "1.5.0" > pre-alpha : not complete or compatible > svn = r532358, (Apr 25 2007), Windows/ia32/msvc 1310, debug build > http://incubator.apache.org/harmony > Memory Spy! Fixed memory leak by freeing PlatformAddress[57540608] > Memory Spy! Fixed attempt to free memory that was not allocated PlatformAddress[57540608] > java.io.IOException > at org.apache.harmony.luni.platform.OSFileSystem.writeDirect(OSFileSystem.java:134) > at org.apache.harmony.nio.internal.FileChannelImpl.writeImpl(FileChannelImpl.java:548) > at org.apache.harmony.nio.internal.FileChannelImpl.write(FileChannelImpl.java:524) > at org.apache.harmony.nio.internal.FileChannelImpl.transferFrom(FileChannelImpl.java:419) > at test.run(test.java:124) > Thread Thread[5,5,main]: java.io.IOException while transferFrom/To() operation size: 1182 transfered: 0 > org.apache.harmony.nio.internal.ReadOnlyFileChannel@14 org.apache.harmony.nio.internal.WriteOnlyFileChannel@dc > Step: 63 Test failed > Output for onr thread is: > Apache Harmony Launcher : (c) Copyright 1991, 2006 The Apache Software Foundation or its licensors, as applicable. > java version "1.5.0" > pre-alpha : not complete or compatible > svn = r532358, (Apr 25 2007), Linux/ia32/gcc 3.3.3, release build > http://incubator.apache.org/harmony > Memory Spy! Fixed memory leak by freeing PlatformAddress[2118897664] > Memory Spy! Fixed attempt to free memory that was not allocated PlatformAddress[2118897664] > java.io.IOException > at org.apache.harmony.luni.platform.OSFileSystem.writeDirect(Unknown Source) > at org.apache.harmony.nio.internal.FileChannelImpl.writeImpl(Unknown Source) > at org.apache.harmony.nio.internal.FileChannelImpl.write(Unknown Source) > at org.apache.harmony.nio.internal.FileChannelImpl.transferFrom(Unknown Source) > at test.run(test.java:124) > Thread Thread[0,5,main]: java.io.IOException while transferFrom/To() operation size: 1182 transfered: 0 > org.apache.harmony.nio.internal.ReadOnlyFileChannel@b0 org.apache.harmony.nio.internal.WriteOnlyFileChannel@138 > Step: 349 Test failed > Memory Spy! Fixed memory leak by freeing PlatformAddress[2120998912] > Memory Spy! Fixed attempt to free memory that was not allocated PlatformAddress[2120998912] > java.io.IOException > at org.apache.harmony.luni.platform.OSFileSystem.writeDirect(Unknown Source) > at org.apache.harmony.nio.internal.FileChannelImpl.writeImpl(Unknown Source) > at org.apache.harmony.nio.internal.FileChannelImpl.write(Unknown Source) > at org.apache.harmony.nio.internal.FileChannelImpl.transferFrom(Unknown Source) > at test.run(test.java:124) > Thread Thread[0,5,main]: java.io.IOException while transferFrom/To() operation size: 1182 transfered: 0 > org.apache.harmony.nio.internal.ReadOnlyFileChannel@b0 org.apache.harmony.nio.internal.WriteOnlyFileChannel@138 > Step: 699 Test failed -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.