jmx-dev Codereview: JDK-8065764 javax/management/monitor/CounterMonitorTest.java hangs

shanliang shanliang.jiang at oracle.com
Tue Dec 2 17:56:10 UTC 2014


Jaroslav Bachorik wrote:
> On 12/02/2014 05:22 PM, shanliang wrote:
>> Jaroslav Bachorik wrote:
>>> On 12/02/2014 04:22 PM, shanliang wrote:
>>>> Jaroslav Bachorik wrote:
>>>>> On 12/02/2014 02:40 PM, shanliang wrote:
>>>>>> Jaroslav Bachorik wrote:
>>>>>>> On 12/01/2014 02:50 PM, shanliang wrote:
>>>>>>>> Hi,
>>>>>>>> please review this test bug fix:
>>>>>>>>
>>>>>>>> webrev:
>>>>>>>> http://cr.openjdk.java.net/~sjiang/JDK-8065764/00/
>>>>>>>>
>>>>>>>> bug:
>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8065764
>>>>>>>>
>>>>>>>
>>>>>>> test/javax/management/monitor/CounterMonitorTest.java
>>>>>>> L61 - observedValue could be Integer
>>>>>> Could be, but not make difference, observedValue is only used 
>>>>>> with the
>>>>>> operation "==", like
>>>>>>     while (value != observedValue)
>>>>>
>>>>> In that case having a correct type would make even more sense for the
>>>>> readability.
>>>> Agree in general:) but the variable "count" is declared as "Object" in
>>>> StdObservedObject, and "observedValue" is used to save observed 
>>>> "count"
>>>> value, so better to keep the same type for "more readability"? and 
>>>> avoid
>>>> a casting when setting "observedValue"
>>>
>>> Any reason 'count' is declared as Object? The value is effectively an
>>> integer value - only integer values are ever assigned to it. All the
>>> operations silently suppose this would be an integer and yet the type
>>> information is thrown away and the data is stored as Object. Feels
>>> very strange ...
>> I think a possible reason is that the CounterMonitor supports only
>> Number type for comparing, and it accepts any type but detects whether
>> the observed variable could be "matched" to Number, pass an Object type
>> verifies this capability.
>
> Hm, could you direct me to the code doing this? 'setAttribute' method 
> seems to be inherited from 'Monitor' class and does not do any 
> additional checks. Then 'Monitor.monitor()' uses 'getAttribute' 
> (again, not overridden) to get back to the attribute :(
ConterMonitor overrides Monitor.isComparableTypeValid(...)

This method will be called by Monitor at the monitoring time and a 
Notification with the type "jmx.monitor.error.type" will be sent out if 
the observed attribute is not of type "Integer".

Yes the monitor might have to do type check with the method:
    Monitor.setObservedAttribute("NbObjects");

but the Javadoc declares only:
    Throws: IllegalArgumentException - The specified attribute is null.

maybe it is not sure that a monitor could do type check at setting time, 
for example if the MBeanInfo is null and getAttributeValue() returns null.

Shanliang
>
> Thanks,
>
> -JB-
>
>>>
>>>>>
>>>>>>> L225-238 - you could replace this block with the usage of Phaser 
>>>>>>> (if
>>>>>>> you'd do that you could completely remove 'observedValue')
>>>>>> Not sure that it is a good idea to remove "observedValue" by using
>>>>>> Phaser, yes using Phaser can tell when the monitor does an
>>>>>> observation,
>>>>>> but it is better to know which count value the monitor observed, in
>>>>>> case
>>>>>> the thread was waked up accidentally.
>>>>>
>>>>> I don't think phaser can be confused by spurious wake-ups.
>>>>>
>>>>> If you want to keep the current way of synchronizing then you should
>>>>> make the 'count' variable volatile (L77) - it might be read and
>>>>> written to from different threads.
>>>> Phaser should not make a false wakeup, but use "observedValue" can 
>>>> make
>>>> sure that the observation happens on the right "count" value.
>>>> Yes "count" should be declared as "volatile".
>>>>
>>>> Here is the new version:
>>>>     http://cr.openjdk.java.net/~sjiang/JDK-8065764/01/
>>>
>>> Still using 'derivedGange' instead of 'derivedGauge' :(
>> Oh I will change it before pushing, if no other modification.
>>
>> Thanks,
>> Shanliang
>>>
>>> -JB-
>>>
>>>>
>>>> Thanks,
>>>> Shanliang
>>>>
>>>>>
>>>>> -JB-
>>>>>
>>>>>>
>>>>>> Thanks,
>>>>>> Shanliang
>>>>>>>
>>>>>>> -JB-
>>>>>>>
>>>>>>>
>>>>>>>> The test tested the mode "difference", according to the Javadoc:
>>>>>>>>       If the counter difference mode is used, the value of the
>>>>>>>> derived
>>>>>>>> gauge is calculated as the difference between the observed counter
>>>>>>>> values for two successive observations.
>>>>>>>>
>>>>>>>> The test set the first value and then waited 2 times of
>>>>>>>> granularityperiod at line 171, hoped that the monitor would get 
>>>>>>>> the
>>>>>>>> first observation during this waiting time, but the test could 
>>>>>>>> fail
>>>>>>>> because granularityperiod * 2 was not enough and the test did the
>>>>>>>> second
>>>>>>>> set before the monitor did the first observation.
>>>>>>>>
>>>>>>>> It is easy to make the test timeout by commenting out the line 
>>>>>>>> 171.
>>>>>>>>
>>>>>>>> The proposed solution is to get informed when the monitor did
>>>>>>>> observation on calling:
>>>>>>>>     StdObservedObject.getNbObjects();
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Shanliang
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>



More information about the jmx-dev mailing list