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

Steve Loughran commented on MAPREDUCE-3535:
-------------------------------------------

Having a look at what I'd done w.r.t service lifecycle 
[http://svn.eu.apache.org/viewvc/hadoop/common/branches/HADOOP-3628-2/src/core/org/apache/hadoop/util/Service.java?view=markup]
 I avoided this by having the base class do all the checks in final methods and 
have overridable {{innerStart()}}, {{innerStop()}} etc. methods that subclasses 
would use to perform their custom operations, along with a static class to 
actually walk a service into its started state.

There is no reason why the {{AbstractService}} class cannot use the same 
technique, without changing the {{Service}} interface. It would declare it's 
init/start/stop methods final, do the state change, then delegate to the 
{{protected}} methods {{innerInit()}} {{innerStart()}}, {{innerStop()}}. These 
would not be externally visible, and not get invoked until the validity of the 
operation had been tested. 

Effort: 
 # time to rework the older service lifecycle methods into the new framework, 1 
h
 # time to go through all the subclasses and rename their init/start/stop 
methods to be the inner ones. 

We could use a better prefix than "inner" if anyone can think of it.
                
> Yarn service subclasses don't check for service state before executing their 
> state change operations
> ----------------------------------------------------------------------------------------------------
>
>                 Key: MAPREDUCE-3535
>                 URL: https://issues.apache.org/jira/browse/MAPREDUCE-3535
>             Project: Hadoop Map/Reduce
>          Issue Type: Bug
>          Components: mrv2
>    Affects Versions: 0.23.0, 0.24.0
>            Reporter: Steve Loughran
>
> Although there are checks in the lifecycle state change methods (start, stop, 
> ...), they only get checked in the superclass. The subclasses don't check it; 
> they don't exit the start() method if they are already started, and they 
> don't bail out early on a stop if they are already stopped -even when the 
> superclass returns without doing anything.
> This means that calling {{Service.start()}} twice may leak resources, 
> {{Service.start()}} twice try to shut down twice, etc. And that's on the same 
> thread...
> My preferred action here would be for the ave the operations return true if a 
> state change took place, the implementation would be synchronised and return 
> the correct value
> The subclasses look for this and only execute their state changes took place
> e.g
> {code}
> boolean start() {
>  if (!super.start()) return false;
>  //do my own startup
>  return true;
> }
> {code}
> The {{Service.stop()}} operation is trickier as the subclasses tend to call 
> the superclass last for a better unwinding. I think it may be safer to work 
> the other way around, but code reviews would be need to ensure that this 
> doesn't break assumptions in the subclass about termination order. It may be 
> possible to do more complex designs, but it is hard to chain this down a 
> hierarchy of classes. 

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to