[
https://issues.apache.org/jira/browse/TWILL-116?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14622948#comment-14622948
]
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_r34399637
--- 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) {
--- End diff --
Why the type is sometime `Set` (in the TwillController), something is
`List` (in `RunnableContainerRequest`) and sometime is `Queue`?
> 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)