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 2015/01/29 18:45:55 UTC
[5/7] incubator-brooklyn git commit: explicitly declare `Map,
?>` in more places
explicitly declare `Map<?,?>` in more places
to prevent some javac's from getting confused about how to call super
(which can cause stack overflow, cf https://github.com/apache/incubator-brooklyn/pull/489 ).
also introduce some help for identifying recursive calls; no longer used in the codebase,
but will be useful if we need to track recursive calls again, and it is tested.
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/11972022
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/11972022
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/11972022
Branch: refs/heads/master
Commit: 119720226bf9fef8cc987d98361189c1dc349d33
Parents: e8a7072
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Jan 29 14:19:03 2015 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Jan 29 17:02:49 2015 +0000
----------------------------------------------------------------------
.../AggregatingMachineProvisioningLocation.java | 2 +-
.../FixedListMachineProvisioningLocation.java | 2 +-
.../LocalhostMachineProvisioningLocation.java | 4 +--
.../location/basic/SshMachineLocation.java | 4 ++-
.../location/jclouds/JcloudsLocation.java | 2 +-
.../util/javalang/StackTraceSimplifier.java | 25 +++++++++++++-
.../util/javalang/StackTraceSimplifierTest.java | 36 +++++++++++++++++++-
7 files changed, 67 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/11972022/core/src/main/java/brooklyn/location/basic/AggregatingMachineProvisioningLocation.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/location/basic/AggregatingMachineProvisioningLocation.java b/core/src/main/java/brooklyn/location/basic/AggregatingMachineProvisioningLocation.java
index dbb52c5..a644459 100644
--- a/core/src/main/java/brooklyn/location/basic/AggregatingMachineProvisioningLocation.java
+++ b/core/src/main/java/brooklyn/location/basic/AggregatingMachineProvisioningLocation.java
@@ -78,7 +78,7 @@ public class AggregatingMachineProvisioningLocation<T extends MachineLocation> e
}
@Override
- public AbstractLocation configure(Map properties) {
+ public AbstractLocation configure(Map<?,?> properties) {
if (lock == null) {
lock = new Object();
provisioners = Lists.<MachineProvisioningLocation<T>>newArrayList();
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/11972022/core/src/main/java/brooklyn/location/basic/FixedListMachineProvisioningLocation.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/location/basic/FixedListMachineProvisioningLocation.java b/core/src/main/java/brooklyn/location/basic/FixedListMachineProvisioningLocation.java
index 263e307..97f1117 100644
--- a/core/src/main/java/brooklyn/location/basic/FixedListMachineProvisioningLocation.java
+++ b/core/src/main/java/brooklyn/location/basic/FixedListMachineProvisioningLocation.java
@@ -121,7 +121,7 @@ implements MachineProvisioningLocation<T>, Closeable {
}
@Override
- public AbstractLocation configure(Map properties) {
+ public AbstractLocation configure(Map<?,?> properties) {
if (machines == null) machines = Sets.newLinkedHashSet();
if (inUse == null) inUse = Sets.newLinkedHashSet();
if (pendingRemoval == null) pendingRemoval = Sets.newLinkedHashSet();
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/11972022/core/src/main/java/brooklyn/location/basic/LocalhostMachineProvisioningLocation.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/location/basic/LocalhostMachineProvisioningLocation.java b/core/src/main/java/brooklyn/location/basic/LocalhostMachineProvisioningLocation.java
index 324f5a0..051b37e 100644
--- a/core/src/main/java/brooklyn/location/basic/LocalhostMachineProvisioningLocation.java
+++ b/core/src/main/java/brooklyn/location/basic/LocalhostMachineProvisioningLocation.java
@@ -122,7 +122,7 @@ public class LocalhostMachineProvisioningLocation extends FixedListMachineProvis
return LocationSpec.create(LocalhostMachineProvisioningLocation.class);
}
- public LocalhostMachineProvisioningLocation configure(Map flags) {
+ public LocalhostMachineProvisioningLocation configure(Map<?,?> flags) {
super.configure(flags);
if (!truth(getDisplayName())) { setDisplayName("localhost"); }
@@ -294,7 +294,7 @@ public class LocalhostMachineProvisioningLocation extends FixedListMachineProvis
}
@Override
- public LocalhostMachine configure(Map properties) {
+ public LocalhostMachine configure(Map<?,?> properties) {
if (address==null || !properties.containsKey("address"))
address = Networking.getLocalHost();
super.configure(properties);
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/11972022/core/src/main/java/brooklyn/location/basic/SshMachineLocation.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/location/basic/SshMachineLocation.java b/core/src/main/java/brooklyn/location/basic/SshMachineLocation.java
index 2b7d8b1..4a165f2 100644
--- a/core/src/main/java/brooklyn/location/basic/SshMachineLocation.java
+++ b/core/src/main/java/brooklyn/location/basic/SshMachineLocation.java
@@ -35,6 +35,7 @@ import java.io.StringReader;
import java.net.InetAddress;
import java.net.Socket;
import java.security.KeyPair;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -77,6 +78,7 @@ import brooklyn.util.internal.ssh.ShellTool;
import brooklyn.util.internal.ssh.SshException;
import brooklyn.util.internal.ssh.SshTool;
import brooklyn.util.internal.ssh.sshj.SshjTool;
+import brooklyn.util.javalang.StackTraceSimplifier;
import brooklyn.util.mutex.MutexSupport;
import brooklyn.util.mutex.WithMutexes;
import brooklyn.util.net.Urls;
@@ -334,7 +336,7 @@ public class SshMachineLocation extends AbstractLocation implements MachineLocat
}
@Override
- public SshMachineLocation configure(Map properties) {
+ public SshMachineLocation configure(Map<?,?> properties) {
super.configure(properties);
// TODO Note that check for addresss!=null is done automatically in super-constructor, in FlagUtils.checkRequiredFields
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/11972022/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
index cafe1c7..b10973d 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
@@ -221,7 +221,7 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
}
@Override
- public JcloudsLocation configure(Map properties) {
+ public JcloudsLocation configure(Map<?,?> properties) {
super.configure(properties);
if (getLocalConfigBag().containsKey("providerLocationId")) {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/11972022/utils/common/src/main/java/brooklyn/util/javalang/StackTraceSimplifier.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/brooklyn/util/javalang/StackTraceSimplifier.java b/utils/common/src/main/java/brooklyn/util/javalang/StackTraceSimplifier.java
index 2247136..283cb98 100644
--- a/utils/common/src/main/java/brooklyn/util/javalang/StackTraceSimplifier.java
+++ b/utils/common/src/main/java/brooklyn/util/javalang/StackTraceSimplifier.java
@@ -22,6 +22,7 @@ import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@@ -30,6 +31,7 @@ import org.slf4j.LoggerFactory;
import brooklyn.util.text.Strings;
+import com.google.common.annotations.Beta;
import com.google.common.collect.ImmutableSet;
/**
@@ -176,5 +178,26 @@ public class StackTraceSimplifier {
t.printStackTrace(pw);
return sw.getBuffer().toString();
}
-
+
+ /** returns the number of times the calling method occurs elsewhere in the stack trace;
+ * 0 if no recursion, 1 if it has cycled three times, etc. */
+ @Beta // useful to track down things like https://github.com/apache/incubator-brooklyn/pull/489
+ public static int getRecursiveCallCount() {
+ StackTraceElement[] t = cleanStackTrace(new Throwable().getStackTrace());
+ Iterator<StackTraceElement> ti = Arrays.asList(t).iterator();
+ ti.next();
+ if (!ti.hasNext()) return 0;
+ // t0 is the caller
+ StackTraceElement t0 = ti.next();
+ String l0 = t0.getClassName()+"."+t0.getMethodName()+"("+t0.getFileName()+")";
+ int count = 0;
+ while (ti.hasNext()) {
+ StackTraceElement ta = ti.next();
+ String li = ta.getClassName()+"."+ta.getMethodName()+"("+ta.getFileName()+")";
+ // if we have something in a different method, then something back in the method
+ // from which the recursive check came, then return true
+ if (li.equals(l0)) count++;
+ }
+ return count;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/11972022/utils/common/src/test/java/brooklyn/util/javalang/StackTraceSimplifierTest.java
----------------------------------------------------------------------
diff --git a/utils/common/src/test/java/brooklyn/util/javalang/StackTraceSimplifierTest.java b/utils/common/src/test/java/brooklyn/util/javalang/StackTraceSimplifierTest.java
index 3ed7c2b..1c3c5ca 100644
--- a/utils/common/src/test/java/brooklyn/util/javalang/StackTraceSimplifierTest.java
+++ b/utils/common/src/test/java/brooklyn/util/javalang/StackTraceSimplifierTest.java
@@ -21,6 +21,8 @@ package brooklyn.util.javalang;
import org.testng.Assert;
import org.testng.annotations.Test;
+import brooklyn.util.exceptions.Exceptions;
+
public class StackTraceSimplifierTest {
@Test
@@ -44,5 +46,37 @@ public class StackTraceSimplifierTest {
Assert.assertTrue(t.getStackTrace()[0].getClassName().startsWith("org.testng"),
"trace was: "+t.getStackTrace()[0]);
}
-
+
+ private int m1(int x) {
+ int count = StackTraceSimplifier.getRecursiveCallCount();
+ if (count>100) throw new RuntimeException("expected");
+ if (x<=0) {
+ return count;
+ }
+ return m2(x-1);
+ }
+ private int m2(int x) {
+ if (x<=0) return -1;
+ return m1(x-1);
+ }
+ @Test
+ public void testIsRecursiveCallToSelf() {
+ Assert.assertEquals(m1(1), -1);
+ Assert.assertEquals(m2(1), 0);
+ Assert.assertEquals(m1(2), 1);
+ Assert.assertEquals(m2(2), -1);
+ Assert.assertEquals(m1(3), -1);
+ Assert.assertEquals(m1(4), 2);
+ Assert.assertEquals(m1(20), 10);
+
+ try {
+ m1(500);
+ Assert.fail("should have failed on recursive call");
+ } catch (Exception e) {
+ Exceptions.propagateIfFatal(e);
+ if (!e.getMessage().equals("expected"))
+ throw Exceptions.propagate(e);
+ }
+ }
+
}