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

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_r34399837
  
    --- 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--) {
    --- End diff --
    
    Since you are using the expectedCount, so it's possible that some of the 
instances are down (due to whatever reason), meaning it won't really restarting 
all containers that are currently running (and some running containers might 
not get restarted). Would it be better to take a snapshot of all currently 
running instances and restart them (and if failed to restart due to the 
container is already down, don't throw)?


> 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