[ 
https://issues.apache.org/jira/browse/HADOOP-11361?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15374164#comment-15374164
 ] 

Tsuyoshi Ozawa edited comment on HADOOP-11361 at 7/13/16 1:58 AM:
------------------------------------------------------------------

Thanks [~vinayrpet] and [~yzhangal] for your reviews. My comments are as 
follows:

1. . This is related to Youngjun's comment about null check, I perfer to remove 
the variable {{MetricsCollectorImpl builder}} and to use local variable 
{{List<MetricsRecordImpl> lastRecs}} for simplicity: 

{code}
    List<MetricsRecordImpl> lastRecs = null;
    if (getAllMetrics) {
      lastRecs = getMetrics(new MetricsCollectorImpl());
    }

    synchronized(this) {
      if (lastRecs != null) {
        updateAttrCache(lastRecs);
        if (getAllMetrics) {
          updateInfoCache(lastRecs);
        }
      }
      jmxCacheTS = Time.now();
      lastRecsCleared = true;
    }
{code}

In this case, we also need to update {{getMetrics(MetricsCollectorImpl 
builder)}} to return {{List<MetricsRecordImpl>}} instead of 
{{Iterable<MetricsRecordImpl>}}.

2. This is minor nits comment, but I think we should add null-check assertions 
against lastRecs in following methods: {{private void 
updateInfoCache(List<MetricsRecordImpl> lastRecs)}}, {{private int 
updateAttrCache(List<MetricsRecordImpl> lastRecs)}}. It increases readability 
and simplicity. On trunk, we can use {{Nonnull}} 
annotation(https://blogs.oracle.com/java-platform-group/entry/java_8_s_new_type),
 but it's been introduced since jdk8. Assert.checkNotNull provided in Guava is 
also enough.


was (Author: ozawa):
Thanks [~vinayrpet] and [~yzhangal] for your reviews. My comments are as 
follows:

1. . This is related to Youngjun's comment about null check, I perfer to remove 
the variable {{MetricsCollectorImpl builder}} and to use local variable 
{{List<MetricsRecordImpl> lastRecs}} for simplicity: 

{code}
    List<MetricsRecordImpl> lastRecs = null;
    if (getAllMetrics) {
      lastRecs = getMetrics(new MetricsCollectorImpl());
    }

    synchronized(this) {
      if (lastRecs != null) {
        updateAttrCache(lastRecs);
        if (getAllMetrics) {
          updateInfoCache(lastRecs);
        }
      }
      jmxCacheTS = Time.now();
      lastRecsCleared = true;
    }
{code}

In this case, we also need to update {{getMetrics(MetricsCollectorImpl 
builder)}} to return {{List<MetricsRecordImpl>}} instead of 
{{Iterable<MetricsRecordImpl>}}.

2. This is minor nits comment, but I think we should add null-check assertions 
against lastRecs here: {{private void updateInfoCache(List<MetricsRecordImpl> 
lastRecs)}}, {{private int updateAttrCache(List<MetricsRecordImpl> lastRecs)}}. 
It increases readability and simplicity. On trunk, we can use {{Nonnull}} 
annotation(https://blogs.oracle.com/java-platform-group/entry/java_8_s_new_type),
 but it's been introduced since jdk8. Assert.checkNotNull provided in Guava is 
also enough.

> Fix a race condition in MetricsSourceAdapter.updateJmxCache
> -----------------------------------------------------------
>
>                 Key: HADOOP-11361
>                 URL: https://issues.apache.org/jira/browse/HADOOP-11361
>             Project: Hadoop Common
>          Issue Type: Bug
>    Affects Versions: 2.4.1, 2.5.1, 2.6.0
>            Reporter: Brahma Reddy Battula
>            Assignee: Brahma Reddy Battula
>         Attachments: HADOOP-111361-003.patch, HADOOP-11361-002.patch, 
> HADOOP-11361-004.patch, HADOOP-11361-005.patch, HADOOP-11361-005.patch, 
> HADOOP-11361.patch, HDFS-7487.patch
>
>
> {noformat}
> Caused by: java.lang.NullPointerException
>       at 
> org.apache.hadoop.metrics2.impl.MetricsSourceAdapter.updateAttrCache(MetricsSourceAdapter.java:247)
>       at 
> org.apache.hadoop.metrics2.impl.MetricsSourceAdapter.updateJmxCache(MetricsSourceAdapter.java:177)
>       at 
> org.apache.hadoop.metrics2.impl.MetricsSourceAdapter.getAttribute(MetricsSourceAdapter.java:102)
>       at 
> com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getAttribute(DefaultMBeanServerInterceptor.java:647)
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: common-issues-unsubscr...@hadoop.apache.org
For additional commands, e-mail: common-issues-h...@hadoop.apache.org

Reply via email to