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 2014/11/15 03:37:04 UTC
[1/4] incubator-brooklyn git commit: Cleanup toMetadataRecord,
for usage manager
Repository: incubator-brooklyn
Updated Branches:
refs/heads/master f14331054 -> 2c7223b35
Cleanup toMetadataRecord, for usage manager
- Don’t store entity.id, because usage event already has that.
- Change “64bit” to “is64bit”, because if writing to relational
database the columns don’t want to start with a number.
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/e8b20653
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/e8b20653
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/e8b20653
Branch: refs/heads/master
Commit: e8b2065351b5d321ccfdd183f7f58110b932eaa5
Parents: 6791d51
Author: Aled Sage <al...@gmail.com>
Authored: Fri Nov 14 19:50:56 2014 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Fri Nov 14 19:50:56 2014 +0000
----------------------------------------------------------------------
core/src/main/java/brooklyn/location/basic/AbstractLocation.java | 1 -
.../java/brooklyn/location/jclouds/JcloudsSshMachineLocation.java | 2 +-
2 files changed, 1 insertion(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e8b20653/core/src/main/java/brooklyn/location/basic/AbstractLocation.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/location/basic/AbstractLocation.java b/core/src/main/java/brooklyn/location/basic/AbstractLocation.java
index f652f8a..e81a6fc 100644
--- a/core/src/main/java/brooklyn/location/basic/AbstractLocation.java
+++ b/core/src/main/java/brooklyn/location/basic/AbstractLocation.java
@@ -568,7 +568,6 @@ public abstract class AbstractLocation extends AbstractBrooklynObject implements
@Override
public Map<String, String> toMetadataRecord() {
ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
- builder.put("id", getId());
if (getDisplayName() != null) builder.put("displayName", getDisplayName());
return builder.build();
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e8b20653/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsSshMachineLocation.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsSshMachineLocation.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsSshMachineLocation.java
index e0ceffc..56d863e 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsSshMachineLocation.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsSshMachineLocation.java
@@ -322,7 +322,7 @@ public class JcloudsSshMachineLocation extends SshMachineLocation implements Has
OsDetails osDetails = getOsDetails();
putIfNotNull(builder, "osName", osDetails.getName());
putIfNotNull(builder, "osArch", osDetails.getArch());
- putIfNotNull(builder, "64bit", osDetails.is64bit() ? "true" : "false");
+ putIfNotNull(builder, "is64bit", osDetails.is64bit() ? "true" : "false");
} catch (Exception e) {
Exceptions.propagateIfFatal(e);
LOG.warn("Unable to get OS Details for "+node+"; continuing", e);
[3/4] incubator-brooklyn git commit: LocationEvent/UsageEvent
hashCode+equals
Posted by he...@apache.org.
LocationEvent/UsageEvent hashCode+equals
- Useful for tests.
- As is constructor that takes Date.
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/bf79f85b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/bf79f85b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/bf79f85b
Branch: refs/heads/master
Commit: bf79f85b9b11e950861385ff93db40119c42931b
Parents: ac1ffa7
Author: Aled Sage <al...@gmail.com>
Authored: Fri Nov 14 19:53:13 2014 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Fri Nov 14 19:53:13 2014 +0000
----------------------------------------------------------------------
.../management/usage/ApplicationUsage.java | 18 +++++++++++++++++-
.../management/usage/LocationUsage.java | 20 +++++++++++++++++++-
2 files changed, 36 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/bf79f85b/core/src/main/java/brooklyn/management/usage/ApplicationUsage.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/usage/ApplicationUsage.java b/core/src/main/java/brooklyn/management/usage/ApplicationUsage.java
index cf72791..3dd30f4 100644
--- a/core/src/main/java/brooklyn/management/usage/ApplicationUsage.java
+++ b/core/src/main/java/brooklyn/management/usage/ApplicationUsage.java
@@ -40,7 +40,11 @@ public class ApplicationUsage {
private final Lifecycle state;
public ApplicationEvent(Lifecycle state) {
- this.date = new Date();
+ this(new Date(), state);
+ }
+
+ public ApplicationEvent(Date date, Lifecycle state) {
+ this.date = checkNotNull(date, "date");
this.state = checkNotNull(state, "state");
}
@@ -53,6 +57,18 @@ public class ApplicationUsage {
}
@Override
+ public boolean equals(Object other) {
+ if (!(other instanceof ApplicationEvent)) return false;
+ ApplicationEvent o = (ApplicationEvent) other;
+ return Objects.equal(date, o.date) && Objects.equal(state, o.state);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(date, state);
+ }
+
+ @Override
public String toString() {
return Objects.toStringHelper(this).add("date", date).add("state", state).toString();
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/bf79f85b/core/src/main/java/brooklyn/management/usage/LocationUsage.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/usage/LocationUsage.java b/core/src/main/java/brooklyn/management/usage/LocationUsage.java
index f04055e..a8323d2 100644
--- a/core/src/main/java/brooklyn/management/usage/LocationUsage.java
+++ b/core/src/main/java/brooklyn/management/usage/LocationUsage.java
@@ -43,7 +43,11 @@ public class LocationUsage {
private final String applicationId;
public LocationEvent(Lifecycle state, String entityId, String entityType, String applicationId) {
- this.date = new Date();
+ this(new Date(), state, entityId, entityType, applicationId);
+ }
+
+ public LocationEvent(Date date, Lifecycle state, String entityId, String entityType, String applicationId) {
+ this.date = checkNotNull(date, "date");
this.state = checkNotNull(state, "state");
this.entityId = checkNotNull(entityId, "entityId");
this.entityType = checkNotNull(entityType, "entityType");
@@ -71,6 +75,20 @@ public class LocationUsage {
}
@Override
+ public boolean equals(Object other) {
+ if (!(other instanceof LocationEvent)) return false;
+ LocationEvent o = (LocationEvent) other;
+ return Objects.equal(date, o.date) && Objects.equal(state, o.state)
+ && Objects.equal(entityId, o.entityId) && Objects.equal(entityType, o.entityType)
+ && Objects.equal(applicationId, o.applicationId);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(date, state, entityId, entityType, applicationId);
+ }
+
+ @Override
public String toString() {
return Objects.toStringHelper(this).add("date", date).add("state", state).add("entityId", entityId)
.add("appId", applicationId).toString();
[2/4] incubator-brooklyn git commit: Terminate UsageManager (and wait
for usage listeners)
Posted by he...@apache.org.
Terminate UsageManager (and wait for usage listeners)
- also tracks how many uncompleted listener events there are,
and reports this on termination.
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/ac1ffa72
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/ac1ffa72
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/ac1ffa72
Branch: refs/heads/master
Commit: ac1ffa7261ad6cd6a12394df1ee6f1856c4edb4f
Parents: e8b2065
Author: Aled Sage <al...@gmail.com>
Authored: Fri Nov 14 19:52:36 2014 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Fri Nov 14 19:52:36 2014 +0000
----------------------------------------------------------------------
.../internal/LocalManagementContext.java | 1 +
.../management/internal/LocalUsageManager.java | 101 ++++++++++++++-----
.../management/internal/UsageManager.java | 7 ++
3 files changed, 86 insertions(+), 23 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ac1ffa72/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java b/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java
index 7841ec9..098e3af 100644
--- a/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java
+++ b/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java
@@ -318,6 +318,7 @@ public class LocalManagementContext extends AbstractManagementContext {
osgiManager.stop();
osgiManager = null;
}
+ if (usageManager != null) usageManager.terminate();
if (execution != null) execution.shutdownNow();
if (gc != null) gc.shutdownNow();
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ac1ffa72/core/src/main/java/brooklyn/management/internal/LocalUsageManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/LocalUsageManager.java b/core/src/main/java/brooklyn/management/internal/LocalUsageManager.java
index 476ea3e..4e7cc98 100644
--- a/core/src/main/java/brooklyn/management/internal/LocalUsageManager.java
+++ b/core/src/main/java/brooklyn/management/internal/LocalUsageManager.java
@@ -20,13 +20,16 @@ package brooklyn.management.internal;
import static com.google.common.base.Preconditions.checkNotNull;
+import java.io.Closeable;
+import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -39,11 +42,13 @@ import brooklyn.internal.storage.BrooklynStorage;
import brooklyn.location.Location;
import brooklyn.location.basic.LocationConfigKeys;
import brooklyn.location.basic.LocationInternal;
+import brooklyn.management.ManagementContextInjectable;
import brooklyn.management.usage.ApplicationUsage;
import brooklyn.management.usage.LocationUsage;
import brooklyn.util.exceptions.Exceptions;
import brooklyn.util.flags.TypeCoercions;
import brooklyn.util.javalang.Reflections;
+import brooklyn.util.time.Duration;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Function;
@@ -51,6 +56,10 @@ import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
public class LocalUsageManager implements UsageManager {
@@ -93,9 +102,11 @@ public class LocalUsageManager implements UsageManager {
private final List<UsageListener> listeners = Lists.newCopyOnWriteArrayList();
- private ExecutorService listenerExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder()
+ private final AtomicInteger listenerQueueSize = new AtomicInteger();
+
+ private ListeningExecutorService listenerExecutor = MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor(new ThreadFactoryBuilder()
.setNameFormat("brooklyn-usagemanager-listener-%d")
- .build());
+ .build()));
public LocalUsageManager(LocalManagementContext managementContext) {
this.managementContext = checkNotNull(managementContext, "managementContext");
@@ -103,11 +114,61 @@ public class LocalUsageManager implements UsageManager {
Collection<UsageListener> listeners = managementContext.getBrooklynProperties().getConfig(UsageManager.USAGE_LISTENERS);
if (listeners != null) {
for (UsageListener listener : listeners) {
+ if (listener instanceof ManagementContextInjectable) {
+ ((ManagementContextInjectable)listener).injectManagementContext(managementContext);
+ }
addUsageListener(listener);
}
}
}
+ public void terminate() {
+ // Wait for the listeners to finish + close the listeners
+ Duration timeout = managementContext.getBrooklynProperties().getConfig(UsageManager.USAGE_LISTENER_TERMINATION_TIMEOUT);
+ if (listenerQueueSize.get() > 0) {
+ log.info("Usage manager waiting for "+listenerQueueSize+" listener events for up to "+timeout);
+ }
+ List<ListenableFuture<?>> futures = Lists.newArrayList();
+ for (final UsageListener listener : listeners) {
+ ListenableFuture<?> future = listenerExecutor.submit(new Runnable() {
+ public void run() {
+ if (listener instanceof Closeable) {
+ try {
+ ((Closeable)listener).close();
+ } catch (IOException e) {
+ log.warn("Problem closing usage listener "+listener+" (continuing)", e);
+ }
+ }
+ }});
+ futures.add(future);
+ }
+ try {
+ Futures.successfulAsList(futures).get(timeout.toMilliseconds(), TimeUnit.MILLISECONDS);
+ } catch (Exception e) {
+ Exceptions.propagateIfFatal(e);
+ log.warn("Problem terminiating usage listeners (continuing)", e);
+ } finally {
+ listenerExecutor.shutdownNow();
+ }
+ }
+
+ private void execOnListeners(final Function<UsageListener, Void> job) {
+ for (final UsageListener listener : listeners) {
+ listenerQueueSize.incrementAndGet();
+ listenerExecutor.execute(new Runnable() {
+ public void run() {
+ try {
+ job.apply(listener);
+ } catch (RuntimeException e) {
+ log.error("Problem notifying listener "+listener+" of "+job, e);
+ Exceptions.propagateIfFatal(e);
+ } finally {
+ listenerQueueSize.decrementAndGet();
+ }
+ }});
+ }
+ }
+
@Override
public void recordApplicationEvent(final Application app, final Lifecycle state) {
log.debug("Storing application lifecycle usage event: application {} in state {}", new Object[] {app, state});
@@ -121,17 +182,14 @@ public class LocalUsageManager implements UsageManager {
usage.addEvent(event);
eventMap.put(app.getId(), usage);
- for (final UsageListener listener : listeners) {
- listenerExecutor.execute(new Runnable() {
- public void run() {
- try {
- listener.onApplicationEvent(app.getId(), app.getDisplayName(), app.getEntityType().getName(), ((EntityInternal)app).toMetadataRecord(), event);
- } catch (Exception e) {
- log.error("Problem notifying listener "+listener+" of applicationEvent("+app+", "+state+")", e);
- Exceptions.propagateIfFatal(e);
- }
+ execOnListeners(new Function<UsageListener, Void>() {
+ public Void apply(UsageListener listener) {
+ listener.onApplicationEvent(app.getId(), app.getDisplayName(), app.getEntityType().getName(), ((EntityInternal)app).toMetadataRecord(), event);
+ return null;
+ }
+ public String toString() {
+ return "applicationEvent("+app+", "+state+")";
}});
- }
}
}
@@ -181,17 +239,14 @@ public class LocalUsageManager implements UsageManager {
usage.addEvent(event);
usageMap.put(loc.getId(), usage);
- for (final UsageListener listener : listeners) {
- listenerExecutor.execute(new Runnable() {
- public void run() {
- try {
- listener.onLocationEvent(loc.getId(), ((LocationInternal)loc).toMetadataRecord(), event);
- } catch (Exception e) {
- log.error("Problem notifying listener "+listener+" of locationEvent("+loc+", "+state+")", e);
- Exceptions.propagateIfFatal(e);
- }
+ execOnListeners(new Function<UsageListener, Void>() {
+ public Void apply(UsageListener listener) {
+ listener.onLocationEvent(loc.getId(), ((LocationInternal)loc).toMetadataRecord(), event);
+ return null;
+ }
+ public String toString() {
+ return "locationEvent("+loc+", "+state+")";
}});
- }
}
} else {
// normal for high-level locations
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ac1ffa72/core/src/main/java/brooklyn/management/internal/UsageManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/UsageManager.java b/core/src/main/java/brooklyn/management/internal/UsageManager.java
index 56a5ace..450a73b 100644
--- a/core/src/main/java/brooklyn/management/internal/UsageManager.java
+++ b/core/src/main/java/brooklyn/management/internal/UsageManager.java
@@ -31,6 +31,7 @@ import brooklyn.management.usage.ApplicationUsage;
import brooklyn.management.usage.ApplicationUsage.ApplicationEvent;
import brooklyn.management.usage.LocationUsage;
import brooklyn.management.usage.LocationUsage.LocationEvent;
+import brooklyn.util.time.Duration;
import com.google.common.annotations.Beta;
import com.google.common.base.Predicate;
@@ -45,6 +46,12 @@ public interface UsageManager {
new TypeToken<List<UsageListener>>() {},
"brooklyn.usageManager.listeners", "Optional usage listeners (i.e. for metering)",
ImmutableList.<UsageListener>of());
+
+ public static final ConfigKey<Duration> USAGE_LISTENER_TERMINATION_TIMEOUT = ConfigKeys.newConfigKey(
+ Duration.class,
+ "brooklyn.usageManager.listeners.timeout",
+ "Timeout on termination, to wait for queue of usage listener events to be processed",
+ Duration.TEN_SECONDS);
public interface UsageListener {
public static final UsageListener NOOP = new UsageListener() {
[4/4] incubator-brooklyn git commit: This closes #330
Posted by he...@apache.org.
This closes #330
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/2c7223b3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/2c7223b3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/2c7223b3
Branch: refs/heads/master
Commit: 2c7223b3577b6c592ee0aa420c2dbfc1ca88cb77
Parents: f143310 bf79f85
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Sat Nov 15 02:31:35 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Sat Nov 15 02:31:35 2014 +0000
----------------------------------------------------------------------
.../location/basic/AbstractLocation.java | 1 -
.../internal/LocalManagementContext.java | 1 +
.../management/internal/LocalUsageManager.java | 101 ++++++++++++++-----
.../management/internal/UsageManager.java | 7 ++
.../management/usage/ApplicationUsage.java | 18 +++-
.../management/usage/LocationUsage.java | 20 +++-
.../jclouds/JcloudsSshMachineLocation.java | 2 +-
7 files changed, 123 insertions(+), 27 deletions(-)
----------------------------------------------------------------------