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/06/21 16:55:26 UTC

[jira] Assigned: (HARMONY-4081) [classlib][nio] FileChannel.write(ByteBuffer[]) sometimes works incorrectly

     [ https://issues.apache.org/jira/browse/HARMONY-4081?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Alexei Zakharov reassigned HARMONY-4081:
----------------------------------------

    Assignee: Alexei Zakharov

> [classlib][nio] FileChannel.write(ByteBuffer[]) sometimes works incorrectly
> ---------------------------------------------------------------------------
>
>                 Key: HARMONY-4081
>                 URL: https://issues.apache.org/jira/browse/HARMONY-4081
>             Project: Harmony
>          Issue Type: Bug
>          Components: Classlib
>         Environment: Windows
>            Reporter: Vera Petrashkova
>            Assignee: Alexei Zakharov
>            Priority: Minor
>         Attachments: H-4081_fix.patch, H-4081_temp_workaround.patch, SourceViewScreenshot-1.jpg
>
>
> According to J2SE specification
> "File channels are safe for use by multiple concurrent threads."
> But the following test demonstrates that FileChannel.write(ByteBuffer[]) sometimes works incorrectly when
> some threads try to write bytes to the same channel.
> Not all data are written to the file.
> ---------------fchTest.java---------------
> import java.io.File;
> import java.io.IOException;
> import java.io.FileOutputStream;
> import java.io.FileInputStream;
> import java.nio.channels.FileChannel;
> import java.nio.ByteBuffer;
> public class fchTest {
>         
>     public static int N_TH = 20;
>     public static final int BUF_SIZE = 2000;
>     public static final int N_BUF = 20;
>     public static final int N_WRITES = 20;
>     boolean passed = true;
>   
>     String fileName = "FileChannel.file";
>     FileChannel outChannel = null;
>     FileChannel inChannel = null;
>     public static void main(String[] args) {
>         try {
>              if (args.length > 0) {
>                 N_TH = Integer.parseInt(args[0]);
>             }
>         } catch (Throwable e) {
>         }    
>         int res = new fchTest().test(args);
>         System.err.println(res == 104 ? "Test passed" : "Test failed");          
>     }
>     public int test(String[] params) {
>         File f = null;
>         passed = true;
>         try {
>             f = new File(fileName);
>             if (f.exists()) {
>                 f.delete();
>             }
>             outChannel = new FileOutputStream(f).getChannel();
>             inChannel = new FileInputStream(f).getChannel();
>             Thread[] t = new Thread[N_TH];
>             for (int i = 0; i < t.length; ++i) {
>                 t[i] = new thWriter(this); 
>                 t[i].start();
>             }
>             for (int i = 0; i < t.length; ++i) {
>                 t[i].join();
>             }
>         } catch (Throwable t) {
>             t.printStackTrace();
>             return 105;
>         } finally {
>             try {
>                 if (outChannel != null){
>                     outChannel.close();
>                 }
>                 if (inChannel != null){
>                     inChannel.close();
>                 }                    
>             } catch (Throwable t){
>                 t.printStackTrace();
>             }
>             if (f != null){
>                 f.delete();
>             }
>         }
>         return (passed ? 104 : 106);
>     }
> }
> class thWriter extends Thread {
>     FileChannel outChannel = null;
>     fchTest base = null;
>     
>     thWriter(fchTest base) {
>         this.outChannel = base.outChannel;
>         this.base = base;
>     }
> public void run () {
>         try {
>             long allW = 0;
>             long allC = 0;
>             for (int i = 0; i < fchTest.N_WRITES; ++i) {
>                 ByteBuffer[] bbb = createByteChunks();
>                 for (int t = 0; t < bbb.length; t++)  {
>                     allC += bbb[i].capacity();
>                 }
>                 long written = outChannel.write(bbb);
>                 if (written != (long)((fchTest.BUF_SIZE)*fchTest.N_BUF)) {
>                     System.err.println(this+"  Written: "+written+"  should be "+ fchTest.BUF_SIZE*fchTest.N_BUF+" outChannel position: "+outChannel.position());
>                     base.passed = false;
>                 }
>                 allW+=written;
>                 Thread.yield();
>                 Thread.sleep(10);
>             }
>             System.err.println(this+" - after write: "+allW+"  "+allC);
>             if (allW != allC) {
>                 base.passed = false;
>             }
>             outChannel.force(false);
>         } catch (Throwable e){
>             System.err.println(this+" unexpected exception " + e);
>             e.printStackTrace();
>             base.passed = false;
>         }
>     }
>     ByteBuffer[] createByteChunks() {
>         ByteBuffer[] bb_arr = new ByteBuffer[fchTest.N_BUF];
>         byte [] bb = new byte[fchTest.BUF_SIZE];    
>         for (int i = 0; i < bb.length; i++) {
>             bb[i] = (byte)i;
>         }
>         for (int i = 0; i < bb_arr.length; ++i) {
>             bb_arr[i] = ByteBuffer.allocateDirect(bb.length).wrap(bb);
>         }       
>         return bb_arr;
>     }
> }
> ----------------------------------------------------
> Run this test several times and change the number of created threads
> java fchTest
> java fchTest 30
> Output on RI:
> ==============
> java version "1.5.0_06"
> Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
> Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode)
> Thread[Thread-1,5,main] - after write: 800000  800000
> Thread[Thread-11,5,main] - after write: 800000  800000
> Thread[Thread-19,5,main] - after write: 800000  800000
> Thread[Thread-17,5,main] - after write: 800000  800000
> Thread[Thread-9,5,main] - after write: 800000  800000
> Thread[Thread-13,5,main] - after write: 800000  800000
> Thread[Thread-15,5,main] - after write: 800000  800000
> Thread[Thread-7,5,main] - after write: 800000  800000
> Thread[Thread-3,5,main] - after write: 800000  800000
> Thread[Thread-0,5,main] - after write: 800000  800000
> Thread[Thread-5,5,main] - after write: 800000  800000
> Thread[Thread-16,5,main] - after write: 800000  800000
> Thread[Thread-6,5,main] - after write: 800000  800000
> Thread[Thread-12,5,main] - after write: 800000  800000
> Thread[Thread-2,5,main] - after write: 800000  800000
> Thread[Thread-8,5,main] - after write: 800000  800000
> Thread[Thread-10,5,main] - after write: 800000  800000
> Thread[Thread-4,5,main] - after write: 800000  800000
> Thread[Thread-14,5,main] - after write: 800000  800000
> Thread[Thread-18,5,main] - after write: 800000  800000
> Test passed
> Output on DRLVM:
> ==============
> 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 = r544707, (Jun  6 2007), Windows/ia32/msvc 1310, release build
> http://harmony.apache.org
> The GC did not provide gc_add_weak_root_set_entry()
> Thread[Thread-9,5,main]  Written: 33100  should be 40000 outChannel position: 6874000
> Thread[Thread-20,5,main] - after write: 800000  800000
> Thread[Thread-16,5,main] - after write: 800000  800000
> Thread[Thread-8,5,main] - after write: 800000  800000
> Thread[Thread-12,5,main] - after write: 800000  800000
> Thread[Thread-22,5,main] - after write: 800000  800000
> Thread[Thread-14,5,main] - after write: 800000  800000
> Thread[Thread-18,5,main] - after write: 800000  800000
> Thread[Thread-23,5,main] - after write: 800000  800000
> Thread[Thread-11,5,main] - after write: 800000  800000
> Thread[Thread-10,5,main] - after write: 800000  800000
> Thread[Thread-24,5,main] - after write: 800000  800000
> Thread[Thread-7,5,main] - after write: 800000  800000
> Thread[Thread-15,5,main] - after write: 800000  800000
> Thread[Thread-9,5,main] - after write: 793100  800000
> Thread[Thread-6,5,main] - after write: 800000  800000
> Thread[Thread-25,5,main] - after write: 800000  800000
> Thread[Thread-17,5,main] - after write: 800000  800000
> Thread[Thread-13,5,main]  Written: 37700  should be 40000 outChannel position: 15872000
> Thread[Thread-19,5,main] - after write: 800000  800000
> Thread[Thread-13,5,main] - after write: 797700  800000
> Thread[Thread-21,5,main] - after write: 800000  800000
> Test failed
> This bug causes the failure of the test
>     api.nio.channels.filechannel.FileChannelThrSafetyTest
> from Reliability test suite https://issues.apache.org/jira/browse/HARMONY-2918

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.