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

Sanjay Radia commented on HADOOP-3470:
--------------------------------------

Generally member fields should be accessed via getters and setter. 
In this particular case the purpose of the metrics holder class (such as 
RPCMetrics or NameNodeMetrics, etc is to be place holder
of the a list of metrics variables that are then accessed in various parts of 
the code to change the counters. 

Forcing a set of new methods per metrics (since a metrics may have multiple 
operations) is very painful and will make it 
harder to add new metrics. Adding metrics should be simple"
  - declare metrics variable (eg. counter)
  - write code to change the metrics variable (e.g inc the counter).

(btw HADOOP-4838  simplifies metrics so that only the above two steps are 
needed.)

I believe the metrics variables are one of the exception to style rule of using 
getters and setter for fields.
(Note HADOOP4848 has added a registry and hence it would be easy to have  the 
callers use that map but the cost of that
would be too much for changing counters (ie a map lookup operation per counter 
increment!!)

> Bad coding style: The member fields in 
> org.apache.hadoop.ipc.metrics.RpcMetrics are public
> ------------------------------------------------------------------------------------------
>
>                 Key: HADOOP-3470
>                 URL: https://issues.apache.org/jira/browse/HADOOP-3470
>             Project: Hadoop Core
>          Issue Type: Improvement
>          Components: metrics
>            Reporter: Tsz Wo (Nicholas), SZE
>
> In org.apache.hadoop.ipc.metrics.RpcMetrics,
> {code}
> //the following are member fields
>   public MetricsTimeVaryingRate rpcQueueTime = new 
> MetricsTimeVaryingRate("RpcQueueTime");
>   public MetricsTimeVaryingRate rpcProcessingTime = new 
> MetricsTimeVaryingRate("RpcProcessingTime");
>   public Map <String, MetricsTimeVaryingRate> metricsList = 
> Collections.synchronizedMap(new HashMap<String, MetricsTimeVaryingRate>());
> {code}
> Then, the fields are accessed directly in other classes.  For example, 
> org.apache.hadoop.ipc.RPC.Server.call(...)
> {code}
> ...
>       MetricsTimeVaryingRate m = 
> rpcMetrics.metricsList.get(call.getMethodName());
>       if (m != null) {
>               m.inc(processingTime);
>       }
>       else {
>               rpcMetrics.metricsList.put(call.getMethodName(), new 
> MetricsTimeVaryingRate(call.getMethodName()));
>               m = rpcMetrics.metricsList.get(call.getMethodName());
>               m.inc(processingTime);
>       }
> {code}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to