Review Request for CR : 7144861 RMI activation tests are too slow

Olivier Lagneau olivier.lagneau at oracle.com
Mon May 7 16:30:58 UTC 2012


Hi Stuart,

Thanks for reviewing. Please see comments inlined.

Stuart Marks said  on date 5/5/2012 3:50 AM:
> On 5/3/12 10:53 AM, Alan Bateman wrote:
>> On 03/05/2012 14:09, Olivier Lagneau wrote:
>>> Please review this fix for making the jdk regression tests for rmi 
>>> activation
>>> run faster.
>>> It brings a near to x2 speed factor on a Solaris/SPARC machine.
>>>
>>> The webrev for the fix is here:
>>> http://cr.openjdk.java.net/~olagneau/7144861/webrev.00/
>> It's great to see patches like this, thank you! The RMI tests have 
>> always been
>> really slow, the activation tests in particular so I'm looking 
>> forward to
>> seeing this patch go in. I'm also looking forward to trying it out in
>> conjunction with Darryl Mocek's patch as the combined patches should 
>> mean we
>> get much better overall through-put.
>>
>> I think Stuart is going to do the detailed review and help you get 
>> this over
>> the finish line. I've just scanned the webrev (I didn't do a detailed 
>> review)
>> and I didn't see anything obviously wrong, looks like the changes are 
>> in the
>> right places.
>
> Yes, good stuff. The tests don't get nearly enough maintenance, and a 
> 2x speedup just by managing timeouts better is great.
>
> A few relatively minor comments.
>
> ActivationLibrary.java --
>
> If we catch an InterruptedException while sleeping, we reassert the 
> interrupt bit by interrupting the current thread. This is usually good 
> practice. In this case though we go around the loop again, retry, and 
> sleep again. But if we call sleep() when the interrupt bit is set, it 
> returns immediately. As it stands, after being interrupted, this code 
> will retry a bunch of times effectively without sleeping and will then 
> return false.
>
> I guess if we're going to go to the trouble of reasserting the 
> interrupt bit we might as well return false immediately.
Guess you are mentioning rmidRunning() method. You are right, 
reasserting the interrupt should not be done. My mistake.
But I think we should just ignore the InterruptedException and just move 
on next loop,
I could not find any other thread that may interrupt that one, neither 
in the testlibrary, nor in all rmi tests.

>
> JavaVM.java --
>
> The started() method is synchronized because it needs to set shared 
> state (the started field) from another thread. However, code here uses 
> the started field without any synchronization. Since the state is just 
> a boolean probably the easiest thing to do is to is to make it 
> volatile, in which case the started() method doesn't need to be 
> synchronized.
Right. I will just use a volatile instead. Cleaner and simpler.
>
> The maxTrials variable isn't actually the maximum number of trials, 
> it's the current number of trials. A small thing but it would be good 
> if it were renamed.
Sorry for that unnoticed misnaming. will fix it.
>
> Urgh. The addOptions/addArguments methods concatenate all the 
> arguments and options into a single string, and then the start() 
> method tokenizes them out again into an array of strings. Heaven 
> forbid somebody pass a filename with a space. I don't expect you to 
> fix this. I just had to say something. :-(
+1 ;-)
As I said in the request mail. I just did not want to fix the 
rmi+testlibrary code.
I have noticed many places where the code is not clean. In an ideal 
world, an
overall cleanup of all this code would be needed.
I did not fix the bad things I found because I did not want to mix the 
fix with cleanup.

>
> RMID.java --
>
> In the start() method, as before, the thread is reasserting the 
> interrupt bit on itself when it's interrupted. If it does this it 
> should just return immediately, otherwise it will spin around the loop 
> without sleeping until waitTime gets to zero.
Agreed. In this case I just wanted to minimize changes and kept that 
interrupt reassert.
For the same reason as before, I think we can just ignore it.
>
> I observe that the timer loop in start() doesn't necessarily wait for 
> an accurate amount of time, as sleep() can return early or late. There 
> are better techniques for dealing with this, but it's not clear to me 
> it's worth rewriting the code. This is something to bear in mind when 
> writing more time-critical code, however.
Thanks for the remark.
Guess the problem is the same for all usage of sleep in loops.

>
> In destroy() I see that the maxTrials variable here really is the 
> maximum number of trials, which is good. :-)
I am usually trying to avoid misnaming of identifier ;-)
>
> The timing loop here suffers from similar problems as the above. I 
> mean, it mostly works, but it could probably be simplified by calling 
> vm.waitFor() and having a task interrupt that call after a timeout 
> period. But it's probably not worth rewriting at this point.
Agreed for the two.

>
> * * *
>
> So, overall I'd like to see the interrupt handling changed and the 
> started field made volatile and maxTrials renamed in JavaVM.java. The 
> other issues probably should be taken care of at some point at some 
> point in the future; I think we all want the benefits of faster tests 
> now! :-)
Ok. will fix all of asap.
Hope to have another webrev Wednesday morning pdt (public holiday tomorrow).

Thanks,
Olivier.





More information about the core-libs-dev mailing list