Skip to Main Content

Java APIs

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

Infamous SocketException: Broken Pipe

934824May 3 2012 — edited May 14 2012
Hello,

As with many of the other users on this forum I have been plagued by the Broken Pipe SocketException, very rarely, which seems to essentially block on the java.net.SocketOutputStream.socketWrite0(Native Method) for quite a long time (presumably the length of some timeout) during a flush. It is also typically accompanied by a "java.net.SocketException: Connection timed out" on the socket itself.

I've read the many responses by EJP that this means:

"This is caused by writing to a connection when the other end has already closed it.

So you have a poorly defined or implemented application protocol."

My main question is: Is it normal for these exceptions to occur, and we just need to write some layer that handles this?

And a follow up: If so, would that layer be something along the lines of:
- a separate thread on the server for each output stream, and if this thread blocks during flush (for whatever reason), either:
- use a watchdog thread to close the output if some internal timeout has exceeded, or:
- just let Java's connection timeout eventually occur and let the output thread die

Or am I way off base here?

One more thing: Any other advice / best architectural practices / help regarding this problem / reading suggestions would be extremely appreciated.

Thanks.

Comments

BryanWood
You need to disable disk locking, which ordinarily is performed by the first VM to prevent any other VMs from corrupting your vmdk files via uncoordinated writes. You will have to shutdown both of your VMs and edit the *.vmx flat file for each, adding lines like the following (settings taken from workstation 6, but should be nearly identical settings for VM Player 3.x):

http://crosbysite.blogspot.com/2007/10/clustering-in-vmware-workstation-6.html

scsi1.sharedbus = "Virtual"
disk.locking = "false"
diskLib.dataCacheMaxSize = "0"
diskLib.dataCacheMaxReadAheadSize = "0"
diskLib.dataCacheMinReadAheadSize = "0"
diskLib.dataCachePageSize = "4096"
diskLib.maxUnsyncedWrites = "0"

A few comments:

- your shared disks (scsi1) must be on a separate virtual scsi bus than the boot disk (scsi0), to allow setting the sharedbus flag as seen above.
- you must also ensure the cache parameters and unsynced writes settings are set to guarantee that all IO is immediately flushed to the vmdk file so the other VM can immediately access the latest version of data.
user8860348
Folks,

Hello. Thanks a lot for replying.

Because 2 Virtual Machines rac1 and rac2 share the same disk F:\VM_RAC\sharerac\asm1.vmdk and cause the problem, can we have rac1 and rac2 use different disks ?

For example,
Let rac1 uses disk F:\VM_RAC\sharerac\asm1.vmdk
Let rac2 uses disk F:\VM_RAC\sharerac\asm2.vmdk

If yes, how to have rac1 use asm1.vmdk and rac2 uses asm2.vmdk ?
BryanWood
Answer
Unfortunately no, Oracle RAC requires all nodes have access the same set of shared disks. If your database resides within ASM, each ASM instance (one per node) must also see the same set of disks to mount the ASM diskgroup containing the database's datafiles.

Best Regards,
Bryan Wood
Marked as Answer by user8860348 · Sep 27 2020
user8860348
Folks,

Hello. thanks a lot for replying.
I have edited the VMX files for rac1 and rac2. Both VMs can open at the same time now. Thanks again.
1 - 4
Locked Post
New comments cannot be posted to this locked post.

Post Details

Locked on Jun 11 2012
Added on May 3 2012
8 comments
37,686 views