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(-)
----------------------------------------------------------------------