[jcifs] bugs in JCIFS 1.2.9

Michael B Allen mba2000 at ioplex.com
Wed Nov 29 18:36:43 GMT 2006


Well we'll never know unless you can get a thread dump.

Mike

On Wed, 29 Nov 2006 18:51:48 +0100
"Tim Struyf" <tim.struyf at roots.be> wrote:

> Mike,
>  
> I ran your testcase and I get the same output as your email below, if i run it from the console!
>  
> However if I run this testcase in eclipse in debug mode I still see a lot of writer threads, all in object.wait() , waiting for a notify().
> So I believe there might still be something wrong... (at least if you trust the eclipse debugger...)
>  
> i find it very weird that eclipse is showing these threads...
> (with the w.interrupt implemented, these threads get closed correctly and no threads remain in object.wait)
>  
> regards,
> Tim
> 
> ________________________________
> 
> Van: Michael B Allen [mailto:mba2000 at ioplex.com]
> Verzonden: vr 24/11/2006 17:24
> Aan: Tim Struyf
> CC: jcifs at lists.samba.org
> Onderwerp: Re: [jcifs] bugs in JCIFS 1.2.9
> 
> 
> 
> The following thread should cause the writer thread to exit.
> 
>    2139         try {
>    2140             copyTo0( dest, b, bsize, w, req, resp );
>    2141         } finally {
>    2142             w.write( null, -1, null, 0 );
>    2143         }
> 
> I cannot reproduce this problem. I think you are confusing the writer
> thread with the Transport threads. You will need to get a thread dump
> to verify this.
> 
> Run the attached example like:
> 
> $ java -Djcifs.properties=../miallen.prp CopyToTest smb://ts0.win.net/tmp/bogus.txt smb://nano.foo.net/pub/bogus.txt
> jcifs.smb.SmbException: The system cannot find the file specified.
>         at jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:511)
>         at jcifs.smb.SmbTransport.send(SmbTransport.java:588)
>         at jcifs.smb.SmbSession.send(SmbSession.java:239)
>         at jcifs.smb.SmbTree.send(SmbTree.java:109)
>         at jcifs.smb.SmbFile.send(SmbFile.java:690)
>         at jcifs.smb.SmbFile.queryPath(SmbFile.java:1202)
>         at jcifs.smb.SmbFile.copyTo0(SmbFile.java:1950)
>         at jcifs.smb.SmbFile.copyTo(SmbFile.java:2140)
>         at CopyToTest.run(CopyToTest.java:17)
> 
> <get a thread dump [1]>
> 
> Full thread dump Java HotSpot(TM) Client VM (1.4.2_08-b03 mixed mode):
> 
> "Transport2" daemon prio=1 tid=0x093bbae8 nid=0x3eea runnable [4be3000..4be4228]
>         at java.net.SocketInputStream.socketRead0(Native Method)
>         at java.net.SocketInputStream.read(SocketInputStream.java:129)
>         at jcifs.util.transport.Transport.readn(Transport.java:29)
>         at jcifs.smb.SmbTransport.peekKey(SmbTransport.java:352)
>         at jcifs.util.transport.Transport.loop(Transport.java:100)
>         at jcifs.util.transport.Transport.run(Transport.java:261)
>         at java.lang.Thread.run(Thread.java:534)
> 
> "Transport1" daemon prio=1 tid=0x093b77d0 nid=0x3eea runnable [2ef6000..2ef7228]
>         at java.net.SocketInputStream.socketRead0(Native Method)
>         at java.net.SocketInputStream.read(SocketInputStream.java:129)
>         at jcifs.util.transport.Transport.readn(Transport.java:29)
>         at jcifs.smb.SmbTransport.peekKey(SmbTransport.java:352)
>         at jcifs.util.transport.Transport.loop(Transport.java:100)
>         at jcifs.util.transport.Transport.run(Transport.java:261)
>         at java.lang.Thread.run(Thread.java:534)
> 
> "Signal Dispatcher" daemon prio=1 tid=0x0925d8d8 nid=0x3eea waiting on condition [0..0]
> 
> "Finalizer" daemon prio=1 tid=0x09248e38 nid=0x3eea in Object.wait() [5a6000..5a6228]
>         at java.lang.Object.wait(Native Method)
>         - waiting on <0xae3573f0> (a java.lang.ref.ReferenceQueue$Lock)
>         at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:111)
>         - locked <0xae3573f0> (a java.lang.ref.ReferenceQueue$Lock)
>         at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:127)
>         at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
> 
> "Reference Handler" daemon prio=1 tid=0x09248290 nid=0x3eea in Object.wait() [4eb000..4eb228]
>         at java.lang.Object.wait(Native Method)
>         - waiting on <0xae357290> (a java.lang.ref.Reference$Lock)
>         at java.lang.Object.wait(Object.java:429)
>         at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:115)
>         - locked <0xae357290> (a java.lang.ref.Reference$Lock)
> 
> "main" prio=1 tid=0x092129a0 nid=0x3eea waiting on condition [bff37000..bff3729c]
>         at java.lang.Thread.sleep(Native Method)
>         at CopyToTest.main(CopyToTest.java:27)
> 
> "VM Thread" prio=1 tid=0x09247030 nid=0x3eea runnable
> 
> "VM Periodic Task Thread" prio=1 tid=0x092600d8 nid=0x3eea waiting on condition
> "Suspend Checker Thread" prio=1 tid=0x0925cf20 nid=0x3eea runnable
> 
> You can see above there is no "JCIFS-WriterThread" listed.
> 
> Now wait 20 seconds for the Transport threads to exit and do a thread
> dump again:
> 
> Full thread dump Java HotSpot(TM) Client VM (1.4.2_08-b03 mixed mode):
> 
> "Signal Dispatcher" daemon prio=1 tid=0x0925d8d8 nid=0x3eea runnable [0..0]
> 
> "Finalizer" daemon prio=1 tid=0x09248e38 nid=0x3eea in Object.wait() [5a6000..5a6228]
>         at java.lang.Object.wait(Native Method)
>         - waiting on <0xae3573f0> (a java.lang.ref.ReferenceQueue$Lock)
>         at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:111)
>         - locked <0xae3573f0> (a java.lang.ref.ReferenceQueue$Lock)
>         at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:127)
>         at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
> 
> "Reference Handler" daemon prio=1 tid=0x09248290 nid=0x3eea in Object.wait() [4eb000..4eb228]
>         at java.lang.Object.wait(Native Method)
>         - waiting on <0xae357290> (a java.lang.ref.Reference$Lock)
>         at java.lang.Object.wait(Object.java:429)
>         at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:115)
>         - locked <0xae357290> (a java.lang.ref.Reference$Lock)
> 
> "main" prio=1 tid=0x092129a0 nid=0x3eea waiting on condition [bff37000..bff3729c]
>         at java.lang.Thread.sleep(Native Method)
>         at CopyToTest.main(CopyToTest.java:27)
> 
> "VM Thread" prio=1 tid=0x09247030 nid=0x3eea runnable
> 
> "VM Periodic Task Thread" prio=1 tid=0x092600d8 nid=0x3eea waiting on condition
> "Suspend Checker Thread" prio=1 tid=0x0925cf20 nid=0x3eea runnable
> 
> Now you can see only VM threads are left.
> 
> AFAICT everything is working perfectly.
> 
> Or just try to add a 20 second sleep to your test and you'll see the
> Transport threads exit. You can make them close quicker by reducing
> jcifs.smb.client.soTimeout.
> 
> Mike
> 
> [1] To get a thread dump on Windows, run your program on the console
> and press <ctrl><break> (on Unix it's <ctrl>\).
> 
> 


-- 
Michael B Allen
PHP Active Directory SSO
http://www.ioplex.com/


More information about the jcifs mailing list