You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2017/03/20 15:57:29 UTC
[04/11] brooklyn-server git commit: Merge branch 'master' into
config-immediate-more
Merge branch 'master' into config-immediate-more
a couple conflicts in cleanup to exec immediately
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/ce094d75
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/ce094d75
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/ce094d75
Branch: refs/heads/master
Commit: ce094d7595b502493cebc565008d3855d5ebdee7
Parents: b61b46e 94c6a30
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Mar 3 16:17:54 2017 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Mar 3 16:17:54 2017 +0000
----------------------------------------------------------------------
.../brooklyn/spi/dsl/methods/DslComponent.java | 6 +-
.../methods/FormatStringIntegrationTest.java | 76 ------
.../methods/FormatStringIntegrationTest.java | 76 ++++++
.../catalog/internal/BasicBrooklynCatalog.java | 2 +-
.../impl/DeleteOrphanedStateTransformer.java | 8 +-
.../core/sensor/ssh/SshCommandSensor.java | 6 +-
.../brooklyn/feed/AbstractCommandFeed.java | 259 ++++++++++++++++++
.../apache/brooklyn/feed/CommandPollConfig.java | 179 +++++++++++++
.../org/apache/brooklyn/feed/ssh/SshFeed.java | 217 +++------------
.../apache/brooklyn/feed/ssh/SshPollConfig.java | 177 +------------
.../brooklyn/util/core/file/ArchiveUtils.java | 29 +-
.../brooklyn/util/core/osgi/BundleMaker.java | 35 ++-
.../util/core/task/BasicExecutionContext.java | 8 +-
.../brooklyn/util/core/task/CompoundTask.java | 15 ++
.../task/InterruptingImmediateSupplier.java | 4 +-
.../brooklyn/util/core/task/ValueResolver.java | 22 +-
.../deserializingClassRenames.properties | 3 +
.../feed/ssh/SshFeedIntegrationTest.java | 20 +-
.../util/core/task/ValueResolverTest.java | 46 ++++
.../brooklyn/launcher/common/BasicLauncher.java | 6 +-
.../brooklyn/launcher/BrooklynLauncher.java | 2 +-
.../brooklyn/launcher/BrooklynWebServer.java | 12 +-
.../brooklyn/launcher/BrooklynLauncherTest.java | 2 +-
.../CleanOrphanedLocationsIntegrationTest.java | 27 +-
.../brooklyn/launcher/WebAppRunnerTest.java | 34 +--
.../location/jclouds/JcloudsLocation.java | 10 +-
.../apache/brooklyn/rest/domain/ApiError.java | 14 +-
.../rest/resources/ApplicationResource.java | 12 +-
.../rest/resources/EffectorResource.java | 3 +-
.../rest/resources/ErrorResponseTest.java | 21 +-
.../core/sensor/windows/WinRmCommandSensor.java | 167 ++++++++++++
.../apache/brooklyn/feed/windows/CmdFeed.java | 83 ++++++
.../util/core/internal/winrm/WinRmTool.java | 6 +
.../internal/winrm/winrm4j/Winrm4jTool.java | 7 +-
.../feed/windows/WinRmFeedIntegrationTest.java | 262 +++++++++++++++++++
.../util/javalang/LoadedClassLoader.java | 10 +-
.../apache/brooklyn/util/net/Networking.java | 8 +-
.../java/org/apache/brooklyn/util/os/Os.java | 2 +-
38 files changed, 1347 insertions(+), 529 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ce094d75/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ce094d75/core/src/main/java/org/apache/brooklyn/util/core/task/InterruptingImmediateSupplier.java
----------------------------------------------------------------------
diff --cc core/src/main/java/org/apache/brooklyn/util/core/task/InterruptingImmediateSupplier.java
index 0a34a18,afbc285..9c7979b
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/InterruptingImmediateSupplier.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/InterruptingImmediateSupplier.java
@@@ -58,12 -59,10 +59,13 @@@ public class InterruptingImmediateSuppl
if (!interrupted) Thread.currentThread().interrupt();
return Maybe.ofAllowingNull(get());
} catch (Throwable t) {
+ if (Exceptions.getFirstThrowableOfType(t, ImmediateValueNotAvailableException.class)!=null) {
+ return Maybe.absent(Exceptions.getFirstThrowableOfType(t, ImmediateValueNotAvailableException.class));
+ }
if (Exceptions.getFirstThrowableOfType(t, InterruptedException.class)!=null ||
- Exceptions.getFirstThrowableOfType(t, RuntimeInterruptedException.class)!=null) {
+ Exceptions.getFirstThrowableOfType(t, RuntimeInterruptedException.class)!=null ||
+ Exceptions.getFirstThrowableOfType(t, CancellationException.class)!=null) {
- return Maybe.absent(new UnsupportedOperationException("Immediate value not available", t));
+ return Maybe.absent(new ImmediateValueNotAvailableException("Immediate value not available, required non-blocking execution", t));
}
throw Exceptions.propagate(t);
} finally {
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ce094d75/core/src/main/java/org/apache/brooklyn/util/core/task/ValueResolver.java
----------------------------------------------------------------------
diff --cc core/src/main/java/org/apache/brooklyn/util/core/task/ValueResolver.java
index 4446d92,3c6d96b..c5316fc
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/ValueResolver.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/ValueResolver.java
@@@ -384,32 -384,36 +384,35 @@@ public class ValueResolver<T> implement
v = ((TaskAdaptable<?>) v).asTask();
}
}
-
+
if (allowImmediateExecution && isEvaluatingImmediately()) {
- // TODO could allow for everything, when evaluating immediately -- but if the target isn't safe to run again
- // then we have to fail if immediate didn't work; to avoid breaking semantics we only do that for a few cases;
- // might be nice to get to the point where we can break those semantics however,
- // ie weakening what getImmediate supports and making it be non-blocking, so that bailOut=true is the default.
- // if: v instanceof TaskFactory -- it is safe, it's a new API (but it is currently the only one supported);
- // more than safe, we have to do it -- or add code here to cancel tasks -- because it spawns new tasks
- // (other objects passed through here don't get cancelled, because other things might try again later;
- // ie a task or future passed in here might naturally be long-running so cancelling is wrong,
- // but with a task factory generated task it would leak if we submitted and didn't cancel!)
- // if: v instanceof ImmediateSupplier -- it probably is safe to change to bailOut = true ?
- // if: v instanceof Task or other things -- it currently isn't safe, there are places where
- // we expect to getImmediate on things which don't support it nicely,
- // and we rely on the blocking-short-wait behaviour, e.g. QuorumChecks in ConfigYamlTest
+ // Feb 2017 - many things now we try to run immediate; notable exceptions are:
+ // * where the target isn't safe to run again (such as a Task which someone else might need),
+ // * or where he can't be run in an "interrupting" mode even if non-blocking (eg Future.get(), some other tasks)
+ // (the latter could be tried here, with bailOut false, but in most cases it will just throw so we still need to
+ // have the timings as in SHORT_WAIT etc as a fallack)
+
+ Maybe<T> result = null;
try {
- Maybe<T> result = execImmediate(exec, v);
- if (result!=null) return result;
- if (bailOutAfterImmediateExecution) {
- throw new ImmediateSupplier.ImmediateUnsupportedException("Cannot get immediately: "+v);
- }
+ result = exec.getImmediately(v);
+
+ return (result.isPresent())
+ ? recursive
+ ? new ValueResolver<T>(result.get(), type, this).getMaybe()
+ : result
+ : result;
} catch (ImmediateSupplier.ImmediateUnsupportedException e) {
if (bailOutAfterImmediateExecution) {
- throw new ImmediateSupplier.ImmediateUnsupportedException("Cannot get immediately: "+v, e);
+ throw new ImmediateSupplier.ImmediateUnsupportedException("Cannot get immediately: "+v);
}
- // else proceed to below
- log.debug("Unable to resolve-immediately for "+description+" ("+v+", unsupported, type "+v.getClass()+"); falling back to executing with timeout: "+e);
- } catch (InterruptingImmediateSupplier.InterruptingImmediateSupplierNotSupportedForObject e) {
+ // ignore, continue below
- log.debug("Unable to resolve-immediately for "+description+" ("+v+", not supported for type "+v.getClass()+"); falling back to executing with timeout: "+e);
++ if (log.isTraceEnabled()) {
++ log.trace("Unable to resolve-immediately for "+description+" ("+v+", unsupported, type "+v.getClass()+"); falling back to executing with timeout: "+e);
++ }
+ } catch (ImmediateSupplier.ImmediateValueNotAvailableException e) {
+ // definitively not available
+ return ImmediateSupplier.ImmediateValueNotAvailableException.newAbsentWithExceptionSupplier();
- }
+ }
}
if (v instanceof Task) {
@@@ -559,6 -564,21 +562,21 @@@
}
}
- /** tries to get immediately, then resolve recursively (including for casting) if {@link #recursive} is set
- *
- * @throws InterruptingImmediateSupplier.InterruptingImmediateSupplierNotSupportedForObject
- * ImmediateSupplier.ImmediateUnsupportedException
- * if underlying call to {@link ExecutionContext#getImmediately(Object)} does so */
- protected Maybe<T> execImmediate(ExecutionContext exec, Object immediateSupplierOrImmediateTask) {
- Maybe<T> result = exec.getImmediately(immediateSupplierOrImmediateTask);
-
- return (result.isPresent())
- ? recursive
- ? new ValueResolver<T>(result.get(), type, this).getMaybe()
- : result
- : result;
- }
++// /** tries to get immediately, then resolve recursively (including for casting) if {@link #recursive} is set
++// *
++// * @throws InterruptingImmediateSupplier.InterruptingImmediateSupplierNotSupportedForObject
++// * ImmediateSupplier.ImmediateUnsupportedException
++// * if underlying call to {@link ExecutionContext#getImmediately(Object)} does so */
++// protected Maybe<T> execImmediate(ExecutionContext exec, Object immediateSupplierOrImmediateTask) {
++// Maybe<T> result = exec.getImmediately(immediateSupplierOrImmediateTask);
++//
++// return (result.isPresent())
++// ? recursive
++// ? new ValueResolver<T>(result.get(), type, this).getMaybe()
++// : result
++// : result;
++// }
+
protected String getDescription() {
return description!=null ? description : ""+value;
}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ce094d75/core/src/test/java/org/apache/brooklyn/util/core/task/ValueResolverTest.java
----------------------------------------------------------------------
diff --cc core/src/test/java/org/apache/brooklyn/util/core/task/ValueResolverTest.java
index c9c76fb,64cb024..6e57c84
--- a/core/src/test/java/org/apache/brooklyn/util/core/task/ValueResolverTest.java
+++ b/core/src/test/java/org/apache/brooklyn/util/core/task/ValueResolverTest.java
@@@ -286,15 -274,57 +290,57 @@@ public class ValueResolverTest extends
});
}
+ public void testTaskFactoryGetImmediatelyDoesNotBlockWithNestedTasks() {
+ final int NUM_CALLS = 3;
+ final AtomicInteger executingCount = new AtomicInteger();
+ final List<SequentialTask<?>> outerTasks = Lists.newArrayList();
+
+ TaskFactory<Task<?>> taskFactory = new TaskFactory<Task<?>>() {
+ @Override public Task<?> newTask() {
+ SequentialTask<?> result = new SequentialTask<>(ImmutableList.of(new Callable<String>() {
+ public String call() {
+ executingCount.incrementAndGet();
+ try {
+ Time.sleep(Duration.ONE_MINUTE);
+ return "myval";
+ } finally {
+ executingCount.decrementAndGet();
+ }
+ }}));
+ outerTasks.add(result);
+ return result;
+ }
+ };
+ for (int i = 0; i < NUM_CALLS; i++) {
+ Maybe<String> result = Tasks.resolving(taskFactory).as(String.class).context(app).immediately(true).getMaybe();
+ Asserts.assertTrue(result.isAbsent(), "result="+result);
+ }
+ // the call below default times out after 30s while the task above is still running
+ Asserts.succeedsEventually(new Runnable() {
+ public void run() {
+ Asserts.assertEquals(outerTasks.size(), NUM_CALLS);
+ for (Task<?> task : outerTasks) {
+ Asserts.assertTrue(task.isDone());
+ Asserts.assertTrue(task.isCancelled());
+ }
+ }
+ });
+ Asserts.succeedsEventually(new Runnable() {
+ public void run() {
+ Asserts.assertEquals(executingCount.get(), 0);
+ }
+ });
+ }
+
private static class MyImmediateAndDeferredSupplier implements ImmediateSupplier<CallInfo>, DeferredSupplier<CallInfo> {
- private final boolean failImmediately;
+ private final RuntimeException failImmediately;
public MyImmediateAndDeferredSupplier() {
- this(false);
+ this(null);
}
- public MyImmediateAndDeferredSupplier(boolean simulateImmediateUnsupported) {
- this.failImmediately = simulateImmediateUnsupported;
+ public MyImmediateAndDeferredSupplier(RuntimeException failImmediately) {
+ this.failImmediately = failImmediately;
}
@Override