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

ASF GitHub Bot commented on TWILL-116:
--------------------------------------

Github user chtyim commented on a diff in the pull request:

    https://github.com/apache/incubator-twill/pull/52#discussion_r34505744
  
    --- Diff: 
twill-yarn/src/main/java/org/apache/twill/internal/appmaster/ApplicationMasterService.java
 ---
    @@ -787,4 +795,89 @@ private Resource 
createCapability(ResourceSpecification resourceSpec) {
         capability.setMemory(resourceSpec.getMemorySize());
         return capability;
       }
    +
    +  /**
    +   * Attempt to restart some instances from a runnable or some runnables.
    +   * @return {@code true} if the message requests restarting some 
instances and {@code false} otherwise.
    +   */
    +  private boolean handleRestartRunnablesInstances(final Message message, 
final Runnable completion) {
    +    LOG.debug("Check if it should process a restart runnable instances.");
    +
    +    if (message.getType() != Message.Type.SYSTEM) {
    +      return false;
    +    }
    +
    +    Message.Scope messageScope = message.getScope();
    +    if (messageScope != Message.Scope.RUNNABLE && messageScope != 
Message.Scope.RUNNABLES) {
    +      return false;
    +    }
    +
    +    Command requestCommand = message.getCommand();
    +    if 
(!Constants.RESTART_ALL_RUNNABLE_INSTANCES.equals(requestCommand.getCommand()) 
&&
    +      
!Constants.RESTART_RUNNABLES_INSTANCES.equals(requestCommand.getCommand())) {
    +      return false;
    +    }
    +
    +    LOG.debug("Processing restart runnable instances message {}.", 
message);
    +
    +    if (!Strings.isNullOrEmpty(message.getRunnableName()) && 
message.getScope() == Message.Scope.RUNNABLE) {
    +      // ... for a runnable ...
    +      String runnableName = message.getRunnableName();
    +      LOG.debug("Start restarting all runnable {} instances.", 
runnableName);
    +      restartRunnableInstances(runnableName, null);
    +    } else {
    +      // ... or maybe some runnables
    +      for (Map.Entry<String, String> option : 
requestCommand.getOptions().entrySet()) {
    +        String runnableName = option.getKey();
    +        Set<Integer> restartedInstanceIds = 
GSON.fromJson(option.getValue(),
    +                                                           new 
TypeToken<Set<Integer>>() {}.getType());
    +
    +        LOG.debug("Start restarting runnable {} instances {}", 
runnableName, restartedInstanceIds);
    +        restartRunnableInstances(runnableName, restartedInstanceIds);
    +      }
    +    }
    +
    +    completion.run();
    +    return true;
    +  }
    +
    +  /**
    +   * Helper method to restart instances of runnables.
    +   */
    +  private void restartRunnableInstances(String runnableName, @Nullable 
Set<Integer> instanceIds) {
    +    LOG.debug("Begin restart runnable {} instances.", runnableName);
    +
    +    if (instanceIds == null) {
    +      LOG.debug("Instance ids is null so stopping all instances for 
runnable {}", runnableName);
    +
    +      int currentCount = runningContainers.count(runnableName);
    +      LOG.debug("Old instances for runnable {} is {}", runnableName, 
currentCount);
    +
    +      // restart all containers for a runnable
    +      for (int instanceId = (currentCount - 1); instanceId >= 0; 
instanceId--) {
    --- End diff --
    
    Shall we just construct the set of instance ids to remove so that it shares 
the same logic as the "else" case? E.g.
    
    ```java
    private void restartRunnableInstances(String runnableName, @Nullable 
Set<Integer> instanceIds) {
      Set<Integer> instancesToRemove = instanceIds;
      if (instancesToRemove == null) {
        instancesToRemove = Ranges.closedOpen(0, 
runningContainers.count(runnableName)).asSet(DiscreteDomains.integers());
      }
    }


> Support for restart instances of runnable in an application
> -----------------------------------------------------------
>
>                 Key: TWILL-116
>                 URL: https://issues.apache.org/jira/browse/TWILL-116
>             Project: Apache Twill
>          Issue Type: New Feature
>          Components: core
>            Reporter: Albert Shau
>            Assignee: Henry Saputra
>             Fix For: 0.6.0-incubating
>
>         Attachments: TWILL-116-design-4.pdf, TWILL-116-design-5.pdf, 
> TWILL-116-design-6.pdf, TWILL-116-design-7.pdf, TWILL-116-design-final-2.pdf
>
>
> Once an application is running, it would be good to be able to stop, start, 
> and restart a specific runnable of the application without affecting other 
> runnables.  
> For example, I may be running multiple services in a single application, with 
> each service as a different runnable. One of my services gets into an invalid 
> state. I now want to restart just that runnable and not the other ones that 
> are running properly.



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

Reply via email to