brooklyn-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From grkvlt <...@git.apache.org>
Subject [GitHub] incubator-brooklyn pull request: Feature/async ssh
Date Mon, 01 Dec 2014 16:08:46 GMT
Github user grkvlt commented on a diff in the pull request:

    https://github.com/apache/incubator-brooklyn/pull/358#discussion_r21098000
  
    --- Diff: core/src/main/java/brooklyn/util/internal/ssh/sshj/SshjTool.java ---
    @@ -299,16 +302,134 @@ public int copyFromServer(Map<String,?> props, String pathAndFileOnRemoteServer,
          * 
          * So on balance, the script-based approach seems most reliable, even if there is
an overhead
          * of separate message(s) for copying the file!
    +     * 
    +     * Another consideration is long-running scripts. On some clouds when executing a
script that takes 
    +     * several minutes, we have seen it fail with -1 (e.g. 1 in 20 times). This suggests
the ssh connection
    +     * is being dropped. To avoid this problem, we can execute the script asynchronously,
writing to files
    +     * the stdout/stderr/pid/exitStatus. We then periodically poll to retrieve the contents
of these files.
    +     * Use {@link #PROP_EXEC_ASYNC} to force this mode of execution.
          */
         @Override
         public int execScript(final Map<String,?> props, final List<String> commands,
final Map<String,?> env) {
    -        return new ToolAbstractExecScript(props) {
    +        Boolean execAsync = getOptionalVal(props, PROP_EXEC_ASYNC);
    +        if (Boolean.TRUE.equals(execAsync)) {
    +            return execScriptAsyncAndPoll(props, commands, env);
    +        } else {
    +            return new ToolAbstractExecScript(props) {
    +                public int run() {
    +                    String scriptContents = toScript(props, commands, env);
    +                    if (LOG.isTraceEnabled()) LOG.trace("Running shell command at {}
as script: {}", host, scriptContents);
    +                    copyToServer(ImmutableMap.of("permissions", "0700"), scriptContents.getBytes(),
scriptPath);
    +                    
    +                    return asInt(acquire(new ShellAction(buildRunScriptCommand(), out,
err)), -1);                
    +                }
    +            }.run();
    +        }
    +    }
    +
    +    protected int execScriptAsyncAndPoll(final Map<String,?> props, final List<String>
commands, final Map<String,?> env) {
    --- End diff --
    
    Complex, but looks good.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

Mime
View raw message