I just found another bug of sync. Harmony throws SyncFailedException when fd
is read-only while RI returns silently. Spec doesn't explictly describe the
behaviour in such case[1]. But, it seems intended behaviour of RI, because
it requires additional check before invoke os sync. Following test
reproduces the bug:

   public void testSyncReadOnly() throws Exception {
       String TESTFILE = "tempFile";
       try {
           FileOutputStream fos = new FileOutputStream(TESTFILE);
           fos.write("something".getBytes());
           fos.close();

           RandomAccessFile raf = new RandomAccessFile(TESTFILE, "rw");
           raf.getFD().sync();
           raf.close();

           FileInputStream fis = new FileInputStream(TESTFILE);
           fis.getFD().sync();
           fis.close();
       } finally {
           new File(TESTFILE).delete();
       }
   }

I'll file a JIRA to record this bug soon!
[1] "SyncFailedException - Thrown when the buffers cannot be flushed, or
because the system cannot guarantee that all the buffers have been
synchronized with physical media."


On 9/19/06, Richard Liang <[EMAIL PROTECTED]> wrote:

On 9/18/06, Andrew Zhang <[EMAIL PROTECTED]> wrote:
> On 9/18/06, Richard Liang <[EMAIL PROTECTED]> wrote:
> >
> > Hello,
> >
> > One Apache Derby test[1] fails on Harmony. It seems that RI always
> > sync the FileOutputStream and FileChannel after each "write", which is
> > different from Harmony. But there is no explicit description in Java
> > Spec. Shall we follow RI? Thanks a lot.
> >
> > The following test cases could demonstrate this issue.
> >
> >    public void testFile() {
> >        File derbyLog = new File("d:\\", "derby1.log");
> >
> >        try {
> >            FileOutputStream fos = new FileOutputStream(derbyLog);
> >            fos.write(0x41);
> >            assertEquals(1, derbyLog.length());
> >        } catch (Exception e) {
> >            e.printStackTrace();
> >        }
> >    }
> >
> >    public void testFileChannel() {
> >        File derbyLog = new File("d:\\", "derby2.log");
> >
> >        try {
> >            FileOutputStream fos = new FileOutputStream(derbyLog);
> >            FileChannel fc = fos.getChannel();
> >            fc.write(ByteBuffer.wrap(new byte[]{0x41, 0x42}));
> >            assertEquals(2, derbyLog.length());
> >        } catch (Exception e) {
> >            e.printStackTrace();
> >        }
> >    }
>
>
> Interesting. I think we'd better follow RI although it's implementation
> dependent. Otherwise, it breaks existing application.
>
> To make test more interesting, I wrote a similar test:
>
>
>  public void testFile() throws Exception {
>         File derbyLog = File.createTempFile("test", "log");
>         derbyLog.deleteOnExit();
>         RandomAccessFile fos = new RandomAccessFile(derbyLog, "rws");
>         for (int i = 0; i < 1000; i++) {
>             fos.write(0x41);
>             assertEquals(1 + i, derbyLog.length());
>         }
>
>  }
>
> Run it and you'll be surprised. :-)

Wow! It tooks RI 0.381 seconds, while 21.761 seconds for Harmony. We
shall improve our performance!

Let's have a more further study about this issue.

>
> [1]
> >
http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/logStream.java?view=co
> > --
> > Richard Liang
> > China Development Lab, IBM
> >
> > ---------------------------------------------------------------------
> > Terms of use : http://incubator.apache.org/harmony/mailing.html
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
>
>
> --
> Andrew Zhang
> China Software Development Lab, IBM
>
>


--
Richard Liang
China Development Lab, IBM

---------------------------------------------------------------------
Terms of use : http://incubator.apache.org/harmony/mailing.html
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




--
Andrew Zhang
China Software Development Lab, IBM

Reply via email to