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

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

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

    https://github.com/apache/incubator-twill/pull/52#discussion_r34400584
  
    --- Diff: 
twill-yarn/src/main/java/org/apache/twill/internal/appmaster/ApplicationMasterService.java
 ---
    @@ -787,4 +804,80 @@ 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,
    +                  Arrays.toString(restartedInstanceIds.toArray()));
    +        restartRunnableInstances(runnableName, new 
LinkedList<>(restartedInstanceIds));
    +      }
    +    }
    +
    +    completion.run();
    +    return true;
    +  }
    +
    +  /**
    +   * Helper method to restart instances of runnables.
    +   */
    +  private void restartRunnableInstances(String runnableName, @Nullable 
Queue<Integer> instanceIds) {
    +    LOG.debug("Begin restart runnable {} instances.", runnableName);
    +
    +    int oldCount = expectedContainers.getExpected(runnableName);
    +    LOG.debug("Old instances for runnable {} is {}", runnableName, 
oldCount);
    +
    +    if (instanceIds == null) {
    +      LOG.debug("Instance ids is null so stopping all instances for 
runnable {}", runnableName);
    +
    +      // restart all containers for a runnable
    +      for (int i = (oldCount - 1); i >= 0; i--) {
    +        LOG.debug("Remove last instance {} for runnable {}", i, 
runnableName);
    +        runningContainers.removeLast(runnableName);
    +      }
    +    } else {
    +      LOG.debug("Stopping instances {} for runnable {}", 
instanceIds.toArray(), runnableName);
    +
    +      for (int instanceId : instanceIds) {
    +        LOG.debug("Remove instance {} for runnable {}", instanceId, 
runnableName);
    +        runningContainers.removeById(runnableName, instanceId);
    +      }
    +    }
    +    LOG.info("Restarting all instances for runnable {}", runnableName);
    +    expectedContainers.setExpected(runnableName, oldCount);
    --- End diff --
    
    I thought removing a container reset the expected count, looks like no 


> 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