[
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)