I hit very strange timeouts waiting for the network server to start when running the jmx management suite. The test does this:

  1) start network server within same vm
  2) run some tests
  3) stop network server
  4) start network server as separate process
  5) run some tests
  6) stop network server

The test was failing in step 4, waiting for the server to come up.

These timeouts have been blamed in the past on TCP/IP behaviour, delay on the socket becoming free again. I don't see how this can be the case as I could run this test multiple times, right after each other and steps 1-3 always worked and step 4 always failed, thus showing the 1527 port was available for re-use. Indeed when this complete suite runs successfully the network server is started and stopped over 20 times in 12 seconds, seemingly showing there's no issue in re-using a port.

Even stranger was on the same machine one codeline was not having any issues while another was seeing the timeout. The timeouts continued after a re-boot and then after I added some debugging they went away and have not re-appeared.

Looking at the separate process code in NetworkServerTestSetup it does have some issues, one coding and one design:

- The streams for the processed are not handled correctly which can cause the process to block, which would cause a timeout. Thus if for some reason the server does produce more output than normal it could hang thus leading to timeouts. Since the streams are not handled correctly the extra output is never seen making debugging this intermittent problem hard.

- The server is booted without setting derby.system.home. For the vm running the junit tests derby.system.home=${user.dir}/system. Since d.s.h is not set the server is running with a system home of user.dir. I think this explains the wombat database appearing in the current directory when running junit tests. I'm not sure if this intended when this decorator was added, the concept of the system folder was to have all Derby databases beneath that folder. Of course if d.s.h is set to ${user.dir}/system for the spawned server then we have two jvms accessing the same system and poentially the same databases. There are three possible solutions to this: a) Set d.s.h to ${user.dir}/system but shutdown Derby in the test vm before starting the separate server. b) Set d.s.h to ${user.dir}/ns (a different sub-folder) and ensure tests wrapped in this decorator only use databases under d.s.h. c) Leave it as-is, d.s.h defaults to ${user.dir} which leaves a wombat in the current folder.

Wiki page on junit folders ...
http://wiki.apache.org/db-derby/DerbyJunitTestConfiguration?#head-af5a240fccda5c96f104776dfbd20a8cabde55e0

Dan.

Reply via email to