You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by "Alexei Zakharov (JIRA)" <ji...@apache.org> on 2007/05/21 11:12:17 UTC

[jira] Resolved: (HARMONY-3785) [classlib][nio] FileChannel.transferFrom[To] methods throw unexpected IOException

     [ 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.