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/06 11:36:50 UTC
[1/9] git commit: catalog item id in GUI (clickable) and on REST
Repository: incubator-brooklyn
Updated Branches:
refs/heads/master c323b00d3 -> 04ce06b97
catalog item id in GUI (clickable) and on REST
in REST API for EntitySummary and PolicySummary,
and in summary tab on GUI when available;
also better spacing and suppressing of absent/redundant information in entity-summary page
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/e9c8c5ef
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/e9c8c5ef
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/e9c8c5ef
Branch: refs/heads/master
Commit: e9c8c5efbfb3d862e776931a96b8b7e0a1847196
Parents: d563652
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Tue Nov 4 17:59:20 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Tue Nov 4 18:01:00 2014 +0000
----------------------------------------------------------------------
usage/jsgui/src/main/webapp/assets/css/base.css | 4 ++++
.../src/main/webapp/assets/js/model/entity-summary.js | 1 +
.../src/main/webapp/assets/js/view/entity-summary.js | 4 ++++
.../src/main/webapp/assets/tpl/apps/summary.html | 4 ++++
.../webapp/assets/tpl/catalog/details-entity.html | 8 ++++++--
.../src/main/java/brooklyn/rest/api/ServerApi.java | 4 ++--
.../main/java/brooklyn/rest/domain/EntitySummary.java | 14 ++++++++++++++
.../main/java/brooklyn/rest/domain/PolicySummary.java | 11 +++++++++++
.../java/brooklyn/rest/domain/EntitySummaryTest.java | 2 +-
.../java/brooklyn/rest/resources/EntityResource.java | 1 +
.../brooklyn/rest/transform/EntityTransformer.java | 2 +-
.../brooklyn/rest/transform/PolicyTransformer.java | 2 +-
12 files changed, 50 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e9c8c5ef/usage/jsgui/src/main/webapp/assets/css/base.css
----------------------------------------------------------------------
diff --git a/usage/jsgui/src/main/webapp/assets/css/base.css b/usage/jsgui/src/main/webapp/assets/css/base.css
index 6aebb7e..c567ecb 100644
--- a/usage/jsgui/src/main/webapp/assets/css/base.css
+++ b/usage/jsgui/src/main/webapp/assets/css/base.css
@@ -1432,3 +1432,7 @@ textarea.param-value {
height: 18px;
overflow: auto;
}
+
+#catalog-details-accordion {
+ margin-top: 12px;
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e9c8c5ef/usage/jsgui/src/main/webapp/assets/js/model/entity-summary.js
----------------------------------------------------------------------
diff --git a/usage/jsgui/src/main/webapp/assets/js/model/entity-summary.js b/usage/jsgui/src/main/webapp/assets/js/model/entity-summary.js
index f5e4d37..d8a3d66 100644
--- a/usage/jsgui/src/main/webapp/assets/js/model/entity-summary.js
+++ b/usage/jsgui/src/main/webapp/assets/js/model/entity-summary.js
@@ -26,6 +26,7 @@ define(["underscore", "backbone"], function (_, Backbone) {
'id':'',
'name':'',
'type':'',
+ 'catalogItemId':'',
'links':{}
}
},
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e9c8c5ef/usage/jsgui/src/main/webapp/assets/js/view/entity-summary.js
----------------------------------------------------------------------
diff --git a/usage/jsgui/src/main/webapp/assets/js/view/entity-summary.js b/usage/jsgui/src/main/webapp/assets/js/view/entity-summary.js
index 3436832..70ca86a 100644
--- a/usage/jsgui/src/main/webapp/assets/js/view/entity-summary.js
+++ b/usage/jsgui/src/main/webapp/assets/js/view/entity-summary.js
@@ -38,6 +38,10 @@ define([
entity:this.model,
application:this.options.application,
}));
+ if (this.model.get('catalogItemId'))
+ this.$("div.catalogItemId").show();
+ else
+ this.$("div.catalogItemId").hide();
this.options.tabView.configView = new EntityConfigView({
model:this.options.model,
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e9c8c5ef/usage/jsgui/src/main/webapp/assets/tpl/apps/summary.html
----------------------------------------------------------------------
diff --git a/usage/jsgui/src/main/webapp/assets/tpl/apps/summary.html b/usage/jsgui/src/main/webapp/assets/tpl/apps/summary.html
index 4a8b4b4..ccd1710 100644
--- a/usage/jsgui/src/main/webapp/assets/tpl/apps/summary.html
+++ b/usage/jsgui/src/main/webapp/assets/tpl/apps/summary.html
@@ -66,6 +66,10 @@ under the License.
<div class="name">ID</div>
<div class="value"><%= entity.get('id') %></div>
</div>
+ <div class="info-name-value catalogItemId hide">
+ <div class="name">Catalog Item</div>
+ <div class="value"><a href="#v1/catalog/entities/<%= entity.get('catalogItemId') %>"><%= entity.get('catalogItemId') %></a></div>
+ </div>
<div class="additional-info-on-problem hide" style="margin-top: 12px;">
</div>
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e9c8c5ef/usage/jsgui/src/main/webapp/assets/tpl/catalog/details-entity.html
----------------------------------------------------------------------
diff --git a/usage/jsgui/src/main/webapp/assets/tpl/catalog/details-entity.html b/usage/jsgui/src/main/webapp/assets/tpl/catalog/details-entity.html
index 133e746..b8bc86f 100644
--- a/usage/jsgui/src/main/webapp/assets/tpl/catalog/details-entity.html
+++ b/usage/jsgui/src/main/webapp/assets/tpl/catalog/details-entity.html
@@ -19,8 +19,12 @@ under the License.
<div class="catalog-details">
<h2><%- model.get("name") %></h2>
- <p><%- model.get("registeredType") %></p>
- <p><%- model.get("description") %></p>
+ <% if (model.get("registeredType") && (model.get("name") != model.get("registeredType"))) { %>
+ <p><%- model.get("registeredType") %></p>
+ <% } %>
+ <% if (model.get("description")) { %>
+ <p><%- model.get("description") %></p>
+ <% } %>
<div id="catalog-details-accordion" class="accordion">
<% if (model.get("planYaml")) { %>
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e9c8c5ef/usage/rest-api/src/main/java/brooklyn/rest/api/ServerApi.java
----------------------------------------------------------------------
diff --git a/usage/rest-api/src/main/java/brooklyn/rest/api/ServerApi.java b/usage/rest-api/src/main/java/brooklyn/rest/api/ServerApi.java
index 5d1ca9b..f77daa4 100644
--- a/usage/rest-api/src/main/java/brooklyn/rest/api/ServerApi.java
+++ b/usage/rest-api/src/main/java/brooklyn/rest/api/ServerApi.java
@@ -74,7 +74,7 @@ public interface ServerApi {
@Deprecated /** @deprecated since 0.7.0 use /ha/node (which returns correct JSON) */
@GET
@Path("/status")
- @ApiOperation(value = "Returns the status of this Brooklyn instance",
+ @ApiOperation(value = "Returns the status of this Brooklyn instance [DEPRECATED; see ../ha/state]",
responseClass = "String",
multiValueResponse = false)
public String getStatus();
@@ -82,7 +82,7 @@ public interface ServerApi {
@Deprecated /** @deprecated since 0.7.0 use /ha/states */
@GET
@Path("/highAvailability")
- @ApiOperation(value = "Returns the status of all Brooklyn instances in the management plane",
+ @ApiOperation(value = "Returns the status of all Brooklyn instances in the management plane [DEPRECATED; see ../ha/states]",
responseClass = "brooklyn.rest.domain.HighAvailabilitySummary")
public HighAvailabilitySummary getHighAvailability();
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e9c8c5ef/usage/rest-api/src/main/java/brooklyn/rest/domain/EntitySummary.java
----------------------------------------------------------------------
diff --git a/usage/rest-api/src/main/java/brooklyn/rest/domain/EntitySummary.java b/usage/rest-api/src/main/java/brooklyn/rest/domain/EntitySummary.java
index 6ec84e5..3118986 100644
--- a/usage/rest-api/src/main/java/brooklyn/rest/domain/EntitySummary.java
+++ b/usage/rest-api/src/main/java/brooklyn/rest/domain/EntitySummary.java
@@ -19,7 +19,10 @@
package brooklyn.rest.domain;
import com.google.common.collect.ImmutableMap;
+
import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
import java.net.URI;
import java.util.Map;
@@ -29,17 +32,21 @@ public class EntitySummary implements HasId, HasName {
private final String id;
private final String name;
private final String type;
+ @JsonSerialize(include=Inclusion.NON_NULL)
+ private final String catalogItemId;
private final Map<String, URI> links;
public EntitySummary(
@JsonProperty("id") String id,
@JsonProperty("name") String name,
@JsonProperty("type") String type,
+ @JsonProperty("catalogItemId") String catalogItemId,
@JsonProperty("links") Map<String, URI> links
) {
this.type = type;
this.id = id;
this.name = name;
+ this.catalogItemId = catalogItemId;
this.links = (links == null) ? ImmutableMap.<String, URI>of() : ImmutableMap.copyOf(links);
}
@@ -57,6 +64,10 @@ public class EntitySummary implements HasId, HasName {
return name;
}
+ public String getCatalogItemId() {
+ return catalogItemId;
+}
+
public Map<String, URI> getLinks() {
return links;
}
@@ -75,6 +86,9 @@ public class EntitySummary implements HasId, HasName {
public String toString() {
return "EntitySummary{" +
"id='" + id + '\'' +
+ ", name=" + name +
+ ", type=" + type +
+ ", catalogItemId=" + catalogItemId +
", links=" + links +
'}';
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e9c8c5ef/usage/rest-api/src/main/java/brooklyn/rest/domain/PolicySummary.java
----------------------------------------------------------------------
diff --git a/usage/rest-api/src/main/java/brooklyn/rest/domain/PolicySummary.java b/usage/rest-api/src/main/java/brooklyn/rest/domain/PolicySummary.java
index 42c670e..cf7df6b 100644
--- a/usage/rest-api/src/main/java/brooklyn/rest/domain/PolicySummary.java
+++ b/usage/rest-api/src/main/java/brooklyn/rest/domain/PolicySummary.java
@@ -21,6 +21,8 @@ package brooklyn.rest.domain;
import com.google.common.collect.ImmutableMap;
import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
import java.net.URI;
import java.util.Map;
@@ -29,17 +31,21 @@ public class PolicySummary implements HasName, HasId {
private final String id;
private final String name;
+ @JsonSerialize(include=Inclusion.NON_NULL)
+ private final String catalogItemId;
private final Status state;
private final Map<String, URI> links;
public PolicySummary(
@JsonProperty("id") String id,
@JsonProperty("name") String name,
+ @JsonProperty("catalogItemId") String catalogItemId,
@JsonProperty("state") Status state,
@JsonProperty("links") Map<String, URI> links
) {
this.id = id;
this.name = name;
+ this.catalogItemId = catalogItemId;
this.state = state;
this.links = (links == null) ? ImmutableMap.<String, URI>of() : ImmutableMap.copyOf(links);
}
@@ -54,6 +60,10 @@ public class PolicySummary implements HasName, HasId {
return name;
}
+ public String getCatalogItemId() {
+ return catalogItemId;
+ }
+
public Status getState() {
return state;
}
@@ -89,6 +99,7 @@ public class PolicySummary implements HasName, HasId {
return "ConfigSummary{" +
"name='" + name + '\'' +
", id='" + id + '\'' +
+ ", catalogItemId='" + catalogItemId + '\'' +
", links=" + links +
'}';
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e9c8c5ef/usage/rest-api/src/test/java/brooklyn/rest/domain/EntitySummaryTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-api/src/test/java/brooklyn/rest/domain/EntitySummaryTest.java b/usage/rest-api/src/test/java/brooklyn/rest/domain/EntitySummaryTest.java
index 393bc3e..242be13 100644
--- a/usage/rest-api/src/test/java/brooklyn/rest/domain/EntitySummaryTest.java
+++ b/usage/rest-api/src/test/java/brooklyn/rest/domain/EntitySummaryTest.java
@@ -46,7 +46,7 @@ public class EntitySummaryTest {
}
static final EntitySummary entitySummary = new EntitySummary(
- "zQsqdXzi", "MyTomcat", "brooklyn.entity.webapp.tomcat.TomcatServer", links);
+ "zQsqdXzi", "MyTomcat", "brooklyn.entity.webapp.tomcat.TomcatServer", null, links);
@Test
public void testSerializeToJSON() throws IOException {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e9c8c5ef/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityResource.java b/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityResource.java
index cfbbac6..caa26c6 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityResource.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityResource.java
@@ -212,6 +212,7 @@ public class EntityResource extends AbstractBrooklynRestResource implements Enti
return result;
}
+ @Override
public String getSpec(String applicationToken, String entityToken) {
EntityLocal entity = brooklyn().getEntity(applicationToken, entityToken);
NamedStringTag spec = BrooklynTags.findFirst(BrooklynTags.YAML_SPEC_KIND, entity.tags().getTags());
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e9c8c5ef/usage/rest-server/src/main/java/brooklyn/rest/transform/EntityTransformer.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/transform/EntityTransformer.java b/usage/rest-server/src/main/java/brooklyn/rest/transform/EntityTransformer.java
index 9b717c9..0d2a64f 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/transform/EntityTransformer.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/transform/EntityTransformer.java
@@ -78,7 +78,7 @@ public class EntityTransformer {
if (entity.getIconUrl()!=null)
lb.put("iconUrl", URI.create(entityUri + "/icon"));
- return new EntitySummary(entity.getId(), entity.getDisplayName(), type, lb.build());
+ return new EntitySummary(entity.getId(), entity.getDisplayName(), type, entity.getCatalogItemId(), lb.build());
}
public static List<EntitySummary> entitySummaries(Iterable<? extends Entity> entities) {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e9c8c5ef/usage/rest-server/src/main/java/brooklyn/rest/transform/PolicyTransformer.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/transform/PolicyTransformer.java b/usage/rest-server/src/main/java/brooklyn/rest/transform/PolicyTransformer.java
index e15c97f..0d9d9f0 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/transform/PolicyTransformer.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/transform/PolicyTransformer.java
@@ -54,7 +54,7 @@ public class PolicyTransformer {
.put("entity", URI.create(entityUri))
.build();
- return new PolicySummary(policy.getId(), policy.getDisplayName(), ApplicationTransformer.statusFromLifecycle(Policies.getPolicyStatus(policy)), links);
+ return new PolicySummary(policy.getId(), policy.getDisplayName(), policy.getCatalogItemId(), ApplicationTransformer.statusFromLifecycle(Policies.getPolicyStatus(policy)), links);
}
public static PolicyConfigSummary policyConfigSummary(BrooklynRestResourceUtils utils, ApplicationSummary application, EntityLocal entity, Policy policy, ConfigKey<?> config) {
[5/9] git commit: optimize rebind process
Posted by he...@apache.org.
optimize rebind process
remove extraneous obj store lists+reads from process, and a bunch of code/redundancy tidy, and a bit more log tidy
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/be5aac25
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/be5aac25
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/be5aac25
Branch: refs/heads/master
Commit: be5aac2574227c4089e8a8fa45f275a4539368f8
Parents: 2815011
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Nov 6 02:01:31 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Nov 6 02:42:20 2014 +0000
----------------------------------------------------------------------
.../entity/rebind/BrooklynObjectType.java | 28 +-
.../mementos/BrooklynMementoPersister.java | 35 ++-
.../mementos/BrooklynMementoRawData.java | 43 +++
.../rebind/PeriodicDeltaChangeListener.java | 4 +-
.../entity/rebind/PersisterDeltaImpl.java | 31 ++
.../rebind/RebindExceptionHandlerImpl.java | 6 +-
.../entity/rebind/RebindManagerImpl.java | 5 +-
.../rebind/dto/BrooklynMementoManifestImpl.java | 15 +
.../AbstractBrooklynMementoPersister.java | 18 +-
.../BrooklynMementoPersisterInMemory.java | 5 +-
.../BrooklynMementoPersisterToMultiFile.java | 16 +
.../BrooklynMementoPersisterToObjectStore.java | 292 ++++++++-----------
.../ha/HighAvailabilityManagerImpl.java | 10 +-
.../entity/rebind/RebindFailuresTest.java | 3 +-
.../entity/rebind/RebindTestFixture.java | 2 +-
.../rebind/RecordingRebindExceptionHandler.java | 6 +-
.../BrooklynMementoPersisterTestFixture.java | 2 +-
17 files changed, 325 insertions(+), 196 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/be5aac25/api/src/main/java/brooklyn/entity/rebind/BrooklynObjectType.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/entity/rebind/BrooklynObjectType.java b/api/src/main/java/brooklyn/entity/rebind/BrooklynObjectType.java
index d887ffe..b00d3b3 100644
--- a/api/src/main/java/brooklyn/entity/rebind/BrooklynObjectType.java
+++ b/api/src/main/java/brooklyn/entity/rebind/BrooklynObjectType.java
@@ -19,14 +19,28 @@
package brooklyn.entity.rebind;
import com.google.common.annotations.Beta;
+import com.google.common.base.CaseFormat;
@Beta
public enum BrooklynObjectType {
- ENTITY,
- LOCATION,
- POLICY,
- ENRICHER,
- FEED,
- CATALOG_ITEM,
- UNKNOWN;
+ ENTITY("entities"),
+ LOCATION("locations"),
+ POLICY("policies"),
+ ENRICHER("enrichers"),
+ FEED("feeds"),
+ CATALOG_ITEM("catalog"),
+ UNKNOWN("unknown");
+
+ private final String subPathName;
+
+ BrooklynObjectType(String subPathName) {
+ this.subPathName = subPathName;
+ }
+ public String toCamelCase() {
+ return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, this.name());
+ }
+
+ public String getSubPathName() {
+ return subPathName;
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/be5aac25/api/src/main/java/brooklyn/mementos/BrooklynMementoPersister.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/mementos/BrooklynMementoPersister.java b/api/src/main/java/brooklyn/mementos/BrooklynMementoPersister.java
index 0317059..229c7c3 100644
--- a/api/src/main/java/brooklyn/mementos/BrooklynMementoPersister.java
+++ b/api/src/main/java/brooklyn/mementos/BrooklynMementoPersister.java
@@ -23,9 +23,13 @@ import java.util.Collection;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
+import javax.annotation.Nullable;
+
+import brooklyn.basic.BrooklynObject;
import brooklyn.catalog.CatalogItem;
import brooklyn.entity.Entity;
import brooklyn.entity.Feed;
+import brooklyn.entity.rebind.BrooklynObjectType;
import brooklyn.entity.rebind.PersistenceExceptionHandler;
import brooklyn.entity.rebind.RebindExceptionHandler;
import brooklyn.entity.rebind.RebindManager;
@@ -52,13 +56,37 @@ public interface BrooklynMementoPersister {
Feed lookupFeed(String id);
CatalogItem<?, ?> lookupCatalogItem(String id);
}
+
+ /**
+ * Loads raw data contents of the mementos.
+ * <p>
+ * Some classes (esp deprecated ones) may return null here,
+ * meaning that the {@link #loadMementoManifest(BrooklynMementoRawData, RebindExceptionHandler)}
+ * and {@link #loadMemento(BrooklynMementoRawData, LookupContext, RebindExceptionHandler)} methods
+ * will populate the raw data via another source.
+ */
+ BrooklynMementoRawData loadMementoRawData(RebindExceptionHandler exceptionHandler);
+ /** @deprecated since 0.7.0 use {@link #loadMementoManifest(BrooklynMementoRawData, RebindExceptionHandler)} */
BrooklynMementoManifest loadMementoManifest(RebindExceptionHandler exceptionHandler) throws IOException;
-
+
/**
- * Note that this method is *not* thread safe.
+ * Loads minimal manifest information (almost entirely *not* deserialized).
+ * Implementations should load the raw data if {@link BrooklynMementoRawData} is not supplied,
+ * but callers are encouraged to supply that for optimal performance.
*/
+ BrooklynMementoManifest loadMementoManifest(@Nullable BrooklynMementoRawData mementoData, RebindExceptionHandler exceptionHandler) throws IOException;
+
+ /** @deprecated since 0.7.0 use {@link #loadMemento(RebindExceptionHandler)} */
BrooklynMemento loadMemento(LookupContext lookupContext, RebindExceptionHandler exceptionHandler) throws IOException;
+ /**
+ * Retrieves the memento class, containing deserialized objects (but not the {@link BrooklynObject} class).
+ * Implementations should load the raw data if {@link BrooklynMementoRawData} is not supplied,
+ * but callers are encouraged to supply that for optimal performance.
+ * <p>
+ * Note that this method is *not* thread safe.
+ */
+ BrooklynMemento loadMemento(@Nullable BrooklynMementoRawData mementoData, LookupContext lookupContext, RebindExceptionHandler exceptionHandler) throws IOException;
void checkpoint(BrooklynMemento memento, PersistenceExceptionHandler exceptionHandler);
@@ -94,6 +122,9 @@ public interface BrooklynMementoPersister {
Collection<String> removedEnricherIds();
Collection<String> removedFeedIds();
Collection<String> removedCatalogItemIds();
+
+ Collection<? extends Memento> getObjectsOfType(BrooklynObjectType type);
+ Collection<String> getRemovedObjectsOfType(BrooklynObjectType type);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/be5aac25/api/src/main/java/brooklyn/mementos/BrooklynMementoRawData.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/mementos/BrooklynMementoRawData.java b/api/src/main/java/brooklyn/mementos/BrooklynMementoRawData.java
index abb61d4..32c7232 100644
--- a/api/src/main/java/brooklyn/mementos/BrooklynMementoRawData.java
+++ b/api/src/main/java/brooklyn/mementos/BrooklynMementoRawData.java
@@ -21,6 +21,8 @@ package brooklyn.mementos;
import java.util.Collections;
import java.util.Map;
+import brooklyn.entity.rebind.BrooklynObjectType;
+
import com.google.common.annotations.Beta;
import com.google.common.collect.Maps;
@@ -85,6 +87,34 @@ public class BrooklynMementoRawData {
public Builder catalogItems(Map<String, String> vals) {
catalogItems.putAll(vals); return this;
}
+
+ public Builder put(BrooklynObjectType type, String id, String val) {
+ switch (type) {
+ case ENTITY: return entity(id, val);
+ case LOCATION: return location(id, val);
+ case POLICY: return policy(id, val);
+ case ENRICHER: return enricher(id, val);
+ case FEED: return feed(id, val);
+ case CATALOG_ITEM: return catalogItem(id, val);
+ case UNKNOWN:
+ default:
+ throw new IllegalArgumentException(type+" not supported");
+ }
+ }
+ public Builder putAll(BrooklynObjectType type, Map<String,String> vals) {
+ switch (type) {
+ case ENTITY: return entities(vals);
+ case LOCATION: return locations(vals);
+ case POLICY: return policies(vals);
+ case ENRICHER: return enrichers(vals);
+ case FEED: return feeds(vals);
+ case CATALOG_ITEM: return catalogItems(vals);
+ case UNKNOWN:
+ default:
+ throw new IllegalArgumentException(type+" not supported");
+ }
+ }
+
public BrooklynMementoRawData build() {
return new BrooklynMementoRawData(this);
}
@@ -133,4 +163,17 @@ public class BrooklynMementoRawData {
public boolean isEmpty() {
return entities.isEmpty() && locations.isEmpty() && policies.isEmpty() && enrichers.isEmpty() && feeds.isEmpty() && catalogItems.isEmpty();
}
+
+ public Map<String, String> getObjectsOfType(BrooklynObjectType type) {
+ switch (type) {
+ case ENTITY: return getEntities();
+ case LOCATION: return getLocations();
+ case POLICY: return getPolicies();
+ case ENRICHER: return getEnrichers();
+ case FEED: return getFeeds();
+ case CATALOG_ITEM: return getCatalogItems();
+ default:
+ throw new IllegalArgumentException("Type "+type+" not supported");
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/be5aac25/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java b/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
index 1696767..b104365 100644
--- a/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
+++ b/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
@@ -323,7 +323,7 @@ public class PeriodicDeltaChangeListener implements ChangeListener {
deltaCollector = new DeltaCollector();
}
- if (LOG.isDebugEnabled()) LOG.debug("Persister delta as reported: "
+ if (LOG.isDebugEnabled()) LOG.debug("Checkpointing delta of memento: "
+ "updating entities={}, locations={}, policies={}, enrichers={}, catalog items={}; "
+ "removing entities={}, locations={}, policies={}, enrichers={}, catalog items={}",
new Object[] {
@@ -332,7 +332,7 @@ public class PeriodicDeltaChangeListener implements ChangeListener {
addReferencedObjects(prevDeltaCollector);
- if (LOG.isTraceEnabled()) LOG.trace("Persister delta with references: "
+ if (LOG.isTraceEnabled()) LOG.trace("Checkpointing delta of memento with references: "
+ "updating {} entities, {} locations, {} policies, {} enrichers, {} catalog items; "
+ "removing {} entities, {} locations, {} policies, {} enrichers, {} catalog items",
new Object[] {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/be5aac25/core/src/main/java/brooklyn/entity/rebind/PersisterDeltaImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/PersisterDeltaImpl.java b/core/src/main/java/brooklyn/entity/rebind/PersisterDeltaImpl.java
index fd19ebc..c971a2f 100644
--- a/core/src/main/java/brooklyn/entity/rebind/PersisterDeltaImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/PersisterDeltaImpl.java
@@ -26,6 +26,7 @@ import brooklyn.mementos.EnricherMemento;
import brooklyn.mementos.EntityMemento;
import brooklyn.mementos.FeedMemento;
import brooklyn.mementos.LocationMemento;
+import brooklyn.mementos.Memento;
import brooklyn.mementos.PolicyMemento;
import com.google.common.collect.Sets;
@@ -164,4 +165,34 @@ public class PersisterDeltaImpl implements Delta {
public Collection<String> removedCatalogItemIds() {
return removedCatalogItemIds;
}
+
+ @Override
+ public Collection<? extends Memento> getObjectsOfType(BrooklynObjectType type) {
+ switch (type) {
+ case ENTITY: return entities();
+ case LOCATION: return locations();
+ case POLICY: return policies();
+ case ENRICHER: return enrichers();
+ case FEED: return feeds();
+ case CATALOG_ITEM: return catalogItems();
+ case UNKNOWN:
+ default:
+ throw new IllegalArgumentException(type+" not supported");
+ }
+ }
+
+ @Override
+ public Collection<String> getRemovedObjectsOfType(BrooklynObjectType type) {
+ switch (type) {
+ case ENTITY: return removedEntityIds();
+ case LOCATION: return removedLocationIds();
+ case POLICY: return removedPolicyIds();
+ case ENRICHER: return removedEnricherIds();
+ case FEED: return removedFeedIds();
+ case CATALOG_ITEM: return removedCatalogItemIds();
+ case UNKNOWN:
+ default:
+ throw new IllegalArgumentException(type+" not supported");
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/be5aac25/core/src/main/java/brooklyn/entity/rebind/RebindExceptionHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/RebindExceptionHandlerImpl.java b/core/src/main/java/brooklyn/entity/rebind/RebindExceptionHandlerImpl.java
index 870a031..f595e54 100644
--- a/core/src/main/java/brooklyn/entity/rebind/RebindExceptionHandlerImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/RebindExceptionHandlerImpl.java
@@ -222,7 +222,7 @@ public class RebindExceptionHandlerImpl implements RebindExceptionHandler {
if (creationFailedIds.contains(id)) {
// already know about this; ignore
} else {
- String errmsg = type+" '"+id+"' not found";
+ String errmsg = type.toCamelCase()+" '"+id+"' not found";
exceptions.add(new IllegalStateException(errmsg));
onErrorImpl(errmsg);
}
@@ -231,7 +231,7 @@ public class RebindExceptionHandlerImpl implements RebindExceptionHandler {
@Override
public void onRebindFailed(BrooklynObjectType type, BrooklynObject instance, Exception e) {
Exceptions.propagateIfFatal(e);
- String errmsg = "problem rebinding "+type+" "+instance.getId()+" ("+instance+")";
+ String errmsg = "problem rebinding "+type.toCamelCase()+" "+instance.getId()+" ("+instance+")";
switch (type) {
case FEED:
@@ -318,7 +318,7 @@ public class RebindExceptionHandlerImpl implements RebindExceptionHandler {
@Override
public void onManageFailed(BrooklynObjectType type, BrooklynObject instance, Exception e) {
Exceptions.propagateIfFatal(e);
- String errmsg = "problem managing "+type+" "+instance.getId()+" ("+instance+")";
+ String errmsg = "problem managing "+type.toCamelCase()+" "+instance.getId()+" ("+instance+")";
exceptions.add(new IllegalStateException(errmsg, e));
onErrorImpl(errmsg, e);
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/be5aac25/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
index c2b271e..e29d94f 100644
--- a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
@@ -543,7 +543,8 @@ public class RebindManagerImpl implements RebindManager {
LOG.debug("Rebinding ("+mode+", iteration "+readOnlyRebindCount+") from "+getPersister().getBackingStoreDescription()+"...");
- BrooklynMementoManifest mementoManifest = persistenceStoreAccess.loadMementoManifest(exceptionHandler);
+ BrooklynMementoRawData mementoRawData = persistenceStoreAccess.loadMementoRawData(exceptionHandler);
+ BrooklynMementoManifest mementoManifest = persistenceStoreAccess.loadMementoManifest(mementoRawData, exceptionHandler);
boolean isEmpty = mementoManifest.isEmpty();
if (mode!=ManagementNodeState.HOT_STANDBY) {
@@ -670,7 +671,7 @@ public class RebindManagerImpl implements RebindManager {
// PHASE FOUR
//
- BrooklynMemento memento = persistenceStoreAccess.loadMemento(realLookupContext, exceptionHandler);
+ BrooklynMemento memento = persistenceStoreAccess.loadMemento(mementoRawData, realLookupContext, exceptionHandler);
//
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/be5aac25/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoManifestImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoManifestImpl.java b/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoManifestImpl.java
index 2b52003..4850309 100644
--- a/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoManifestImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoManifestImpl.java
@@ -23,6 +23,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Map;
+import brooklyn.entity.rebind.BrooklynObjectType;
import brooklyn.mementos.BrooklynMementoManifest;
import brooklyn.mementos.CatalogItemMemento;
@@ -83,6 +84,20 @@ public class BrooklynMementoManifestImpl implements BrooklynMementoManifest, Ser
catalogItems.put(val.getId(), val); return this;
}
+ public Builder putType(BrooklynObjectType type, String id, String javaType) {
+ switch (type) {
+ case ENTITY: throw new IllegalArgumentException(type.toCamelCase()+" requires additional parameters");
+ case LOCATION: return location(id, javaType);
+ case POLICY: return policy(id, javaType);
+ case ENRICHER: return enricher(id, javaType);
+ case FEED: return feed(id, javaType);
+ case CATALOG_ITEM: throw new IllegalArgumentException(type.toCamelCase()+" requires different parameters");
+ case UNKNOWN:
+ default:
+ throw new IllegalArgumentException(type.toCamelCase()+" not supported");
+ }
+ }
+
public BrooklynMementoManifest build() {
return new BrooklynMementoManifestImpl(this);
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/be5aac25/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java b/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java
index 91baa26..42643ab 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java
@@ -26,6 +26,7 @@ import brooklyn.entity.rebind.dto.MutableBrooklynMemento;
import brooklyn.mementos.BrooklynMemento;
import brooklyn.mementos.BrooklynMementoManifest;
import brooklyn.mementos.BrooklynMementoPersister;
+import brooklyn.mementos.BrooklynMementoRawData;
import brooklyn.mementos.CatalogItemMemento;
import brooklyn.mementos.EnricherMemento;
import brooklyn.mementos.EntityMemento;
@@ -42,13 +43,28 @@ public abstract class AbstractBrooklynMementoPersister implements BrooklynMement
protected volatile MutableBrooklynMemento memento = new MutableBrooklynMemento();
@Override
- public BrooklynMemento loadMemento(LookupContext lookupContext, RebindExceptionHandler exceptionHandler) {
+ public BrooklynMementoRawData loadMementoRawData(RebindExceptionHandler exceptionHandler) {
+ return null;
+ }
+
+ @Override
+ public BrooklynMemento loadMemento(BrooklynMementoRawData mementoData, LookupContext lookupContext, RebindExceptionHandler exceptionHandler) {
// Trusting people not to cast+modify, because the in-memory persister wouldn't be used in production code
return memento;
}
@Override
+ public BrooklynMemento loadMemento(LookupContext lookupContext, RebindExceptionHandler exceptionHandler) {
+ return loadMemento(null, lookupContext, exceptionHandler);
+ }
+
+ @Override
public BrooklynMementoManifest loadMementoManifest(RebindExceptionHandler exceptionHandler) {
+ return loadMementoManifest(null, exceptionHandler);
+ }
+
+ @Override
+ public BrooklynMementoManifest loadMementoManifest(BrooklynMementoRawData mementoData, RebindExceptionHandler exceptionHandler) {
BrooklynMementoManifestImpl.Builder builder = BrooklynMementoManifestImpl.builder();
for (EntityMemento entity : memento.getEntityMementos().values()) {
builder.entity(entity.getId(), entity.getType(), entity.getParent(), entity.getCatalogItemId());
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/be5aac25/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterInMemory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterInMemory.java b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterInMemory.java
index 847dfa7..f4e4fc0 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterInMemory.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterInMemory.java
@@ -42,7 +42,6 @@ import brooklyn.location.Location;
import brooklyn.management.ManagementContext;
import brooklyn.mementos.BrooklynMemento;
import brooklyn.mementos.BrooklynMementoManifest;
-import brooklyn.mementos.BrooklynMementoManifest.EntityMementoManifest;
import brooklyn.policy.Enricher;
import brooklyn.policy.Policy;
import brooklyn.util.collections.MutableList;
@@ -116,7 +115,7 @@ public class BrooklynMementoPersisterInMemory extends AbstractBrooklynMementoPer
.build();
PersistenceExceptionHandler persistenceExceptionHandler = PersistenceExceptionHandlerImpl.builder().build();
persister.checkpoint(memento, persistenceExceptionHandler);
- final BrooklynMementoManifest manifest = persister.loadMementoManifest(rebindExceptionHandler);
+ final BrooklynMementoManifest manifest = persister.loadMementoManifest(null, rebindExceptionHandler);
LookupContext dummyLookupContext = new LookupContext() {
@Override
public ManagementContext lookupManagementContext() {
@@ -181,7 +180,7 @@ public class BrooklynMementoPersisterInMemory extends AbstractBrooklynMementoPer
};
// Not actually reconstituting, because need to use a real lookupContext to reconstitute all the entities
- persister.loadMemento(dummyLookupContext, rebindExceptionHandler);
+ persister.loadMemento(null, dummyLookupContext, rebindExceptionHandler);
} finally {
Os.deleteRecursively(tempDir);
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/be5aac25/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java
index 2d0fe99..392a496 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java
@@ -40,6 +40,7 @@ import brooklyn.entity.rebind.dto.BrooklynMementoManifestImpl;
import brooklyn.mementos.BrooklynMemento;
import brooklyn.mementos.BrooklynMementoManifest;
import brooklyn.mementos.BrooklynMementoPersister;
+import brooklyn.mementos.BrooklynMementoRawData;
import brooklyn.mementos.CatalogItemMemento;
import brooklyn.mementos.EnricherMemento;
import brooklyn.mementos.EntityMemento;
@@ -153,7 +154,17 @@ public class BrooklynMementoPersisterToMultiFile implements BrooklynMementoPersi
}
@Override
+ public BrooklynMementoRawData loadMementoRawData(RebindExceptionHandler exceptionHandler) {
+ return null;
+ }
+
+ @Override
public BrooklynMementoManifest loadMementoManifest(RebindExceptionHandler exceptionHandler) throws IOException {
+ return loadMementoManifest(null, exceptionHandler);
+ }
+
+ @Override
+ public BrooklynMementoManifest loadMementoManifest(BrooklynMementoRawData mementoData, RebindExceptionHandler exceptionHandler) throws IOException {
if (!running) {
throw new IllegalStateException("Persister not running; cannot load memento manifest from "+dir);
}
@@ -251,6 +262,11 @@ public class BrooklynMementoPersisterToMultiFile implements BrooklynMementoPersi
@Override
public BrooklynMemento loadMemento(LookupContext lookupContext, RebindExceptionHandler exceptionHandler) throws IOException {
+ return loadMemento(null, lookupContext, exceptionHandler);
+ }
+
+ @Override
+ public BrooklynMemento loadMemento(BrooklynMementoRawData mementoData, LookupContext lookupContext, RebindExceptionHandler exceptionHandler) throws IOException {
if (!running) {
throw new IllegalStateException("Persister not running; cannot load memento from "+dir);
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/be5aac25/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
index 8faa80f..91b738f 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
@@ -52,12 +52,8 @@ import brooklyn.mementos.BrooklynMementoManifest;
import brooklyn.mementos.BrooklynMementoPersister;
import brooklyn.mementos.BrooklynMementoRawData;
import brooklyn.mementos.CatalogItemMemento;
-import brooklyn.mementos.EnricherMemento;
-import brooklyn.mementos.EntityMemento;
-import brooklyn.mementos.FeedMemento;
-import brooklyn.mementos.LocationMemento;
import brooklyn.mementos.Memento;
-import brooklyn.mementos.PolicyMemento;
+import brooklyn.util.collections.MutableMap;
import brooklyn.util.exceptions.CompoundRuntimeException;
import brooklyn.util.exceptions.Exceptions;
import brooklyn.util.text.Strings;
@@ -67,6 +63,7 @@ import brooklyn.util.xstream.XmlUtil;
import com.google.common.annotations.Beta;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Objects;
import com.google.common.base.Stopwatch;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
@@ -96,6 +93,10 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
"Maximum number of attempts to serialize a memento (e.g. if first attempts fail because of concurrent modifications of an entity)",
5);
+ static final BrooklynObjectType[] PERSISTED_OBJECT_TYPES_IN_ORDER = new BrooklynObjectType[] {
+ BrooklynObjectType.ENTITY, BrooklynObjectType.LOCATION, BrooklynObjectType.POLICY,
+ BrooklynObjectType.ENRICHER, BrooklynObjectType.FEED, BrooklynObjectType.CATALOG_ITEM };
+
private final PersistenceObjectStore objectStore;
private final MementoSerializer<Object> serializer;
@@ -192,46 +193,75 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
}
}
- @Beta
- public BrooklynMementoRawData loadMementoRawData(final RebindExceptionHandler exceptionHandler) throws IOException {
- final BrooklynMementoRawData.Builder builder = BrooklynMementoRawData.builder();
+ private Map<String,String> makeIdSubPathMap(Iterable<String> subPathLists) {
+ Map<String,String> result = MutableMap.of();
+ for (String subpath: subPathLists) {
+ String id = subpath;
+ id = id.substring(id.lastIndexOf('/')+1);
+ id = id.substring(id.lastIndexOf('\\')+1);
+ // assumes id is the filename; should work even if not, as id is later read from xpath
+ // but you'll get warnings (and possibility of loss if there is a collision)
+ result.put(id, subpath);
+ }
+ return result;
+ }
+
+ protected BrooklynMementoRawData listMementoSubPathsAsData(final RebindExceptionHandler exceptionHandler) {
+ final BrooklynMementoRawData.Builder subPathDataBuilder = BrooklynMementoRawData.builder();
- Visitor visitor = new Visitor() {
+ Stopwatch stopwatch = Stopwatch.createStarted();
+ try {
+ for (BrooklynObjectType type: PERSISTED_OBJECT_TYPES_IN_ORDER)
+ subPathDataBuilder.putAll(type, makeIdSubPathMap(objectStore.listContentsWithSubPath(type.getSubPathName())));
+
+ } catch (Exception e) {
+ Exceptions.propagateIfFatal(e);
+ exceptionHandler.onLoadMementoFailed(BrooklynObjectType.UNKNOWN, "Failed to list files", e);
+ throw new IllegalStateException("Failed to list memento files in "+objectStore, e);
+ }
+
+ BrooklynMementoRawData subPathData = subPathDataBuilder.build();
+ LOG.debug("Loaded rebind lists; took {}: {} entities, {} locations, {} policies, {} enrichers, {} feeds, {} catalog items; from {}", new Object[]{
+ Time.makeTimeStringRounded(stopwatch),
+ subPathData.getEntities().size(), subPathData.getLocations().size(), subPathData.getPolicies().size(), subPathData.getEnrichers().size(),
+ subPathData.getFeeds().size(), subPathData.getCatalogItems().size(),
+ objectStore.getSummaryName() });
+
+ return subPathData;
+ }
+
+ public BrooklynMementoRawData loadMementoRawData(final RebindExceptionHandler exceptionHandler) {
+ BrooklynMementoRawData subPathData = listMementoSubPathsAsData(exceptionHandler);
+
+ final BrooklynMementoRawData.Builder builder = BrooklynMementoRawData.builder();
+
+ Visitor loaderVisitor = new Visitor() {
@Override
- public void visit(String contents, BrooklynObjectType type, String subPath) throws Exception {
- switch (type) {
- case ENTITY:
- builder.entity((String) XmlUtil.xpath(contents, "/entity/id"), contents);
- break;
- case LOCATION:
- builder.location((String) XmlUtil.xpath(contents, "/location/id"), contents);
- break;
- case POLICY:
- builder.policy((String) XmlUtil.xpath(contents, "/policy/id"), contents);
- break;
- case ENRICHER:
- builder.enricher((String) XmlUtil.xpath(contents, "/enricher/id"), contents);
- break;
- case FEED:
- builder.feed((String) XmlUtil.xpath(contents, "/feed/id"), contents);
- break;
- case CATALOG_ITEM:
- builder.catalogItem((String) XmlUtil.xpath(contents, "/catalogItem/id"), contents);
- break;
- default:
- throw new IllegalStateException("Unexpected brooklyn type: "+type);
+ public void visit(BrooklynObjectType type, String id, String contentsSubpath) throws Exception {
+ String contents = null;
+ try {
+ contents = read(contentsSubpath);
+ } catch (Exception e) {
+ Exceptions.propagateIfFatal(e);
+ exceptionHandler.onLoadMementoFailed(type, "memento "+id+" read error", e);
}
+
+ String xmlId = (String) XmlUtil.xpath(contents, "/"+type.toCamelCase()+"/id");
+ if (!Objects.equal(id, xmlId))
+ LOG.warn("ID mismatch on "+type.toCamelCase()+", "+id+" from path, "+xmlId+" from xml");
+
+ builder.put(type, xmlId, contents);
}
};
Stopwatch stopwatch = Stopwatch.createStarted();
- visitMemento(visitor, exceptionHandler);
+ visitMemento("loading raw", subPathData, loaderVisitor, exceptionHandler);
BrooklynMementoRawData result = builder.build();
if (LOG.isDebugEnabled()) {
- LOG.debug("Loaded memento manifest; took {}; {} entities, {} locations, {} policies, {} enrichers, {} feeds, {} catalog items, from {}", new Object[]{
+ LOG.debug("Loaded rebind raw data; took {}; {} entities, {} locations, {} policies, {} enrichers, {} feeds, {} catalog items, from {}", new Object[]{
Time.makeTimeStringRounded(stopwatch.elapsed(TimeUnit.MILLISECONDS)), result.getEntities().size(),
result.getLocations().size(), result.getPolicies().size(), result.getEnrichers().size(),
result.getFeeds().size(), result.getCatalogItems().size(),
@@ -243,49 +273,49 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
@Override
public BrooklynMementoManifest loadMementoManifest(final RebindExceptionHandler exceptionHandler) throws IOException {
+ return loadMementoManifest(null, exceptionHandler);
+ }
+
+ @Override
+ public BrooklynMementoManifest loadMementoManifest(BrooklynMementoRawData mementoData, final RebindExceptionHandler exceptionHandler) throws IOException {
+ if (mementoData==null)
+ mementoData = loadMementoRawData(exceptionHandler);
+
final BrooklynMementoManifestImpl.Builder builder = BrooklynMementoManifestImpl.builder();
Visitor visitor = new Visitor() {
@Override
- public void visit(String contents, BrooklynObjectType type, String subPath) throws Exception {
+ public void visit(BrooklynObjectType type, String objectId, final String contents) throws Exception {
+ final String prefix = "/"+type.toCamelCase()+"/";
+
+ class XPathHelper {
+ private String get(String innerPath) {
+ return (String) XmlUtil.xpath(contents, prefix+innerPath);
+ }
+ }
+ XPathHelper x = new XPathHelper();
+
switch (type) {
case ENTITY:
- String id = (String) XmlUtil.xpath(contents, "/entity/id");
- String objType = (String) XmlUtil.xpath(contents, "/entity/type");
- String parentId = (String) XmlUtil.xpath(contents, "/entity/parent");
- String catalogItemId = (String) XmlUtil.xpath(contents, "/entity/catalogItemId");
- builder.entity(id, objType, Strings.emptyToNull(parentId), Strings.emptyToNull(catalogItemId));
+ builder.entity(x.get("id"), x.get("type"),
+ Strings.emptyToNull(x.get("parent")), Strings.emptyToNull(x.get("catalogItemId")));
break;
case LOCATION:
- id = (String) XmlUtil.xpath(contents, "/location/id");
- objType = (String) XmlUtil.xpath(contents, "/location/type");
- builder.location(id, objType);
- break;
case POLICY:
- id = (String) XmlUtil.xpath(contents, "/policy/id");
- objType = (String) XmlUtil.xpath(contents, "/policy/type");
- builder.policy(id, objType);
- break;
case ENRICHER:
- id = (String) XmlUtil.xpath(contents, "/enricher/id");
- objType = (String) XmlUtil.xpath(contents, "/enricher/type");
- builder.enricher(id, objType);
- break;
case FEED:
- id = (String) XmlUtil.xpath(contents, "/feed/id");
- objType = (String) XmlUtil.xpath(contents, "/feed/type");
- builder.feed(id, objType);
+ builder.putType(type, x.get("id"), x.get("type"));
break;
case CATALOG_ITEM:
try {
CatalogItemMemento memento = (CatalogItemMemento) serializer.fromString(contents);
if (memento == null) {
- LOG.warn("No "+type.toString().toLowerCase()+"-memento deserialized from " + subPath + "; ignoring and continuing");
+ LOG.warn("No "+type.toCamelCase()+"-memento deserialized from " + objectId + "; ignoring and continuing");
} else {
builder.catalogItem(memento);
}
} catch (Exception e) {
- exceptionHandler.onLoadMementoFailed(type, "Memento "+subPath, e);
+ exceptionHandler.onLoadMementoFailed(type, "memento "+objectId+" early catalog deserialization error", e);
}
break;
default:
@@ -296,7 +326,7 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
Stopwatch stopwatch = Stopwatch.createStarted();
- visitMemento(visitor, exceptionHandler);
+ visitMemento("manifests", mementoData, visitor, exceptionHandler);
BrooklynMementoManifest result = builder.build();
@@ -314,29 +344,37 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
@Override
public BrooklynMemento loadMemento(LookupContext lookupContext, final RebindExceptionHandler exceptionHandler) throws IOException {
+ return loadMemento(null, lookupContext, exceptionHandler);
+ }
+
+ @Override
+ public BrooklynMemento loadMemento(BrooklynMementoRawData mementoData, LookupContext lookupContext, final RebindExceptionHandler exceptionHandler) throws IOException {
+ if (mementoData==null)
+ mementoData = loadMementoRawData(exceptionHandler);
+
Stopwatch stopwatch = Stopwatch.createStarted();
final BrooklynMementoImpl.Builder builder = BrooklynMementoImpl.builder();
Visitor visitor = new Visitor() {
@Override
- public void visit(String contents, BrooklynObjectType type, String subPath) throws Exception {
+ public void visit(BrooklynObjectType type, String objectId, String contents) throws Exception {
try {
Memento memento = (Memento) serializer.fromString(contents);
if (memento == null) {
- LOG.warn("No "+type.toString().toLowerCase()+"-memento deserialized from " + subPath + "; ignoring and continuing");
+ LOG.warn("No "+type.toCamelCase()+"-memento deserialized from " + objectId + "; ignoring and continuing");
} else {
builder.memento(memento);
}
} catch (Exception e) {
- exceptionHandler.onLoadMementoFailed(type, "Memento "+subPath, e);
+ exceptionHandler.onLoadMementoFailed(type, "memento "+objectId+" deserialization error", e);
}
}
};
serializer.setLookupContext(lookupContext);
try {
- visitMemento(visitor, exceptionHandler);
+ visitMemento("deserialization", mementoData, visitor, exceptionHandler);
} finally {
serializer.unsetLookupContext();
}
@@ -355,73 +393,33 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
}
protected interface Visitor {
- public void visit(String contents, BrooklynObjectType type, String subPath) throws Exception;
+ public void visit(BrooklynObjectType type, String id, String contents) throws Exception;
}
- protected void visitMemento(final Visitor visitor, final RebindExceptionHandler exceptionHandler) throws IOException {
- List<String> entitySubPathList;
- List<String> locationSubPathList;
- List<String> policySubPathList;
- List<String> enricherSubPathList;
- List<String> feedSubPathList;
- List<String> catalogSubPathList;
-
- Stopwatch stopwatch = Stopwatch.createStarted();
- try {
- entitySubPathList = objectStore.listContentsWithSubPath("entities");
- locationSubPathList = objectStore.listContentsWithSubPath("locations");
- policySubPathList = objectStore.listContentsWithSubPath("policies");
- enricherSubPathList = objectStore.listContentsWithSubPath("enrichers");
- feedSubPathList = objectStore.listContentsWithSubPath("feeds");
- catalogSubPathList = objectStore.listContentsWithSubPath("catalog");
- } catch (Exception e) {
- Exceptions.propagateIfFatal(e);
- exceptionHandler.onLoadMementoFailed(BrooklynObjectType.UNKNOWN, "Failed to list files", e);
- throw new IllegalStateException("Failed to list memento files in "+objectStore, e);
- }
-
- LOG.debug("Loaded rebind lists; took {}: {} entities, {} locations, {} policies, {} enrichers, {} feeds, {} catalog items; from {}", new Object[]{
- Time.makeTimeStringRounded(stopwatch),
- entitySubPathList.size(), locationSubPathList.size(), policySubPathList.size(), enricherSubPathList.size(),
- feedSubPathList.size(), catalogSubPathList.size(),
- objectStore.getSummaryName() });
-
+
+ protected void visitMemento(final String phase, final BrooklynMementoRawData rawData, final Visitor visitor, final RebindExceptionHandler exceptionHandler) {
List<ListenableFuture<?>> futures = Lists.newArrayList();
class VisitorWrapper implements Runnable {
- private final String subPath;
private final BrooklynObjectType type;
- public VisitorWrapper(String subPath, BrooklynObjectType type) {
- this.subPath = subPath;
+ private final Map.Entry<String,String> objectIdAndData;
+ public VisitorWrapper(BrooklynObjectType type, Map.Entry<String,String> objectIdAndData) {
this.type = type;
+ this.objectIdAndData = objectIdAndData;
}
public void run() {
try {
- String contents = read(subPath);
- visitor.visit(contents, type, subPath);
+ visitor.visit(type, objectIdAndData.getKey(), objectIdAndData.getValue());
} catch (Exception e) {
Exceptions.propagateIfFatal(e);
- exceptionHandler.onLoadMementoFailed(type, "Memento "+subPath, e);
+ exceptionHandler.onLoadMementoFailed(type, "memento "+objectIdAndData.getKey()+" "+phase+" error", e);
}
}
}
- for (final String subPath : entitySubPathList) {
- futures.add(executor.submit(new VisitorWrapper(subPath, BrooklynObjectType.ENTITY)));
- }
- for (final String subPath : locationSubPathList) {
- futures.add(executor.submit(new VisitorWrapper(subPath, BrooklynObjectType.LOCATION)));
- }
- for (final String subPath : policySubPathList) {
- futures.add(executor.submit(new VisitorWrapper(subPath, BrooklynObjectType.POLICY)));
- }
- for (final String subPath : enricherSubPathList) {
- futures.add(executor.submit(new VisitorWrapper(subPath, BrooklynObjectType.ENRICHER)));
- }
- for (final String subPath : feedSubPathList) {
- futures.add(executor.submit(new VisitorWrapper(subPath, BrooklynObjectType.FEED)));
- }
- for (final String subPath : catalogSubPathList) {
- futures.add(executor.submit(new VisitorWrapper(subPath, BrooklynObjectType.CATALOG_ITEM)));
+ for (BrooklynObjectType type: PERSISTED_OBJECT_TYPES_IN_ORDER) {
+ for (final Map.Entry<String,String> entry : rawData.getObjectsOfType(type).entrySet()) {
+ futures.add(executor.submit(new VisitorWrapper(type, entry)));
+ }
}
try {
@@ -439,7 +437,7 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
} catch (InterruptedException e2) {
throw Exceptions.propagate(e2);
} catch (ExecutionException e2) {
- LOG.warn("Problem loading memento manifest", e2);
+ LOG.warn("Problem loading memento ("+phase+"): "+e2, e2);
exceptions.add(e2);
}
future.cancel(true);
@@ -449,7 +447,7 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
throw Exceptions.propagate(e);
} else {
// Normally there should be at lesat one failure; otherwise all.get() would not have failed.
- throw new CompoundRuntimeException("Problem loading mementos", exceptions);
+ throw new CompoundRuntimeException("Problem loading mementos ("+phase+")", exceptions);
}
}
}
@@ -476,23 +474,10 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
Stopwatch stopwatch = Stopwatch.createStarted();
List<ListenableFuture<?>> futures = Lists.newArrayList();
- for (Map.Entry<String, String> entry : newMemento.getEntities().entrySet()) {
- futures.add(asyncPersist("entities", BrooklynObjectType.ENTITY, entry.getKey(), entry.getValue(), exceptionHandler));
- }
- for (Map.Entry<String, String> entry : newMemento.getLocations().entrySet()) {
- futures.add(asyncPersist("locations", BrooklynObjectType.LOCATION, entry.getKey(), entry.getValue(), exceptionHandler));
- }
- for (Map.Entry<String, String> entry : newMemento.getPolicies().entrySet()) {
- futures.add(asyncPersist("policies", BrooklynObjectType.POLICY, entry.getKey(), entry.getValue(), exceptionHandler));
- }
- for (Map.Entry<String, String> entry : newMemento.getEnrichers().entrySet()) {
- futures.add(asyncPersist("enrichers", BrooklynObjectType.ENRICHER, entry.getKey(), entry.getValue(), exceptionHandler));
- }
- for (Map.Entry<String, String> entry : newMemento.getFeeds().entrySet()) {
- futures.add(asyncPersist("feeds", BrooklynObjectType.FEED, entry.getKey(), entry.getValue(), exceptionHandler));
- }
- for (Map.Entry<String, String> entry : newMemento.getCatalogItems().entrySet()) {
- futures.add(asyncPersist("catalog", BrooklynObjectType.CATALOG_ITEM, entry.getKey(), entry.getValue(), exceptionHandler));
+ for (BrooklynObjectType type: PERSISTED_OBJECT_TYPES_IN_ORDER) {
+ for (Map.Entry<String, String> entry : newMemento.getObjectsOfType(type).entrySet()) {
+ futures.add(asyncPersist(type.getSubPathName(), type, entry.getKey(), entry.getValue(), exceptionHandler));
+ }
}
try {
@@ -561,42 +546,15 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
Stopwatch stopwatch = Stopwatch.createStarted();
List<ListenableFuture<?>> futures = Lists.newArrayList();
- for (EntityMemento entity : delta.entities()) {
- futures.add(asyncPersist("entities", entity, exceptionHandler));
- }
- for (LocationMemento location : delta.locations()) {
- futures.add(asyncPersist("locations", location, exceptionHandler));
- }
- for (PolicyMemento policy : delta.policies()) {
- futures.add(asyncPersist("policies", policy, exceptionHandler));
- }
- for (EnricherMemento enricher : delta.enrichers()) {
- futures.add(asyncPersist("enrichers", enricher, exceptionHandler));
- }
- for (FeedMemento feed : delta.feeds()) {
- futures.add(asyncPersist("feeds", feed, exceptionHandler));
- }
- for (CatalogItemMemento catalogItem : delta.catalogItems()) {
- futures.add(asyncPersist("catalog", catalogItem, exceptionHandler));
- }
-
- for (String id : delta.removedEntityIds()) {
- futures.add(asyncDelete("entities", id, exceptionHandler));
- }
- for (String id : delta.removedLocationIds()) {
- futures.add(asyncDelete("locations", id, exceptionHandler));
- }
- for (String id : delta.removedPolicyIds()) {
- futures.add(asyncDelete("policies", id, exceptionHandler));
- }
- for (String id : delta.removedEnricherIds()) {
- futures.add(asyncDelete("enrichers", id, exceptionHandler));
- }
- for (String id : delta.removedFeedIds()) {
- futures.add(asyncDelete("feeds", id, exceptionHandler));
+ for (BrooklynObjectType type: PERSISTED_OBJECT_TYPES_IN_ORDER) {
+ for (Memento entity : delta.getObjectsOfType(type)) {
+ futures.add(asyncPersist(type.getSubPathName(), entity, exceptionHandler));
+ }
}
- for (String id : delta.removedCatalogItemIds()) {
- futures.add(asyncDelete("catalog", id, exceptionHandler));
+ for (BrooklynObjectType type: PERSISTED_OBJECT_TYPES_IN_ORDER) {
+ for (String id : delta.getRemovedObjectsOfType(type)) {
+ futures.add(asyncDelete(type.getSubPathName(), id, exceptionHandler));
+ }
}
try {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/be5aac25/core/src/main/java/brooklyn/management/ha/HighAvailabilityManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/ha/HighAvailabilityManagerImpl.java b/core/src/main/java/brooklyn/management/ha/HighAvailabilityManagerImpl.java
index 8dd8091..852885a 100644
--- a/core/src/main/java/brooklyn/management/ha/HighAvailabilityManagerImpl.java
+++ b/core/src/main/java/brooklyn/management/ha/HighAvailabilityManagerImpl.java
@@ -57,6 +57,7 @@ import brooklyn.util.task.ScheduledTask;
import brooklyn.util.task.Tasks;
import brooklyn.util.text.Strings;
import brooklyn.util.time.Duration;
+import brooklyn.util.time.Time;
import com.google.common.annotations.Beta;
import com.google.common.annotations.VisibleForTesting;
@@ -634,11 +635,11 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager {
String message = "Management node "+ownNodeId+" detected ";
if (weAreNewMaster) message += "we should be master, changing from ";
else message += "master change, from ";
- message +=currMasterNodeId + " (" + (currMasterNodeRecord==null ? "?" : currMasterNodeRecord.getRemoteTimestamp()) + ")"
+ message +=currMasterNodeId + " (" + (currMasterNodeRecord==null ? "?" : timestampString(currMasterNodeRecord.getRemoteTimestamp())) + ")"
+ " to "
+ (newMasterNodeId == null ? "<none>" :
(weAreNewMaster ? "us " : "")
- + newMasterNodeId + " (" + newMasterNodeRecord.getRemoteTimestamp() + ")"
+ + newMasterNodeId + " (" + timestampString(newMasterNodeRecord.getRemoteTimestamp()) + ")"
+ (newMasterNodeUri!=null ? " "+newMasterNodeUri : "") );
LOG.warn(message);
}
@@ -649,6 +650,11 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager {
}
}
+ private static String timestampString(Long remoteTimestamp) {
+ if (remoteTimestamp==null) return null;
+ return remoteTimestamp+" / "+Time.makeTimeStringRounded( Duration.sinceUtc(remoteTimestamp))+" ago";
+ }
+
protected void promoteToMaster() {
if (!running) {
LOG.warn("Ignoring promote-to-master request, as HighAvailabilityManager is no longer running");
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/be5aac25/core/src/test/java/brooklyn/entity/rebind/RebindFailuresTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/rebind/RebindFailuresTest.java b/core/src/test/java/brooklyn/entity/rebind/RebindFailuresTest.java
index e070bd0..045d91c8 100644
--- a/core/src/test/java/brooklyn/entity/rebind/RebindFailuresTest.java
+++ b/core/src/test/java/brooklyn/entity/rebind/RebindFailuresTest.java
@@ -179,8 +179,7 @@ public class RebindFailuresTest extends RebindTestFixtureWithApp {
}
// exception handler should have been told about failure
- // two exceptions: one for loadMementoManifest; one for loadMemento
- assertEquals(exceptionHandler.loadMementoFailures.size(), 2, "exceptions="+exceptionHandler.loadMementoFailures);
+ assertFalse(exceptionHandler.loadMementoFailures.isEmpty(), "exceptions="+exceptionHandler.loadMementoFailures);
}
protected void assertFailureRebindingError(Exception e) {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/be5aac25/core/src/test/java/brooklyn/entity/rebind/RebindTestFixture.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/rebind/RebindTestFixture.java b/core/src/test/java/brooklyn/entity/rebind/RebindTestFixture.java
index 1466405..60d245a 100644
--- a/core/src/test/java/brooklyn/entity/rebind/RebindTestFixture.java
+++ b/core/src/test/java/brooklyn/entity/rebind/RebindTestFixture.java
@@ -173,7 +173,7 @@ public abstract class RebindTestFixture<T extends StartableApplication> {
((ManagementContextInternal)newManagementContext).getBrooklynProperties(),
classLoader);
RebindExceptionHandler exceptionHandler = new RecordingRebindExceptionHandler(RebindManager.RebindFailureMode.FAIL_AT_END, RebindManager.RebindFailureMode.FAIL_AT_END);
- BrooklynMementoManifest mementoManifest = persister.loadMementoManifest(exceptionHandler);
+ BrooklynMementoManifest mementoManifest = persister.loadMementoManifest(null, exceptionHandler);
persister.stop(false);
return mementoManifest;
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/be5aac25/core/src/test/java/brooklyn/entity/rebind/RecordingRebindExceptionHandler.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/rebind/RecordingRebindExceptionHandler.java b/core/src/test/java/brooklyn/entity/rebind/RecordingRebindExceptionHandler.java
index d2c8b8c..41cead5 100644
--- a/core/src/test/java/brooklyn/entity/rebind/RecordingRebindExceptionHandler.java
+++ b/core/src/test/java/brooklyn/entity/rebind/RecordingRebindExceptionHandler.java
@@ -43,7 +43,7 @@ public class RecordingRebindExceptionHandler extends RebindExceptionHandlerImpl
@Override
public void onLoadMementoFailed(BrooklynObjectType type, String msg, Exception e) {
- loadMementoFailures.add(new IllegalStateException("problem loading "+type+" memento: "+msg, e));
+ loadMementoFailures.add(new IllegalStateException("problem loading "+type.toCamelCase()+" memento: "+msg, e));
super.onLoadMementoFailed(type, msg, e);
}
@@ -71,13 +71,13 @@ public class RecordingRebindExceptionHandler extends RebindExceptionHandlerImpl
@Override
public void onRebindFailed(BrooklynObjectType type, BrooklynObject instance, Exception e) {
- rebindFailures.put(instance, new IllegalStateException("problem rebinding "+type+" "+instance.getId()+" ("+instance+")", e));
+ rebindFailures.put(instance, new IllegalStateException("problem rebinding "+type.toCamelCase()+" "+instance.getId()+" ("+instance+")", e));
super.onRebindFailed(type, instance, e);
}
@Override
public void onManageFailed(BrooklynObjectType type, BrooklynObject instance, Exception e) {
- manageFailures.put(instance, new IllegalStateException("problem managing "+type+" "+instance.getId()+" ("+instance+")", e));
+ manageFailures.put(instance, new IllegalStateException("problem managing "+type.toCamelCase()+" "+instance.getId()+" ("+instance+")", e));
super.onManageFailed(type, instance, e);
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/be5aac25/core/src/test/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterTestFixture.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterTestFixture.java b/core/src/test/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterTestFixture.java
index 0ae2a9e..3306a32 100644
--- a/core/src/test/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterTestFixture.java
+++ b/core/src/test/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterTestFixture.java
@@ -111,7 +111,7 @@ public abstract class BrooklynMementoPersisterTestFixture {
rebindContext.registerEntity(app.getId(), app);
rebindContext.registerEntity(entity.getId(), entity);
- BrooklynMemento reloadedMemento = persister.loadMemento(lookupContext, failFast);
+ BrooklynMemento reloadedMemento = persister.loadMemento(null, lookupContext, failFast);
return reloadedMemento;
}
[2/9] git commit: Fix JcloudsObjectStoreAccessorWriterTest
Posted by he...@apache.org.
Fix JcloudsObjectStoreAccessorWriterTest
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/310ce260
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/310ce260
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/310ce260
Branch: refs/heads/master
Commit: 310ce2606d8a0b08aba89cffd4311a134aec94df
Parents: c323b00
Author: Aled Sage <al...@gmail.com>
Authored: Wed Nov 5 22:45:59 2014 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Nov 5 22:47:14 2014 +0000
----------------------------------------------------------------------
.../PersistenceStoreObjectAccessorWriterTestFixture.java | 2 +-
.../jclouds/JcloudsObjectStoreAccessorWriterTest.java | 8 ++++++++
2 files changed, 9 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/310ce260/core/src/test/java/brooklyn/entity/rebind/persister/PersistenceStoreObjectAccessorWriterTestFixture.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/rebind/persister/PersistenceStoreObjectAccessorWriterTestFixture.java b/core/src/test/java/brooklyn/entity/rebind/persister/PersistenceStoreObjectAccessorWriterTestFixture.java
index 1e96da1..6cdb32d 100644
--- a/core/src/test/java/brooklyn/entity/rebind/persister/PersistenceStoreObjectAccessorWriterTestFixture.java
+++ b/core/src/test/java/brooklyn/entity/rebind/persister/PersistenceStoreObjectAccessorWriterTestFixture.java
@@ -89,7 +89,7 @@ public abstract class PersistenceStoreObjectAccessorWriterTestFixture {
accessor.waitForCurrentWrites(TIMEOUT);
Date write2 = accessor.getLastModifiedDate();
Assert.assertNotNull(write2);
- Assert.assertTrue(write2.after(write1), "dates are "+write1+" and "+write2);
+ Assert.assertTrue(write2.after(write1), "dates are "+write1+" ("+write1.getTime()+") and "+write2+" ("+write2.getTime()+") ");
}
@Test
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/310ce260/locations/jclouds/src/test/java/brooklyn/entity/rebind/persister/jclouds/JcloudsObjectStoreAccessorWriterTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/entity/rebind/persister/jclouds/JcloudsObjectStoreAccessorWriterTest.java b/locations/jclouds/src/test/java/brooklyn/entity/rebind/persister/jclouds/JcloudsObjectStoreAccessorWriterTest.java
index 828c8f3..8a03501 100644
--- a/locations/jclouds/src/test/java/brooklyn/entity/rebind/persister/jclouds/JcloudsObjectStoreAccessorWriterTest.java
+++ b/locations/jclouds/src/test/java/brooklyn/entity/rebind/persister/jclouds/JcloudsObjectStoreAccessorWriterTest.java
@@ -33,6 +33,7 @@ import brooklyn.entity.rebind.persister.StoreObjectAccessorLocking;
import brooklyn.management.ha.HighAvailabilityMode;
import brooklyn.test.entity.LocalManagementContextForTests;
import brooklyn.util.text.Identifiers;
+import brooklyn.util.time.Duration;
@Test(groups={"Live", "Live-sanity"})
public class JcloudsObjectStoreAccessorWriterTest extends PersistenceStoreObjectAccessorWriterTestFixture {
@@ -60,6 +61,13 @@ public class JcloudsObjectStoreAccessorWriterTest extends PersistenceStoreObject
return new StoreObjectAccessorLocking(store.newAccessor("sample-file-"+Identifiers.makeRandomId(4)));
}
+ @Override
+ protected Duration getLastModifiedResolution() {
+ // Not sure what timing resolution is on things like Softlayer's Swift.
+ // It passed for Aled repeatedly on 2014-11-05 with 2 seconds.
+ return Duration.seconds(2);
+ }
+
protected int biggishSize() {
// bit smaller since it's actually uploading here!
return 10000;
[3/9] git commit: set entity RO status much earlier when known
Posted by he...@apache.org.
set entity RO status much earlier when known
mainly to enable suppression of log messages that are hugely noisy in read-only mode
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/283d1706
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/283d1706
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/283d1706
Branch: refs/heads/master
Commit: 283d17067f1b5eb5954708a2f9a106dec6ef0bfc
Parents: 7cfeacc
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Wed Nov 5 22:39:37 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Nov 6 02:02:34 2014 +0000
----------------------------------------------------------------------
.../main/java/brooklyn/entity/rebind/RebindManagerImpl.java | 4 ++--
.../brooklyn/management/internal/LocalEntityManager.java | 8 +++++++-
2 files changed, 9 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/283d1706/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
index 24076f9..09101f6 100644
--- a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
@@ -646,7 +646,9 @@ public class RebindManagerImpl implements RebindManager {
try {
Entity entity = newEntity(entityId, entityManifest.getType(), getLoadingContextFromCatalogItemId(catalogItemId, classLoader, rebindContext));
+ ((EntityInternal)entity).getManagementSupport().setReadOnly( rebindContext.isReadOnly(entity) );
rebindContext.registerEntity(entityId, entity);
+
} catch (Exception e) {
exceptionHandler.onCreateFailed(BrooklynObjectType.ENTITY, entityId, entityManifest.getType(), e);
}
@@ -880,8 +882,6 @@ public class RebindManagerImpl implements RebindManager {
EntityManagerInternal entityManager = (EntityManagerInternal)managementContext.getEntityManager();
Set<String> oldEntities = Sets.newLinkedHashSet(entityManager.getEntityIds());
for (Entity entity: rebindContext.getEntities()) {
- ((EntityInternal)entity).getManagementSupport().setReadOnly( rebindContext.isReadOnly(entity) );
-
ManagementTransitionMode oldMode = entityManager.getLastManagementTransitionMode(entity.getId());
entityManager.setManagementTransitionMode(entity, computeMode(entity, oldMode, rebindContext.isReadOnly(entity)) );
if (oldMode!=null)
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/283d1706/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java b/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java
index c6a5bcf..8a10727 100644
--- a/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java
+++ b/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java
@@ -290,12 +290,18 @@ public class LocalEntityManager implements EntityManagerInternal {
if (mode==null) {
setManagementTransitionMode(it, mode = initialMode);
}
- if (it.getManagementSupport().isReadOnlyRaw()==null) {
+
+ Boolean isReadOnlyFromEntity = it.getManagementSupport().isReadOnlyRaw();
+ if (isReadOnlyFromEntity==null) {
if (mode.isReadOnly()) {
// should have been marked by rebinder
log.warn("Read-only entity "+it+" not marked as such on call to manage; marking and continuing");
}
it.getManagementSupport().setReadOnly(mode.isReadOnly());
+ } else {
+ if (!isReadOnlyFromEntity.equals(mode.isReadOnly())) {
+ log.warn("Read-only status at entity "+it+" ("+isReadOnlyFromEntity+") not consistent with management mode "+mode);
+ }
}
if (it.getManagementSupport().isDeployed()) {
[4/9] git commit: improve logging for persistence and rebind
Posted by he...@apache.org.
improve logging for persistence and rebind
a few more detailed messages, including timings;
and lots of suppression of messages during redind-read-only
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/28150112
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/28150112
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/28150112
Branch: refs/heads/master
Commit: 28150112ebf66c1caef1c281a3589a32e1299148
Parents: 283d170
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Wed Nov 5 22:16:32 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Nov 6 02:02:34 2014 +0000
----------------------------------------------------------------------
.../catalog/internal/BasicBrooklynCatalog.java | 6 +-
.../brooklyn/catalog/internal/CatalogDo.java | 3 +-
.../brooklyn/catalog/internal/CatalogDto.java | 11 +-
.../catalog/internal/CatalogItemDo.java | 3 +-
.../catalog/internal/CatalogLibrariesDto.java | 7 +-
.../brooklyn/catalog/internal/CatalogUtils.java | 32 ++++-
.../java/brooklyn/config/BrooklynLogging.java | 46 +++++++
.../basic/AbstractMultipleSensorAggregator.java | 7 +-
.../brooklyn/enricher/basic/Aggregator.java | 8 +-
.../brooklyn/entity/basic/AbstractEntity.java | 32 ++++-
.../brooklyn/entity/basic/DynamicGroupImpl.java | 5 +-
.../entity/basic/ServiceStateLogic.java | 10 +-
.../group/AbstractMembershipTrackingPolicy.java | 4 +-
.../rebind/PeriodicDeltaChangeListener.java | 4 +-
.../entity/rebind/RebindManagerImpl.java | 136 +++++++++++--------
.../BrooklynMementoPersisterToObjectStore.java | 16 ++-
.../java/brooklyn/event/basic/AttributeMap.java | 6 +-
.../ha/ManagementPlaneSyncRecordDeltaImpl.java | 11 ++
...ntPlaneSyncRecordPersisterToObjectStore.java | 12 +-
.../brooklyn/management/ha/OsgiManager.java | 11 +-
.../management/internal/LocalEntityManager.java | 4 +-
.../internal/LocalLocationManager.java | 12 +-
.../management/usage/LocationUsage.java | 2 +-
.../brooklyn/location/jclouds/JcloudsUtil.java | 2 +-
.../java/brooklyn/util/javalang/Equals.java | 59 ++++++++
.../src/main/java/brooklyn/util/time/Time.java | 4 +-
.../test/java/brooklyn/util/time/TimeTest.java | 4 +-
27 files changed, 344 insertions(+), 113 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java b/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
index 0236999..4d31964 100644
--- a/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
+++ b/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
@@ -123,9 +123,9 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
mgmt.getRebindManager().getChangeListener().onUnmanaged(toRemove);
}
CatalogDo catalog = new CatalogDo(mgmt, dto);
- log.debug("Resetting "+this+" catalog to "+dto);
+ CatalogUtils.logDebugOrTraceIfRebinding(log, "Resetting "+this+" catalog to "+dto);
catalog.load(mgmt, null);
- log.debug("Reloaded catalog for "+this+", now switching");
+ CatalogUtils.logDebugOrTraceIfRebinding(log, "Reloaded catalog for "+this+", now switching");
this.catalog = catalog;
// Inject management context into and persist all the new entries.
@@ -158,7 +158,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
*/
@Override
public void reset(Collection<CatalogItem<?, ?>> entries) {
- CatalogDto newDto = CatalogDto.newDtoFromCatalogItems(entries);
+ CatalogDto newDto = CatalogDto.newDtoFromCatalogItems(entries, "explicit-catalog-reset");
reset(newDto);
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/catalog/internal/CatalogDo.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogDo.java b/core/src/main/java/brooklyn/catalog/internal/CatalogDo.java
index 0ac65fc..33552f0 100644
--- a/core/src/main/java/brooklyn/catalog/internal/CatalogDo.java
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogDo.java
@@ -94,6 +94,7 @@ public class CatalogDo {
protected synchronized void loadThisCatalog(ManagementContext mgmt, CatalogDo parent) {
if (isLoaded()) return;
+ CatalogUtils.logDebugOrTraceIfRebinding(log, "Loading catalog {} into {}", this, parent);
if (this.parent!=null && !this.parent.equals(parent))
log.warn("Catalog "+this+" being initialised with different parent "+parent+" when already parented by "+this.parent, new Throwable("source of reparented "+this));
if (this.mgmt!=null && !this.mgmt.equals(mgmt))
@@ -173,7 +174,7 @@ public class CatalogDo {
@SuppressWarnings({ "unchecked", "rawtypes" })
protected synchronized Map<String, CatalogItemDo<?,?>> buildCaches() {
if (cacheById != null) return cacheById;
- log.debug("Building cache for "+this);
+ CatalogUtils.logDebugOrTraceIfRebinding(log, "Building cache for {}", this);
if (!isLoaded())
log.debug("Catalog not fully loaded when loading cache of "+this);
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/catalog/internal/CatalogDto.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogDto.java b/core/src/main/java/brooklyn/catalog/internal/CatalogDto.java
index 88c8901..0d98c82 100644
--- a/core/src/main/java/brooklyn/catalog/internal/CatalogDto.java
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogDto.java
@@ -120,9 +120,16 @@ public class CatalogDto {
return result;
}
- @SuppressWarnings({ "unchecked", "rawtypes" })
+ /** @deprecated since 0.7.0 use {@link #newDtoFromCatalogItems(Collection, String)}, supplying a description for tracking */
+ @Deprecated
public static CatalogDto newDtoFromCatalogItems(Collection<CatalogItem<?, ?>> entries) {
+ return newDtoFromCatalogItems(entries, null);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ public static CatalogDto newDtoFromCatalogItems(Collection<CatalogItem<?, ?>> entries, String description) {
CatalogDto result = new CatalogDto();
+ result.contentsDescription = description;
// Weird casts because compiler does not seem to like
// .copyInto(Lists.<CatalogItemDtoAbstract<?, ?>>newArrayListWithExpectedSize(entries.size()));
result.entries = (List<CatalogItemDtoAbstract<?, ?>>) (List) FluentIterable.from(entries)
@@ -140,7 +147,7 @@ public class CatalogDto {
LOG.debug("Catalog DTO has no contents and no description; ignoring call to populate it. Description should be set to suppress this message.");
return;
} else {
- LOG.debug("Nothing needs doing (no contents or URL) for catalog with contents described as "+contentsDescription+".");
+ LOG.trace("Nothing needs doing (no contents or URL) for catalog with contents described as "+contentsDescription+".");
return;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java b/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java
index 7bcf9ec..b3ac88d 100644
--- a/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java
@@ -24,6 +24,7 @@ import javax.annotation.Nullable;
import brooklyn.catalog.CatalogItem;
import brooklyn.entity.rebind.RebindSupport;
import brooklyn.management.ManagementContext;
+import brooklyn.mementos.CatalogItemMemento;
import com.google.common.base.Preconditions;
@@ -152,7 +153,7 @@ public class CatalogItemDo<T,SpecT> implements CatalogItem<T,SpecT> {
}
@Override
- public RebindSupport getRebindSupport() {
+ public RebindSupport<CatalogItemMemento> getRebindSupport() {
return itemDto.getRebindSupport();
}
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDto.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDto.java b/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDto.java
index ba07c21..bcbd25b 100644
--- a/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDto.java
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDto.java
@@ -63,9 +63,11 @@ public class CatalogLibrariesDto implements CatalogItem.CatalogItemLibraries {
CatalogLibrariesDto dto = new CatalogLibrariesDto();
for (Object object : possibleLibraries) {
if (object instanceof Map) {
+ @SuppressWarnings("rawtypes")
Map entry = (Map) object;
- String name = stringValOrNull(entry, "name");
- String version = stringValOrNull(entry, "version");
+ // these might be useful in the future
+// String name = stringValOrNull(entry, "name");
+// String version = stringValOrNull(entry, "version");
String url = stringValOrNull(entry, "url");
dto.addBundle(url);
} else if (object instanceof String) {
@@ -77,6 +79,7 @@ public class CatalogLibrariesDto implements CatalogItem.CatalogItemLibraries {
return dto;
}
+ @SuppressWarnings("rawtypes")
private static String stringValOrNull(Map map, String key) {
Object val = map.get(key);
return val != null ? String.valueOf(val) : null;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/catalog/internal/CatalogUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogUtils.java b/core/src/main/java/brooklyn/catalog/internal/CatalogUtils.java
index 5b6b81d..6fd1f94 100644
--- a/core/src/main/java/brooklyn/catalog/internal/CatalogUtils.java
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogUtils.java
@@ -25,6 +25,7 @@ import javax.annotation.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.annotations.Beta;
import com.google.common.base.Joiner;
import com.google.common.base.Stopwatch;
@@ -33,7 +34,9 @@ import brooklyn.basic.BrooklynObjectInternal;
import brooklyn.catalog.CatalogItem;
import brooklyn.catalog.CatalogItem.CatalogItemLibraries;
import brooklyn.catalog.internal.BasicBrooklynCatalog.BrooklynLoaderTracker;
+import brooklyn.config.BrooklynLogging;
import brooklyn.entity.Entity;
+import brooklyn.entity.rebind.RebindManagerImpl.RebindTracker;
import brooklyn.management.ManagementContext;
import brooklyn.management.classloading.BrooklynClassLoadingContext;
import brooklyn.management.classloading.BrooklynClassLoadingContextSequential;
@@ -89,14 +92,18 @@ public class CatalogUtils {
if (osgi.isAbsent()) {
throw new IllegalStateException("Unable to load bundles "+bundles+" because OSGi is not running.");
}
- if (log.isDebugEnabled()) log.debug("Loading bundles in {}: {}",
+ if (log.isDebugEnabled())
+ logDebugOrTraceIfRebinding(log,
+ "Loading bundles in {}: {}",
new Object[] {managementContext, Joiner.on(", ").join(bundles)});
Stopwatch timer = Stopwatch.createStarted();
for (String bundleUrl : bundles) {
osgi.get().registerBundle(bundleUrl);
}
- if (log.isDebugEnabled()) log.debug("Registered {} bundles in {}",
- new Object[]{bundles.size(), Time.makeTimeStringRounded(timer)});
+ if (log.isDebugEnabled())
+ logDebugOrTraceIfRebinding(log,
+ "Registered {} bundles in {}",
+ new Object[]{bundles.size(), Time.makeTimeStringRounded(timer)});
}
}
@@ -112,7 +119,9 @@ public class CatalogUtils {
public static void setCatalogItemIdOnAddition(Entity entity, BrooklynObject itemBeingAdded) {
if (entity.getCatalogItemId()!=null) {
if (itemBeingAdded.getCatalogItemId()==null) {
- log.debug("Catalog item addition: "+entity+" from "+entity.getCatalogItemId()+" applying its catalog item ID to "+itemBeingAdded);
+ if (log.isDebugEnabled())
+ BrooklynLogging.log(log, BrooklynLogging.levelDebugOrTraceIfReadOnly(entity),
+ "Catalog item addition: "+entity+" from "+entity.getCatalogItemId()+" applying its catalog item ID to "+itemBeingAdded);
((BrooklynObjectInternal)itemBeingAdded).setCatalogItemId(entity.getCatalogItemId());
} else {
if (!itemBeingAdded.getCatalogItemId().equals(entity.getCatalogItemId())) {
@@ -120,9 +129,20 @@ public class CatalogUtils {
log.debug("Cross-catalog item detected: "+entity+" from "+entity.getCatalogItemId()+" has "+itemBeingAdded+" from "+itemBeingAdded.getCatalogItemId());
}
}
- } else if (itemBeingAdded.getCatalogItemId()==null) {
- log.debug("Catalog item addition: "+entity+" without catalog item ID has "+itemBeingAdded+" from "+itemBeingAdded.getCatalogItemId());
+ } else if (itemBeingAdded.getCatalogItemId()!=null) {
+ if (log.isDebugEnabled())
+ BrooklynLogging.log(log, BrooklynLogging.levelDebugOrTraceIfReadOnly(entity),
+ "Catalog item addition: "+entity+" without catalog item ID has "+itemBeingAdded+" from "+itemBeingAdded.getCatalogItemId());
}
}
+ @Beta
+ public static void logDebugOrTraceIfRebinding(Logger log, String message, Object ...args) {
+ if (RebindTracker.isRebinding())
+ log.trace(message, args);
+ else
+ log.debug(message, args);
+ }
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/config/BrooklynLogging.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/config/BrooklynLogging.java b/core/src/main/java/brooklyn/config/BrooklynLogging.java
index 729d819..8a27ebd 100644
--- a/core/src/main/java/brooklyn/config/BrooklynLogging.java
+++ b/core/src/main/java/brooklyn/config/BrooklynLogging.java
@@ -18,6 +18,11 @@
*/
package brooklyn.config;
+import org.slf4j.Logger;
+
+import brooklyn.entity.Entity;
+import brooklyn.entity.basic.EntityInternal;
+
/** contains common logging categories */
public class BrooklynLogging {
@@ -25,4 +30,45 @@ public class BrooklynLogging {
public static final String REST = "brooklyn.REST";
+ /** For convenience here, since SLF4J does not define such an enum */
+ public static enum LoggingLevel { ERROR, WARN, INFO, DEBUG, TRACE }
+
+ /** As methods on {@link Logger} but taking the level as an argument */
+ public static final void log(Logger logger, LoggingLevel level, String message, Object... args) {
+ switch (level) {
+ case ERROR: logger.error(message, args); break;
+ case WARN: logger.warn(message, args); break;
+ case INFO: logger.info(message, args); break;
+ case DEBUG: logger.debug(message, args); break;
+ case TRACE: logger.trace(message, args); break;
+ }
+ }
+
+ /** As methods on {@link Logger} but taking the level as an argument */
+ public static final void log(Logger logger, LoggingLevel level, String message, Throwable t) {
+ switch (level) {
+ case ERROR: logger.error(message, t); break;
+ case WARN: logger.warn(message, t); break;
+ case INFO: logger.info(message, t); break;
+ case DEBUG: logger.debug(message, t); break;
+ case TRACE: logger.trace(message, t); break;
+ }
+ }
+
+ /** returns one of three log levels depending on the read-only status of the entity;
+ * unknown should only be the case very early in the management cycle */
+ public static LoggingLevel levelDependingIfReadOnly(Entity entity, LoggingLevel levelIfWriting, LoggingLevel levelIfReadOnly, LoggingLevel levelIfUnknown) {
+ if (entity==null) return levelIfUnknown;
+ Boolean ro = ((EntityInternal)entity).getManagementSupport().isReadOnlyRaw();
+ if (ro==null) return levelIfUnknown;
+ if (ro) return levelIfReadOnly;
+ return levelIfWriting;
+ }
+
+ /** as {@link #levelDependendingIfReadOnly(Entity)} with {@link LoggingLevel#DEBUG} as the default,
+ * but {@link LoggingLevel#TRACE} for read-only */
+ public static LoggingLevel levelDebugOrTraceIfReadOnly(Entity entity) {
+ return levelDependingIfReadOnly(entity, LoggingLevel.DEBUG, LoggingLevel.TRACE, LoggingLevel.DEBUG);
+ }
+
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/enricher/basic/AbstractMultipleSensorAggregator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/basic/AbstractMultipleSensorAggregator.java b/core/src/main/java/brooklyn/enricher/basic/AbstractMultipleSensorAggregator.java
index 486307c..b40c234 100644
--- a/core/src/main/java/brooklyn/enricher/basic/AbstractMultipleSensorAggregator.java
+++ b/core/src/main/java/brooklyn/enricher/basic/AbstractMultipleSensorAggregator.java
@@ -26,6 +26,7 @@ import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import brooklyn.config.BrooklynLogging;
import brooklyn.entity.Entity;
import brooklyn.event.AttributeSensor;
import brooklyn.event.Sensor;
@@ -57,7 +58,8 @@ public abstract class AbstractMultipleSensorAggregator<U> extends AbstractAggreg
@Override
protected void setEntityBeforeSubscribingProducerChildrenEvents() {
- if (LOG.isDebugEnabled()) LOG.debug("{} subscribing to children of {}", new Object[] {this, producer });
+ BrooklynLogging.log(LOG, BrooklynLogging.levelDebugOrTraceIfReadOnly(producer),
+ "{} subscribing to children of {}", this, producer);
for (Sensor<?> sourceSensor: getSourceSensors()) {
subscribeToChildren(producer, sourceSensor, this);
}
@@ -84,7 +86,8 @@ public abstract class AbstractMultipleSensorAggregator<U> extends AbstractAggreg
@Override
protected void onProducerAdded(Entity producer) {
- if (LOG.isDebugEnabled()) LOG.debug("{} listening to {}", new Object[] {this, producer});
+ BrooklynLogging.log(LOG, BrooklynLogging.levelDebugOrTraceIfReadOnly(producer),
+ "{} listening to {}", this, producer);
synchronized (values) {
for (Sensor<?> sensor: getSourceSensors()) {
Map<Entity,Object> vs = values.get(sensor.getName());
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/enricher/basic/Aggregator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/basic/Aggregator.java b/core/src/main/java/brooklyn/enricher/basic/Aggregator.java
index fc20033..3e896db 100644
--- a/core/src/main/java/brooklyn/enricher/basic/Aggregator.java
+++ b/core/src/main/java/brooklyn/enricher/basic/Aggregator.java
@@ -28,7 +28,9 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import brooklyn.catalog.Catalog;
+import brooklyn.config.BrooklynLogging;
import brooklyn.config.ConfigKey;
+import brooklyn.config.BrooklynLogging.LoggingLevel;
import brooklyn.entity.Entity;
import brooklyn.entity.basic.ConfigKeys;
import brooklyn.event.AttributeSensor;
@@ -74,7 +76,8 @@ public class Aggregator<T,U> extends AbstractAggregator<T,U> implements SensorEv
@Override
protected void setEntityBeforeSubscribingProducerChildrenEvents() {
- if (LOG.isDebugEnabled()) LOG.debug("{} subscribing to children of {}", new Object[] {this, producer });
+ BrooklynLogging.log(LOG, BrooklynLogging.levelDebugOrTraceIfReadOnly(producer),
+ "{} subscribing to children of {}", this, producer);
subscribeToChildren(producer, sourceSensor, this);
}
@@ -98,7 +101,8 @@ public class Aggregator<T,U> extends AbstractAggregator<T,U> implements SensorEv
@Override
protected void onProducerAdded(Entity producer) {
- if (LOG.isDebugEnabled()) LOG.debug("{} listening to {}", new Object[] {this, producer});
+ BrooklynLogging.log(LOG, BrooklynLogging.levelDebugOrTraceIfReadOnly(producer),
+ "{} listening to {}", this, producer);
synchronized (values) {
T vo = values.get(producer);
if (vo==null) {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java b/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
index 034bea7..c5ca83a 100644
--- a/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
+++ b/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
@@ -33,6 +33,7 @@ import org.slf4j.LoggerFactory;
import brooklyn.basic.AbstractBrooklynObject;
import brooklyn.catalog.internal.CatalogUtils;
+import brooklyn.config.BrooklynLogging;
import brooklyn.config.ConfigKey;
import brooklyn.config.ConfigKey.HasConfigKey;
import brooklyn.config.render.RendererHints;
@@ -89,6 +90,7 @@ import brooklyn.util.config.ConfigBag;
import brooklyn.util.flags.FlagUtils;
import brooklyn.util.flags.TypeCoercions;
import brooklyn.util.guava.Maybe;
+import brooklyn.util.javalang.Equals;
import brooklyn.util.task.DeferredSupplier;
import brooklyn.util.text.Strings;
@@ -802,10 +804,20 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E
LOG.trace(""+this+" setAttribute "+attribute+" "+val);
if (Boolean.TRUE.equals(getManagementSupport().isReadOnlyRaw())) {
- if (WARNED_READ_ONLY_ATTRIBUTES.add(attribute.getName())) {
- LOG.warn(""+this+" setting "+attribute+" = "+val+" in read only mode; will have no effect (future messages for this sensor logged at trace)");
- } else if (LOG.isTraceEnabled()) {
- LOG.trace(""+this+" setting "+attribute+" = "+val+" in read only mode; will have no effect");
+ T oldVal = getAttribute(attribute);
+ if (Equals.approximately(val, oldVal)) {
+ // ignore, probably an enricher resetting values or something on init
+ } else {
+ String message = this+" setting "+attribute+" = "+val+" (was "+oldVal+") in read only mode; will have very little effect";
+ if (!getManagementSupport().isDeployed()) {
+ if (getManagementSupport().wasDeployed()) message += " (no longer deployed)";
+ else message += " (not yet deployed)";
+ }
+ if (WARNED_READ_ONLY_ATTRIBUTES.add(attribute.getName())) {
+ LOG.warn(message + " (future messages for this sensor logged at trace)");
+ } else if (LOG.isTraceEnabled()) {
+ LOG.trace(message);
+ }
}
}
T result = attributesInternal.update(attribute, val);
@@ -840,10 +852,15 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E
LOG.trace(""+this+" modifyAttribute "+attribute+" "+modifier);
if (Boolean.TRUE.equals(getManagementSupport().isReadOnlyRaw())) {
+ String message = this+" modifying "+attribute+" = "+modifier+" in read only mode; will have very little effect";
+ if (!getManagementSupport().isDeployed()) {
+ if (getManagementSupport().wasDeployed()) message += " (no longer deployed)";
+ else message += " (not yet deployed)";
+ }
if (WARNED_READ_ONLY_ATTRIBUTES.add(attribute.getName())) {
- LOG.warn(""+this+" modifying "+attribute+" = "+modifier+" in read only mode; will have no effect (future messages for this sensor logged at trace)");
+ LOG.warn(message + " (future messages for this sensor logged at trace)");
} else if (LOG.isTraceEnabled()) {
- LOG.trace(""+this+" setting "+attribute+" = "+modifier+" in read only mode; will have no effect");
+ LOG.trace(message);
}
}
T result = attributesInternal.modify(attribute, modifier);
@@ -1356,7 +1373,8 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E
LOG.warn("Strongly discouraged use of emit with sensor event as value "+sensor+" "+val+"; value should be unpacked!",
new Throwable("location of discouraged event "+sensor+" emit"));
}
- if (LOG.isDebugEnabled()) LOG.debug("Emitting sensor notification {} value {} on {}", new Object[] {sensor.getName(), val, this});
+ BrooklynLogging.log(LOG, BrooklynLogging.levelDebugOrTraceIfReadOnly(this),
+ "Emitting sensor notification {} value {} on {}", sensor.getName(), val, this);
emitInternal(sensor, val);
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/entity/basic/DynamicGroupImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/DynamicGroupImpl.java b/core/src/main/java/brooklyn/entity/basic/DynamicGroupImpl.java
index 2d5a76f..5241d74 100644
--- a/core/src/main/java/brooklyn/entity/basic/DynamicGroupImpl.java
+++ b/core/src/main/java/brooklyn/entity/basic/DynamicGroupImpl.java
@@ -26,6 +26,8 @@ import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import brooklyn.config.BrooklynLogging;
+import brooklyn.config.BrooklynLogging.LoggingLevel;
import brooklyn.entity.Entity;
import brooklyn.event.Sensor;
import brooklyn.event.SensorEvent;
@@ -192,7 +194,8 @@ public class DynamicGroupImpl extends AbstractGroupImpl implements DynamicGroup
return;
}
if (getApplication() == null) {
- log.warn("{} not (yet) scanning for children: no application defined", this);
+ BrooklynLogging.log(log, BrooklynLogging.levelDependingIfReadOnly(this, LoggingLevel.WARN, LoggingLevel.TRACE, LoggingLevel.TRACE),
+ "{} not (yet) scanning for children: no application defined", this);
return;
}
boolean changed = false;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java b/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
index 7ceab81..898de8f 100644
--- a/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
+++ b/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
@@ -29,7 +29,9 @@ import javax.annotation.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import brooklyn.config.BrooklynLogging;
import brooklyn.config.ConfigKey;
+import brooklyn.config.BrooklynLogging.LoggingLevel;
import brooklyn.enricher.Enrichers;
import brooklyn.enricher.basic.AbstractEnricher;
import brooklyn.enricher.basic.AbstractMultipleSensorAggregator;
@@ -142,7 +144,7 @@ public class ServiceStateLogic {
public static void setExpectedState(Entity entity, Lifecycle state) {
if (state==Lifecycle.RUNNING) {
Boolean up = ((EntityInternal)entity).getAttribute(Attributes.SERVICE_UP);
- if (!Boolean.TRUE.equals(up)) {
+ if (!Boolean.TRUE.equals(up) && !Boolean.TRUE.equals(Entities.isReadOnly(entity))) {
// pause briefly to allow any recent problem-clearing processing to complete
Stopwatch timer = Stopwatch.createStarted();
boolean nowUp = Repeater.create().every(Duration.millis(10)).limitTimeTo(Duration.millis(200)).until(entity,
@@ -313,7 +315,8 @@ public class ServiceStateLogic {
if (log.isTraceEnabled()) log.trace("{} setting actual state {}", this, state);
if (((EntityInternal)entity).getManagementSupport().isNoLongerManaged()) {
// won't catch everything, but catches some
- log.debug(entity+" is no longer managed when told to set actual state to "+state+"; suppressing");
+ BrooklynLogging.log(log, BrooklynLogging.levelDebugOrTraceIfReadOnly(entity),
+ entity+" is no longer managed when told to set actual state to "+state+"; suppressing");
return;
}
emit(SERVICE_STATE_ACTUAL, (state==null ? Entities.REMOVE : state));
@@ -440,7 +443,8 @@ public class ServiceStateLogic {
protected void onUpdated() {
if (entity==null || !Entities.isManaged(entity)) {
// either invoked during setup or entity has become unmanaged; just ignore
- if (log.isDebugEnabled()) log.debug("Ignoring {} onUpdated when entity is not in valid state ({})", this, entity);
+ BrooklynLogging.log(log, BrooklynLogging.levelDebugOrTraceIfReadOnly(entity),
+ "Ignoring {} onUpdated when entity is not in valid state ({})", this, entity);
return;
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/entity/group/AbstractMembershipTrackingPolicy.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/group/AbstractMembershipTrackingPolicy.java b/core/src/main/java/brooklyn/entity/group/AbstractMembershipTrackingPolicy.java
index 12100cd..abc5e9d 100644
--- a/core/src/main/java/brooklyn/entity/group/AbstractMembershipTrackingPolicy.java
+++ b/core/src/main/java/brooklyn/entity/group/AbstractMembershipTrackingPolicy.java
@@ -26,6 +26,7 @@ import java.util.concurrent.ConcurrentMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import brooklyn.config.BrooklynLogging;
import brooklyn.config.ConfigKey;
import brooklyn.entity.Entity;
import brooklyn.entity.Group;
@@ -162,7 +163,8 @@ public abstract class AbstractMembershipTrackingPolicy extends AbstractPolicy {
protected void subscribeToGroup(final Group group) {
Preconditions.checkNotNull(group, "The group must not be null");
- LOG.debug("Subscribing to group "+group+", for memberAdded, memberRemoved, and {}", getSensorsToTrack());
+ BrooklynLogging.log(LOG, BrooklynLogging.levelDebugOrTraceIfReadOnly(group),
+ "Subscribing to group "+group+", for memberAdded, memberRemoved, and {}", getSensorsToTrack());
subscribe(group, DynamicGroup.MEMBER_ADDED, new SensorEventListener<Entity>() {
@Override public void onEvent(SensorEvent<Entity> event) {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java b/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
index 3ae6916..1696767 100644
--- a/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
+++ b/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
@@ -168,7 +168,7 @@ public class PeriodicDeltaChangeListener implements ChangeListener {
} catch (Exception e) {
// Don't rethrow: the behaviour of executionManager is different from a scheduledExecutorService,
// if we throw an exception, then our task will never get executed again
- LOG.warn("Problem persisting change-delta", e);
+ LOG.error("Problem persisting change-delta", e);
return null;
} catch (Throwable t) {
LOG.warn("Problem persisting change-delta (rethrowing)", t);
@@ -332,7 +332,7 @@ public class PeriodicDeltaChangeListener implements ChangeListener {
addReferencedObjects(prevDeltaCollector);
- if (LOG.isDebugEnabled()) LOG.debug("Persister delta with references: "
+ if (LOG.isTraceEnabled()) LOG.trace("Persister delta with references: "
+ "updating {} entities, {} locations, {} policies, {} enrichers, {} catalog items; "
+ "removing {} entities, {} locations, {} policies, {} enrichers, {} catalog items",
new Object[] {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
index 09101f6..c2b271e 100644
--- a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
@@ -39,8 +39,10 @@ import brooklyn.catalog.CatalogItem;
import brooklyn.catalog.CatalogLoadMode;
import brooklyn.catalog.internal.BasicBrooklynCatalog;
import brooklyn.catalog.internal.CatalogUtils;
+import brooklyn.config.BrooklynLogging;
import brooklyn.config.BrooklynServerConfig;
import brooklyn.config.ConfigKey;
+import brooklyn.config.BrooklynLogging.LoggingLevel;
import brooklyn.enricher.basic.AbstractEnricher;
import brooklyn.entity.Application;
import brooklyn.entity.Entity;
@@ -95,10 +97,13 @@ import brooklyn.util.task.ScheduledTask;
import brooklyn.util.task.Tasks;
import brooklyn.util.text.Strings;
import brooklyn.util.time.Duration;
+import brooklyn.util.time.Time;
import com.google.api.client.repackaged.com.google.common.base.Preconditions;
+import com.google.common.annotations.Beta;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
+import com.google.common.base.Stopwatch;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@@ -141,6 +146,7 @@ public class RebindManagerImpl implements RebindManager {
private volatile boolean readOnlyRunning = false;
private volatile ScheduledTask readOnlyTask = null;
private transient Semaphore rebindActive = new Semaphore(1);
+ private transient int readOnlyRebindCount = Integer.MIN_VALUE;
private volatile BrooklynMementoPersister persistenceStoreAccess;
@@ -161,6 +167,7 @@ public class RebindManagerImpl implements RebindManager {
*
* @author aled
*/
+ @Beta
public static class RebindTracker {
private static ThreadLocal<Boolean> rebinding = new ThreadLocal<Boolean>();
@@ -191,7 +198,7 @@ public class RebindManagerImpl implements RebindManager {
addPolicyFailureMode = managementContext.getConfig().getConfig(ADD_POLICY_FAILURE_MODE);
loadPolicyFailureMode = managementContext.getConfig().getConfig(LOAD_POLICY_FAILURE_MODE);
- LOG.debug("Persistence in {} of: policies={}, enrichers={}, feeds={}, catalog={}",
+ LOG.debug("{} initialized, settings: policies={}, enrichers={}, feeds={}, catalog={}",
new Object[]{this, persistPoliciesEnabled, persistEnrichersEnabled, persistFeedsEnabled, persistCatalogItemsEnabled});
}
@@ -251,15 +258,16 @@ public class RebindManagerImpl implements RebindManager {
if (readOnlyRunning) {
throw new IllegalStateException("Cannot start read-only when already running with persistence");
}
- LOG.debug("Starting persistence, mgmt "+managementContext.getManagementNodeId());
+ LOG.debug("Starting persistence ("+this+"), mgmt "+managementContext.getManagementNodeId());
persistenceRunning = true;
+ readOnlyRebindCount = Integer.MIN_VALUE;
persistenceStoreAccess.enableWriteAccess();
if (persistenceRealChangeListener != null) persistenceRealChangeListener.start();
}
@Override
public void stopPersistence() {
- LOG.debug("Stopping rebind (persistence), mgmt "+managementContext.getManagementNodeId());
+ LOG.debug("Stopping persistence ("+this+"), mgmt "+managementContext.getManagementNodeId());
persistenceRunning = false;
if (persistenceRealChangeListener != null) persistenceRealChangeListener.stop();
if (persistenceStoreAccess != null) persistenceStoreAccess.disableWriteAccess(true);
@@ -276,12 +284,13 @@ public class RebindManagerImpl implements RebindManager {
LOG.warn("Cannot request read-only mode for "+this+" when already running - "+readOnlyTask+"; ignoring");
return;
}
- LOG.debug("Starting read-only rebinding, mgmt "+managementContext.getManagementNodeId());
+ LOG.debug("Starting read-only rebinding ("+this+"), mgmt "+managementContext.getManagementNodeId());
if (persistenceRealChangeListener != null) persistenceRealChangeListener.stop();
if (persistenceStoreAccess != null) persistenceStoreAccess.disableWriteAccess(true);
readOnlyRunning = true;
+ readOnlyRebindCount = 0;
try {
rebind(null, null, ManagementNodeState.HOT_STANDBY);
@@ -295,21 +304,24 @@ public class RebindManagerImpl implements RebindManager {
public Void call() {
try {
rebind(null, null, ManagementNodeState.HOT_STANDBY);
+ readOnlyRebindCount++;
return null;
} catch (RuntimeInterruptedException e) {
LOG.debug("Interrupted rebinding (re-interrupting): "+e);
if (LOG.isTraceEnabled())
- LOG.trace("Interrupted rebinding (re-interrupting): "+e, e);
+ LOG.trace("Interrupted rebinding (re-interrupting), details: "+e, e);
Thread.currentThread().interrupt();
return null;
} catch (Exception e) {
// Don't rethrow: the behaviour of executionManager is different from a scheduledExecutorService,
// if we throw an exception, then our task will never get executed again
if (!readOnlyRunning) {
- if (LOG.isTraceEnabled())
- LOG.trace("Problem rebinding (read-only running turned off): "+e, e);
+ LOG.debug("Problem rebinding (read-only running has probably just been turned off): "+e);
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Problem rebinding (read-only running has probably just been turned off), details: "+e, e);
+ }
} else {
- LOG.warn("Problem rebinding: "+Exceptions.collapseText(e), e);
+ LOG.error("Problem rebinding: "+Exceptions.collapseText(e), e);
}
return null;
} catch (Throwable t) {
@@ -327,7 +339,7 @@ public class RebindManagerImpl implements RebindManager {
public void stopReadOnly() {
readOnlyRunning = false;
if (readOnlyTask!=null) {
- LOG.debug("Stopping read-only rebinding, mgmt "+managementContext.getManagementNodeId());
+ LOG.debug("Stopping read-only rebinding ("+this+"), mgmt "+managementContext.getManagementNodeId());
readOnlyTask.cancel(true);
readOnlyTask.blockUntilEnded();
boolean reallyEnded = Tasks.blockUntilInternalTasksEnded(readOnlyTask, Duration.TEN_SECONDS);
@@ -335,7 +347,7 @@ public class RebindManagerImpl implements RebindManager {
LOG.warn("Rebind (read-only) tasks took too long to die after interrupt (ignoring): "+readOnlyTask);
}
readOnlyTask = null;
- LOG.debug("Stopped read-only rebinding, mgmt "+managementContext.getManagementNodeId());
+ LOG.debug("Stopped read-only rebinding ("+this+"), mgmt "+managementContext.getManagementNodeId());
}
}
@@ -476,6 +488,7 @@ public class RebindManagerImpl implements RebindManager {
} catch (InterruptedException e1) { Exceptions.propagate(e1); }
RebindTracker.setRebinding();
try {
+ Stopwatch timer = Stopwatch.createStarted();
exceptionHandler.onStart();
Reflections reflections = new Reflections(classLoader);
@@ -527,20 +540,18 @@ public class RebindManagerImpl implements RebindManager {
//The manifest contains full catalog items mementos. Reading them at this stage means that
//we don't support references to entities/locations withing tags.
+
+ LOG.debug("Rebinding ("+mode+", iteration "+readOnlyRebindCount+") from "+getPersister().getBackingStoreDescription()+"...");
BrooklynMementoManifest mementoManifest = persistenceStoreAccess.loadMementoManifest(exceptionHandler);
boolean isEmpty = mementoManifest.isEmpty();
- if (!isEmpty) {
- if (mode==ManagementNodeState.HOT_STANDBY)
- LOG.debug("Rebinding (read-only) from "+getPersister().getBackingStoreDescription()+"...");
- else
+ if (mode!=ManagementNodeState.HOT_STANDBY) {
+ if (!isEmpty) {
LOG.info("Rebinding from "+getPersister().getBackingStoreDescription()+"...");
- } else {
- if (mode==ManagementNodeState.HOT_STANDBY)
- LOG.debug("Rebind check (read-only): no existing state, reading from "+getPersister().getBackingStoreDescription());
- else
+ } else {
LOG.info("Rebind check: no existing state; will persist new items to "+getPersister().getBackingStoreDescription());
+ }
}
//
@@ -549,7 +560,7 @@ public class RebindManagerImpl implements RebindManager {
// Instantiate catalog items
if (persistCatalogItemsEnabled) {
- LOG.debug("RebindManager instantiating catalog items: {}", mementoManifest.getCatalogItemIds());
+ logRebindingDebug("RebindManager instantiating catalog items: {}", mementoManifest.getCatalogItemIds());
for (CatalogItemMemento catalogItemMemento : mementoManifest.getCatalogItemMementos().values()) {
if (LOG.isDebugEnabled()) LOG.debug("RebindManager instantiating catalog item {}", catalogItemMemento);
try {
@@ -560,15 +571,15 @@ public class RebindManagerImpl implements RebindManager {
}
}
} else {
- LOG.debug("Not rebinding catalog; feature disabled: {}", mementoManifest.getCatalogItemIds());
+ logRebindingDebug("Not rebinding catalog; feature disabled: {}", mementoManifest.getCatalogItemIds());
}
// Reconstruct catalog entries
if (persistCatalogItemsEnabled) {
- LOG.debug("RebindManager reconstructing catalog items");
+ logRebindingDebug("RebindManager reconstructing catalog items");
for (CatalogItemMemento catalogItemMemento : mementoManifest.getCatalogItemMementos().values()) {
CatalogItem<?, ?> item = rebindContext.getCatalogItem(catalogItemMemento.getId());
- LOG.debug("RebindManager reconstructing catalog item {}", catalogItemMemento);
+ logRebindingDebug("RebindManager reconstructing catalog item {}", catalogItemMemento);
if (item == null) {
exceptionHandler.onNotFound(BrooklynObjectType.CATALOG_ITEM, catalogItemMemento.getId());
} else {
@@ -593,27 +604,27 @@ public class RebindManagerImpl implements RebindManager {
|| (isEmpty && catalogLoadMode == CatalogLoadMode.LOAD_BROOKLYN_CATALOG_URL_IF_NO_PERSISTED_STATE);
if (shouldResetCatalog) {
// Reset catalog with previously persisted state
- LOG.debug("RebindManager resetting management context catalog to previously persisted state");
+ logRebindingDebug("RebindManager resetting management context catalog to previously persisted state");
managementContext.getCatalog().reset(rebindContext.getCatalogItems());
} else if (shouldLoadDefaultCatalog) {
// Load catalogue as normal
// TODO in read-only mode, should do this less frequently than entities etc
- LOG.debug("RebindManager loading default catalog");
+ logRebindingDebug("RebindManager loading default catalog");
((BasicBrooklynCatalog) managementContext.getCatalog()).resetCatalogToContentsAtConfiguredUrl();
} else {
// Management context should have taken care of loading the catalogue
Collection<CatalogItem<?, ?>> catalogItems = rebindContext.getCatalogItems();
String message = "RebindManager not resetting catalog to persisted state. Catalog load mode is {}.";
- if (!catalogItems.isEmpty()) {
+ if (!catalogItems.isEmpty() && shouldLogRebinding()) {
LOG.info(message + " There {} {} item{} persisted.", new Object[]{
catalogLoadMode, catalogItems.size() == 1 ? "was" : "were", catalogItems.size(), Strings.s(catalogItems)});
} else if (LOG.isDebugEnabled()) {
- LOG.debug(message, catalogLoadMode);
+ logRebindingDebug(message, catalogLoadMode);
}
}
// TODO destroy old (as above)
} else {
- LOG.debug("RebindManager not resetting catalog because catalog persistence is disabled");
+ logRebindingDebug("RebindManager not resetting catalog because catalog persistence is disabled");
}
@@ -622,7 +633,7 @@ public class RebindManagerImpl implements RebindManager {
//
// Instantiate locations
- LOG.debug("RebindManager instantiating locations: {}", mementoManifest.getLocationIdToType().keySet());
+ logRebindingDebug("RebindManager instantiating locations: {}", mementoManifest.getLocationIdToType().keySet());
for (Map.Entry<String, String> entry : mementoManifest.getLocationIdToType().entrySet()) {
String locId = entry.getKey();
String locType = entry.getValue();
@@ -637,7 +648,7 @@ public class RebindManagerImpl implements RebindManager {
}
// Instantiate entities
- LOG.debug("RebindManager instantiating entities: {}", mementoManifest.getEntityIdToManifest().keySet());
+ logRebindingDebug("RebindManager instantiating entities: {}", mementoManifest.getEntityIdToManifest().keySet());
for (Map.Entry<String, EntityMementoManifest> entry : mementoManifest.getEntityIdToManifest().entrySet()) {
String entityId = entry.getKey();
EntityMementoManifest entityManifest = entry.getValue();
@@ -668,9 +679,9 @@ public class RebindManagerImpl implements RebindManager {
// Instantiate policies
if (persistPoliciesEnabled) {
- LOG.debug("RebindManager instantiating policies: {}", memento.getPolicyIds());
+ logRebindingDebug("RebindManager instantiating policies: {}", memento.getPolicyIds());
for (PolicyMemento policyMemento : memento.getPolicyMementos().values()) {
- if (LOG.isDebugEnabled()) LOG.debug("RebindManager instantiating policy {}", policyMemento);
+ logRebindingDebug("RebindManager instantiating policy {}", policyMemento);
try {
Policy policy = newPolicy(policyMemento, getLoadingContextFromCatalogItemId(policyMemento.getCatalogItemId(), classLoader, rebindContext));
@@ -680,14 +691,14 @@ public class RebindManagerImpl implements RebindManager {
}
}
} else {
- LOG.debug("Not rebinding policies; feature disabled: {}", memento.getPolicyIds());
+ logRebindingDebug("Not rebinding policies; feature disabled: {}", memento.getPolicyIds());
}
// Instantiate enrichers
if (persistEnrichersEnabled) {
- LOG.debug("RebindManager instantiating enrichers: {}", memento.getEnricherIds());
+ logRebindingDebug("RebindManager instantiating enrichers: {}", memento.getEnricherIds());
for (EnricherMemento enricherMemento : memento.getEnricherMementos().values()) {
- if (LOG.isDebugEnabled()) LOG.debug("RebindManager instantiating enricher {}", enricherMemento);
+ logRebindingDebug("RebindManager instantiating enricher {}", enricherMemento);
try {
Enricher enricher = newEnricher(enricherMemento, reflections);
@@ -697,12 +708,12 @@ public class RebindManagerImpl implements RebindManager {
}
}
} else {
- LOG.debug("Not rebinding enrichers; feature disabled: {}", memento.getEnricherIds());
+ logRebindingDebug("Not rebinding enrichers; feature disabled: {}", memento.getEnricherIds());
}
// Instantiate feeds
if (persistFeedsEnabled) {
- LOG.debug("RebindManager instantiating feeds: {}", memento.getFeedIds());
+ logRebindingDebug("RebindManager instantiating feeds: {}", memento.getFeedIds());
for (FeedMemento feedMemento : memento.getFeedMementos().values()) {
if (LOG.isDebugEnabled()) LOG.debug("RebindManager instantiating feed {}", feedMemento);
@@ -714,7 +725,7 @@ public class RebindManagerImpl implements RebindManager {
}
}
} else {
- LOG.debug("Not rebinding feeds; feature disabled: {}", memento.getFeedIds());
+ logRebindingDebug("Not rebinding feeds; feature disabled: {}", memento.getFeedIds());
}
//
@@ -722,10 +733,10 @@ public class RebindManagerImpl implements RebindManager {
//
// Reconstruct locations
- LOG.debug("RebindManager reconstructing locations");
+ logRebindingDebug("RebindManager reconstructing locations");
for (LocationMemento locMemento : sortParentFirst(memento.getLocationMementos()).values()) {
Location location = rebindContext.getLocation(locMemento.getId());
- if (LOG.isDebugEnabled()) LOG.debug("RebindManager reconstructing location {}", locMemento);
+ logRebindingDebug("RebindManager reconstructing location {}", locMemento);
if (location == null) {
// usually because of creation-failure, when not using fail-fast
exceptionHandler.onNotFound(BrooklynObjectType.LOCATION, locMemento.getId());
@@ -740,10 +751,10 @@ public class RebindManagerImpl implements RebindManager {
// Reconstruct policies
if (persistPoliciesEnabled) {
- LOG.debug("RebindManager reconstructing policies");
+ logRebindingDebug("RebindManager reconstructing policies");
for (PolicyMemento policyMemento : memento.getPolicyMementos().values()) {
Policy policy = rebindContext.getPolicy(policyMemento.getId());
- if (LOG.isDebugEnabled()) LOG.debug("RebindManager reconstructing policy {}", policyMemento);
+ logRebindingDebug("RebindManager reconstructing policy {}", policyMemento);
if (policy == null) {
// usually because of creation-failure, when not using fail-fast
@@ -761,10 +772,10 @@ public class RebindManagerImpl implements RebindManager {
// Reconstruct enrichers
if (persistEnrichersEnabled) {
- LOG.debug("RebindManager reconstructing enrichers");
+ logRebindingDebug("RebindManager reconstructing enrichers");
for (EnricherMemento enricherMemento : memento.getEnricherMementos().values()) {
Enricher enricher = rebindContext.getEnricher(enricherMemento.getId());
- if (LOG.isDebugEnabled()) LOG.debug("RebindManager reconstructing enricher {}", enricherMemento);
+ logRebindingDebug("RebindManager reconstructing enricher {}", enricherMemento);
if (enricher == null) {
// usually because of creation-failure, when not using fail-fast
@@ -782,10 +793,10 @@ public class RebindManagerImpl implements RebindManager {
// Reconstruct feeds
if (persistFeedsEnabled) {
- LOG.debug("RebindManager reconstructing feeds");
+ logRebindingDebug("RebindManager reconstructing feeds");
for (FeedMemento feedMemento : memento.getFeedMementos().values()) {
Feed feed = rebindContext.getFeed(feedMemento.getId());
- if (LOG.isDebugEnabled()) LOG.debug("RebindManager reconstructing feed {}", feedMemento);
+ logRebindingDebug("RebindManager reconstructing feed {}", feedMemento);
if (feed == null) {
// usually because of creation-failure, when not using fail-fast
@@ -803,10 +814,10 @@ public class RebindManagerImpl implements RebindManager {
}
// Reconstruct entities
- LOG.debug("RebindManager reconstructing entities");
+ logRebindingDebug("RebindManager reconstructing entities");
for (EntityMemento entityMemento : sortParentFirst(memento.getEntityMementos()).values()) {
Entity entity = rebindContext.getEntity(entityMemento.getId());
- if (LOG.isDebugEnabled()) LOG.debug("RebindManager reconstructing entity {}", entityMemento);
+ logRebindingDebug("RebindManager reconstructing entity {}", entityMemento);
if (entity == null) {
// usually because of creation-failure, when not using fail-fast
@@ -826,10 +837,10 @@ public class RebindManagerImpl implements RebindManager {
//
// Associate policies+enrichers+feeds with entities
- LOG.debug("RebindManager reconstructing entities");
+ logRebindingDebug("RebindManager reconstructing entities");
for (EntityMemento entityMemento : sortParentFirst(memento.getEntityMementos()).values()) {
Entity entity = rebindContext.getEntity(entityMemento.getId());
- if (LOG.isDebugEnabled()) LOG.debug("RebindManager reconstructing entity {}", entityMemento);
+ logRebindingDebug("RebindManager reconstructing entity {}", entityMemento);
if (entity == null) {
// usually because of creation-failure, when not using fail-fast
@@ -853,7 +864,7 @@ public class RebindManagerImpl implements RebindManager {
// PHASE EIGHT
//
- LOG.debug("RebindManager managing locations");
+ logRebindingDebug("RebindManager managing locations");
LocationManagerInternal locationManager = (LocationManagerInternal)managementContext.getLocationManager();
Set<String> oldLocations = Sets.newLinkedHashSet(locationManager.getLocationIds());
for (Location location: rebindContext.getLocations()) {
@@ -878,7 +889,7 @@ public class RebindManagerImpl implements RebindManager {
}
// Manage the top-level apps (causing everything under them to become managed)
- LOG.debug("RebindManager managing entities");
+ logRebindingDebug("RebindManager managing entities");
EntityManagerInternal entityManager = (EntityManagerInternal)managementContext.getEntityManager();
Set<String> oldEntities = Sets.newLinkedHashSet(entityManager.getEntityIds());
for (Entity entity: rebindContext.getEntities()) {
@@ -909,9 +920,11 @@ public class RebindManagerImpl implements RebindManager {
exceptionHandler.onDone();
- if (!isEmpty && mode!=ManagementNodeState.HOT_STANDBY) {
- LOG.info("Rebind complete: {} app{}, {} entit{}, {} location{}, {} polic{}, {} enricher{}, {} feed{}, {} catalog item{}", new Object[]{
- apps.size(), Strings.s(apps),
+ if (!isEmpty) {
+ BrooklynLogging.log(LOG, shouldLogRebinding() ? LoggingLevel.INFO : LoggingLevel.DEBUG,
+ "Rebind complete " + "("+mode+(readOnlyRebindCount>=0 ? ", iteration "+readOnlyRebindCount : "")+")" +
+ " in {}: {} app{}, {} entit{}, {} location{}, {} polic{}, {} enricher{}, {} feed{}, {} catalog item{}", new Object[]{
+ Time.makeTimeStringRounded(timer), apps.size(), Strings.s(apps),
rebindContext.getEntities().size(), Strings.ies(rebindContext.getEntities()),
rebindContext.getLocations().size(), Strings.s(rebindContext.getLocations()),
rebindContext.getPolicies().size(), Strings.ies(rebindContext.getPolicies()),
@@ -922,7 +935,7 @@ public class RebindManagerImpl implements RebindManager {
}
// Return the top-level applications
- LOG.debug("RebindManager complete; return apps: {}", memento.getApplicationIds());
+ logRebindingDebug("RebindManager complete; apps: {}", memento.getApplicationIds());
return apps;
} catch (Exception e) {
@@ -1235,7 +1248,20 @@ public class RebindManagerImpl implements RebindManager {
}
}
}
+
+ /** logs at debug, except during subsequent read-only rebinds, in which it logs trace */
+ private void logRebindingDebug(String message, Object... args) {
+ if (shouldLogRebinding()) {
+ LOG.debug(message, args);
+ } else {
+ LOG.trace(message, args);
+ }
+ }
+ protected boolean shouldLogRebinding() {
+ return (readOnlyRebindCount < 5) || (readOnlyRebindCount%1000==0);
+ }
+
@Override
public String toString() {
return super.toString()+"[mgmt="+managementContext.getManagementNodeId()+"]";
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
index 6ab8a7c..8faa80f 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
@@ -301,10 +301,11 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
BrooklynMementoManifest result = builder.build();
if (LOG.isDebugEnabled()) {
- LOG.debug("Loaded memento manifest; took {}; {} entities, {} locations, {} policies, {} enrichers, {} feeds, {} catalog items, from {}", new Object[]{
- Time.makeTimeStringRounded(stopwatch.elapsed(TimeUnit.MILLISECONDS)), result.getEntityIdToManifest().size(),
- result.getLocationIdToType().size(), result.getPolicyIdToType().size(), result.getEnricherIdToType().size(),
- result.getFeedIdToType().size(), result.getCatalogItemMementos().size(),
+ LOG.debug("Loaded rebind manifests; took {}: {} entities, {} locations, {} policies, {} enrichers, {} feeds, {} catalog items; from {}", new Object[]{
+ Time.makeTimeStringRounded(stopwatch),
+ result.getEntityIdToManifest().size(), result.getLocationIdToType().size(),
+ result.getPolicyIdToType().size(), result.getEnricherIdToType().size(), result.getFeedIdToType().size(),
+ result.getCatalogItemMementos().size(),
objectStore.getSummaryName() });
}
@@ -343,7 +344,7 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
BrooklynMemento result = builder.build();
if (LOG.isDebugEnabled()) {
- LOG.debug("Loaded memento; took {}; {} entities, {} locations, {} policies, {} enrichers, {} feeds, {} catalog items, from {}", new Object[]{
+ LOG.debug("Loaded rebind mementos; took {}: {} entities, {} locations, {} policies, {} enrichers, {} feeds, {} catalog items, from {}", new Object[]{
Time.makeTimeStringRounded(stopwatch.elapsed(TimeUnit.MILLISECONDS)), result.getEntityIds().size(),
result.getLocationIds().size(), result.getPolicyIds().size(), result.getEnricherIds().size(),
result.getFeedIds().size(), result.getCatalogItemIds().size(),
@@ -364,6 +365,7 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
List<String> feedSubPathList;
List<String> catalogSubPathList;
+ Stopwatch stopwatch = Stopwatch.createStarted();
try {
entitySubPathList = objectStore.listContentsWithSubPath("entities");
locationSubPathList = objectStore.listContentsWithSubPath("locations");
@@ -377,7 +379,8 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
throw new IllegalStateException("Failed to list memento files in "+objectStore, e);
}
- LOG.debug("Scanning persisted state: {} entities, {} locations, {} policies, {} enrichers, {} feeds, {} catalog items from {}", new Object[]{
+ LOG.debug("Loaded rebind lists; took {}: {} entities, {} locations, {} policies, {} enrichers, {} feeds, {} catalog items; from {}", new Object[]{
+ Time.makeTimeStringRounded(stopwatch),
entitySubPathList.size(), locationSubPathList.size(), policySubPathList.size(), enricherSubPathList.size(),
feedSubPathList.size(), catalogSubPathList.size(),
objectStore.getSummaryName() });
@@ -498,7 +501,6 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
Futures.successfulAsList(futures).get();
Futures.allAsList(futures).get();
} catch (Exception e) {
- // TODO is the logging here as good as it was prior to https://github.com/apache/incubator-brooklyn/pull/177/files ?
throw Exceptions.propagate(e);
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/event/basic/AttributeMap.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/event/basic/AttributeMap.java b/core/src/main/java/brooklyn/event/basic/AttributeMap.java
index 08f1f91..da933c7 100644
--- a/core/src/main/java/brooklyn/event/basic/AttributeMap.java
+++ b/core/src/main/java/brooklyn/event/basic/AttributeMap.java
@@ -27,6 +27,7 @@ import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import brooklyn.config.BrooklynLogging;
import brooklyn.entity.Entity;
import brooklyn.entity.basic.AbstractEntity;
import brooklyn.event.AttributeSensor;
@@ -153,9 +154,8 @@ public final class AttributeMap implements Serializable {
}
public void remove(AttributeSensor<?> attribute) {
- if (log.isDebugEnabled()) {
- log.debug("removing attribute {} on {}", attribute.getName(), entity);
- }
+ BrooklynLogging.log(log, BrooklynLogging.levelDebugOrTraceIfReadOnly(entity),
+ "removing attribute {} on {}", attribute.getName(), entity);
remove(attribute.getNameParts());
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/management/ha/ManagementPlaneSyncRecordDeltaImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/ha/ManagementPlaneSyncRecordDeltaImpl.java b/core/src/main/java/brooklyn/management/ha/ManagementPlaneSyncRecordDeltaImpl.java
index b54b9ef..6b026bc 100644
--- a/core/src/main/java/brooklyn/management/ha/ManagementPlaneSyncRecordDeltaImpl.java
+++ b/core/src/main/java/brooklyn/management/ha/ManagementPlaneSyncRecordDeltaImpl.java
@@ -25,6 +25,7 @@ import java.util.Collection;
import brooklyn.management.ha.ManagementPlaneSyncRecordPersister.Delta;
+import com.google.api.client.repackaged.com.google.common.base.Objects;
import com.google.common.annotations.Beta;
import com.google.common.collect.Sets;
@@ -108,4 +109,14 @@ public class ManagementPlaneSyncRecordDeltaImpl implements Delta {
public String getExpectedMasterToClear() {
return expectedOldMaster;
}
+
+ @Override
+ public String toString() {
+ return getClass().getCanonicalName()+"["+
+ (masterChange!=null && masterChange != MasterChange.NO_CHANGE ?
+ masterChange+": "+expectedOldMaster+"->"+masterId+"; " : "")+
+ "nodes: "+nodes+
+ (removedNodeIds!=null && !removedNodeIds.isEmpty() ? "; removing: "+removedNodeIds : "")
+ +"]";
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/management/ha/ManagementPlaneSyncRecordPersisterToObjectStore.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/ha/ManagementPlaneSyncRecordPersisterToObjectStore.java b/core/src/main/java/brooklyn/management/ha/ManagementPlaneSyncRecordPersisterToObjectStore.java
index 950f2b8..b9cf465 100644
--- a/core/src/main/java/brooklyn/management/ha/ManagementPlaneSyncRecordPersisterToObjectStore.java
+++ b/core/src/main/java/brooklyn/management/ha/ManagementPlaneSyncRecordPersisterToObjectStore.java
@@ -236,7 +236,8 @@ public class ManagementPlaneSyncRecordPersisterToObjectStore implements Manageme
}
init();
- if (LOG.isDebugEnabled()) LOG.debug("Checkpointed delta of manager-memento; updating {}", delta);
+ Stopwatch stopwatch = Stopwatch.createStarted();
+ if (LOG.isTraceEnabled()) LOG.trace("Checkpointing delta of manager-memento; updating {}", delta);
for (ManagementNodeSyncRecord m : delta.getNodes()) {
persist(m);
@@ -256,15 +257,18 @@ public class ManagementPlaneSyncRecordPersisterToObjectStore implements Manageme
default:
throw new IllegalStateException("Unknown state for master-change: "+delta.getMasterChange());
}
+ if (LOG.isDebugEnabled()) LOG.debug("Checkpointed delta of manager-memento in "+Time.makeTimeStringRounded(stopwatch)+": "+delta);
}
private void persistMaster(String nodeId, String optionalExpectedId) {
if (optionalExpectedId!=null) {
String currentRemoteMaster = masterWriter.get();
if (currentRemoteMaster==null) {
- // nothing at remote is okay
+ // okay to have nothing at remote
} else if (!currentRemoteMaster.trim().equals(optionalExpectedId.trim())) {
- LOG.warn("Master at server is "+currentRemoteMaster+"; expected "+optionalExpectedId+" in order to set as "+nodeId+", so not applying (yet)");
+ LOG.warn("Master at server is "+currentRemoteMaster+"; expected "+optionalExpectedId+" "
+ + (Strings.isNonBlank(nodeId) ? "and would set as "+nodeId : "and would clear")
+ + ", so not applying (yet)");
return;
}
}
@@ -333,5 +337,5 @@ public class ManagementPlaneSyncRecordPersisterToObjectStore implements Manageme
}
return writer;
}
-
+
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/management/ha/OsgiManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/ha/OsgiManager.java b/core/src/main/java/brooklyn/management/ha/OsgiManager.java
index 7f6ca52..3dea979 100644
--- a/core/src/main/java/brooklyn/management/ha/OsgiManager.java
+++ b/core/src/main/java/brooklyn/management/ha/OsgiManager.java
@@ -35,6 +35,7 @@ import brooklyn.util.collections.MutableMap;
import brooklyn.util.exceptions.Exceptions;
import brooklyn.util.guava.Maybe;
import brooklyn.util.os.Os;
+import brooklyn.util.os.Os.DeletionResult;
import brooklyn.util.osgi.Osgis;
import com.google.common.base.Throwables;
@@ -76,7 +77,11 @@ public class OsgiManager {
} catch (InterruptedException e) {
throw Exceptions.propagate(e);
}
- osgiTempDir = Os.deleteRecursively(osgiTempDir).asNullOrThrowing();
+ DeletionResult deleteRecursively = Os.deleteRecursively(osgiTempDir);
+ if (deleteRecursively.getThrowable()!=null) {
+ log.debug("Unable to delete "+osgiTempDir+" (possibly already deleted?): "+deleteRecursively.getThrowable());
+ }
+ osgiTempDir = null;
framework = null;
}
@@ -85,12 +90,14 @@ public class OsgiManager {
String nv = bundleUrlToNameVersionString.get(bundleUrl);
if (nv!=null) {
if (Osgis.getBundle(framework, nv).isPresent()) {
- log.debug("Bundle from "+bundleUrl+" already installed as "+nv+"; not re-registering");
+ log.trace("Bundle from "+bundleUrl+" already installed as "+nv+"; not re-registering");
return;
}
}
Bundle b = Osgis.install(framework, bundleUrl);
nv = b.getSymbolicName()+":"+b.getVersion().toString();
+ // TODO if there is another entry for name:version we should log a warning at the very least,
+ // or better provide a way to get back *this* bundle
bundleUrlToNameVersionString.put(bundleUrl, nv);
log.debug("Bundle from "+bundleUrl+" successfully installed as " + nv + " ("+b+")");
} catch (BundleException e) {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java b/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java
index 8a10727..fdb087b 100644
--- a/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java
+++ b/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java
@@ -34,6 +34,7 @@ import javax.annotation.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import brooklyn.config.BrooklynLogging;
import brooklyn.entity.Application;
import brooklyn.entity.Entity;
import brooklyn.entity.Group;
@@ -575,7 +576,8 @@ public class LocalEntityManager implements EntityManagerInternal {
return false;
}
- if (log.isDebugEnabled()) log.debug("{} starting management of entity {}", this, e);
+ BrooklynLogging.log(log, BrooklynLogging.levelDebugOrTraceIfReadOnly(e),
+ "{} starting management of entity {}", this, e);
Entity realE = toRealEntity(e);
Entity oldProxy = entityProxiesById.get(e.getId());
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/core/src/main/java/brooklyn/management/internal/LocalLocationManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/LocalLocationManager.java b/core/src/main/java/brooklyn/management/internal/LocalLocationManager.java
index bbb5c19..f81cb98 100644
--- a/core/src/main/java/brooklyn/management/internal/LocalLocationManager.java
+++ b/core/src/main/java/brooklyn/management/internal/LocalLocationManager.java
@@ -28,6 +28,8 @@ import java.util.concurrent.atomic.AtomicLong;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import brooklyn.config.BrooklynLogging;
+import brooklyn.config.BrooklynLogging.LoggingLevel;
import brooklyn.config.ConfigKey;
import brooklyn.entity.basic.ConfigKeys;
import brooklyn.entity.basic.Lifecycle;
@@ -212,11 +214,13 @@ public class LocalLocationManager implements LocationManagerInternal {
long count = LOCATION_CNT.incrementAndGet();
if (log.isDebugEnabled()) {
String msg = "Managing location " + loc + " ("+initialMode+"), from " + Tasks.current()+" / "+Entitlements.getEntitlementContext();
+ LoggingLevel level = (initialMode==ManagementTransitionMode.REBINDING_READONLY ? LoggingLevel.TRACE : LoggingLevel.DEBUG);
if (count % 100 == 0) {
// include trace periodically in case we get leaks or too much location management
- log.debug(msg, new Exception("Informational stack trace of call to manage location "+loc+" ("+count+" calls; "+getLocations().size()+" currently managed)"));
+ BrooklynLogging.log(log, level,
+ msg, new Exception("Informational stack trace of call to manage location "+loc+" ("+count+" calls; "+getLocations().size()+" currently managed)"));
} else {
- log.debug(msg);
+ BrooklynLogging.log(log, level, msg);
}
}
@@ -240,7 +244,9 @@ public class LocalLocationManager implements LocationManagerInternal {
it.setManagementContext(managementContext);
if (!mode.isReadOnly()) {
it.onManagementStarted();
- recordLocationEvent(it, Lifecycle.CREATED);
+ if (!mode.wasReadOnly()) {
+ recordLocationEvent(it, Lifecycle.CREATED);
+ }
}
managementContext.getRebindManager().getChangeListener().onManaged(it);
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/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 8757404..f04055e 100644
--- a/core/src/main/java/brooklyn/management/usage/LocationUsage.java
+++ b/core/src/main/java/brooklyn/management/usage/LocationUsage.java
@@ -47,7 +47,7 @@ public class LocationUsage {
this.state = checkNotNull(state, "state");
this.entityId = checkNotNull(entityId, "entityId");
this.entityType = checkNotNull(entityType, "entityType");
- this.applicationId = checkNotNull(applicationId, "applicationId");
+ this.applicationId = checkNotNull(applicationId, "applicationId (entity "+entityId+")");
}
public Date getDate() {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsUtil.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsUtil.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsUtil.java
index 540c707..e707495 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsUtil.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsUtil.java
@@ -277,7 +277,7 @@ public class JcloudsUtil implements JcloudsLocationConfig {
if (allowReuse) {
ComputeService result = cachedComputeServices.get(cacheKey);
if (result!=null) {
- LOG.debug("jclouds ComputeService cache hit for compute service, for "+Entities.sanitize(properties));
+ LOG.trace("jclouds ComputeService cache hit for compute service, for "+Entities.sanitize(properties));
return result;
}
LOG.debug("jclouds ComputeService cache miss for compute service, creating, for "+Entities.sanitize(properties));
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/utils/common/src/main/java/brooklyn/util/javalang/Equals.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/brooklyn/util/javalang/Equals.java b/utils/common/src/main/java/brooklyn/util/javalang/Equals.java
new file mode 100644
index 0000000..89736b4
--- /dev/null
+++ b/utils/common/src/main/java/brooklyn/util/javalang/Equals.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package brooklyn.util.javalang;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Objects;
+
+
+public class Equals {
+
+ /** Tests whether the objects given are either all null or all equal to the first argument */
+ public static boolean objects(Object o1, Object o2, Object... oo) {
+ if (!Objects.equal(o1, o2)) return false;
+ for (Object o: oo)
+ if (!Objects.equal(o1, o)) return false;
+ return true;
+ }
+
+ /** Tests whether the two objects given are either all null or all approximately equal
+ * (tolerance of 0.001 for floating point, but subject to change) */
+ // relatively high tolerance mainly due to enrichers such as Tomcat windowed average, in hot standby;
+ // could make smaller
+ @Beta
+ public static boolean approximately(Object o1, Object o2) {
+ if (o1 instanceof Number) {
+ if (o2 instanceof Number) {
+ return Math.abs( ((Number)o2).doubleValue()-((Number)o1).doubleValue() ) < 0.001;
+ }
+ }
+ return Objects.equal(o1, o2);
+ }
+
+ /** As {@link #approximately(Object, Object)} but testing all the arguments given. */
+ @Beta
+ public static boolean approximately(Object o1, Object o2, Object o3, Object... oo) {
+ if (!approximately(o1, o2)) return false;
+ if (!approximately(o1, o3)) return false;
+ for (Object o: oo)
+ if (!approximately(o1, o)) return false;
+ return true;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/utils/common/src/main/java/brooklyn/util/time/Time.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/brooklyn/util/time/Time.java b/utils/common/src/main/java/brooklyn/util/time/Time.java
index 60025a4..7c0612f 100644
--- a/utils/common/src/main/java/brooklyn/util/time/Time.java
+++ b/utils/common/src/main/java/brooklyn/util/time/Time.java
@@ -134,7 +134,9 @@ public class Time {
/** @see #makeTimeString(long, boolean) */
public static String makeTimeStringNano(long tn, boolean round) {
if (tn<0) return "-"+makeTimeStringNano(-tn, round);
- if (tn==0) return "0";
+ // units don't matter, but since ms is the usual finest granularity let's use it
+ // (previously was just "0" but that was too ambiguous in contexts like "took 0")
+ if (tn==0) return "0ms";
long tnm = tn % 1000000;
long t = tn/1000000;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/28150112/utils/common/src/test/java/brooklyn/util/time/TimeTest.java
----------------------------------------------------------------------
diff --git a/utils/common/src/test/java/brooklyn/util/time/TimeTest.java b/utils/common/src/test/java/brooklyn/util/time/TimeTest.java
index 363abce..0771b90 100644
--- a/utils/common/src/test/java/brooklyn/util/time/TimeTest.java
+++ b/utils/common/src/test/java/brooklyn/util/time/TimeTest.java
@@ -129,11 +129,11 @@ public class TimeTest {
}
@Test
- public void testMakeStringExactZero() { check(0, "0"); }
+ public void testMakeStringExactZero() { check(0, "0ms"); }
@Test
public void testMakeStringExactNegative() { check(-1, "-1ms"); }
@Test
- public void testMakeStringRoundedZero() { checkR(0, "0"); }
+ public void testMakeStringRoundedZero() { checkR(0, "0ms"); }
@Test
public void testMakeStringRoundedNegative() { checkR(-1, "-1ms"); }
[8/9] git commit: This closes #302
Posted by he...@apache.org.
This closes #302
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/083ede8e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/083ede8e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/083ede8e
Branch: refs/heads/master
Commit: 083ede8e699f2606c1a7317bb22cc327724f957a
Parents: 788a295 310ce26
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Nov 6 10:36:34 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Nov 6 10:36:34 2014 +0000
----------------------------------------------------------------------
.../PersistenceStoreObjectAccessorWriterTestFixture.java | 2 +-
.../jclouds/JcloudsObjectStoreAccessorWriterTest.java | 8 ++++++++
2 files changed, 9 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
[7/9] git commit: This closes #298
Posted by he...@apache.org.
This closes #298
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/788a295f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/788a295f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/788a295f
Branch: refs/heads/master
Commit: 788a295f646cf81fe4a898fb10aa86fd89b7ca63
Parents: c323b00 e9c8c5e
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Nov 6 10:36:15 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Nov 6 10:36:15 2014 +0000
----------------------------------------------------------------------
usage/jsgui/src/main/webapp/assets/css/base.css | 4 ++++
.../src/main/webapp/assets/js/model/entity-summary.js | 1 +
.../src/main/webapp/assets/js/view/entity-summary.js | 4 ++++
.../src/main/webapp/assets/tpl/apps/summary.html | 4 ++++
.../webapp/assets/tpl/catalog/details-entity.html | 8 ++++++--
.../src/main/java/brooklyn/rest/api/ServerApi.java | 4 ++--
.../main/java/brooklyn/rest/domain/EntitySummary.java | 14 ++++++++++++++
.../main/java/brooklyn/rest/domain/PolicySummary.java | 11 +++++++++++
.../java/brooklyn/rest/domain/EntitySummaryTest.java | 2 +-
.../java/brooklyn/rest/resources/EntityResource.java | 1 +
.../brooklyn/rest/transform/EntityTransformer.java | 2 +-
.../brooklyn/rest/transform/PolicyTransformer.java | 2 +-
12 files changed, 50 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
[9/9] git commit: This closes #303
Posted by he...@apache.org.
This closes #303
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/04ce06b9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/04ce06b9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/04ce06b9
Branch: refs/heads/master
Commit: 04ce06b97d3f1f0225dc3c994a55a04fdd0f9f71
Parents: 083ede8 45fa39b
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Nov 6 10:36:35 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Nov 6 10:36:35 2014 +0000
----------------------------------------------------------------------
.../entity/rebind/BrooklynObjectType.java | 28 +-
.../mementos/BrooklynMementoPersister.java | 35 ++-
.../mementos/BrooklynMementoRawData.java | 43 +++
.../catalog/internal/BasicBrooklynCatalog.java | 6 +-
.../brooklyn/catalog/internal/CatalogDo.java | 3 +-
.../brooklyn/catalog/internal/CatalogDto.java | 11 +-
.../catalog/internal/CatalogItemDo.java | 3 +-
.../catalog/internal/CatalogLibrariesDto.java | 7 +-
.../brooklyn/catalog/internal/CatalogUtils.java | 32 +-
.../java/brooklyn/config/BrooklynLogging.java | 46 +++
.../basic/AbstractMultipleSensorAggregator.java | 7 +-
.../brooklyn/enricher/basic/Aggregator.java | 8 +-
.../brooklyn/entity/basic/AbstractEntity.java | 32 +-
.../brooklyn/entity/basic/DynamicGroupImpl.java | 5 +-
.../entity/basic/ServiceStateLogic.java | 10 +-
.../group/AbstractMembershipTrackingPolicy.java | 4 +-
.../rebind/PeriodicDeltaChangeListener.java | 6 +-
.../entity/rebind/PersisterDeltaImpl.java | 31 ++
.../rebind/RebindExceptionHandlerImpl.java | 6 +-
.../entity/rebind/RebindManagerImpl.java | 147 +++++----
.../rebind/dto/BrooklynMementoManifestImpl.java | 15 +
.../AbstractBrooklynMementoPersister.java | 18 +-
.../BrooklynMementoPersisterInMemory.java | 5 +-
.../BrooklynMementoPersisterToMultiFile.java | 16 +
.../BrooklynMementoPersisterToObjectStore.java | 303 ++++++++-----------
.../java/brooklyn/event/basic/AttributeMap.java | 6 +-
.../ha/HighAvailabilityManagerImpl.java | 10 +-
.../ha/ManagementPlaneSyncRecordDeltaImpl.java | 11 +
...ntPlaneSyncRecordPersisterToObjectStore.java | 12 +-
.../brooklyn/management/ha/OsgiManager.java | 11 +-
.../management/internal/LocalEntityManager.java | 12 +-
.../internal/LocalLocationManager.java | 12 +-
.../management/usage/LocationUsage.java | 2 +-
.../entity/rebind/RebindFailuresTest.java | 3 +-
.../entity/rebind/RebindTestFixture.java | 2 +-
.../rebind/RecordingRebindExceptionHandler.java | 6 +-
.../BrooklynMementoPersisterTestFixture.java | 2 +-
.../brooklyn/location/jclouds/JcloudsUtil.java | 2 +-
.../java/brooklyn/util/javalang/Equals.java | 59 ++++
.../src/main/java/brooklyn/util/time/Time.java | 4 +-
.../test/java/brooklyn/util/time/TimeTest.java | 4 +-
41 files changed, 677 insertions(+), 308 deletions(-)
----------------------------------------------------------------------
[6/9] git commit: minor code review cleanups for rebind/persistence
logging
Posted by he...@apache.org.
minor code review cleanups for rebind/persistence logging
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/45fa39b3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/45fa39b3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/45fa39b3
Branch: refs/heads/master
Commit: 45fa39b3d4042c3fbc1e9cc870d96e730f133318
Parents: be5aac2
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Nov 6 10:35:17 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Nov 6 10:35:17 2014 +0000
----------------------------------------------------------------------
.../src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java | 4 +++-
.../rebind/persister/BrooklynMementoPersisterToObjectStore.java | 5 +++--
2 files changed, 6 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/45fa39b3/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
index e29d94f..74cfc12 100644
--- a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
@@ -541,7 +541,9 @@ public class RebindManagerImpl implements RebindManager {
//The manifest contains full catalog items mementos. Reading them at this stage means that
//we don't support references to entities/locations withing tags.
- LOG.debug("Rebinding ("+mode+", iteration "+readOnlyRebindCount+") from "+getPersister().getBackingStoreDescription()+"...");
+ LOG.debug("Rebinding ("+mode+
+ (readOnlyRebindCount>Integer.MIN_VALUE ? ", iteration "+readOnlyRebindCount : "")+
+ ") from "+getPersister().getBackingStoreDescription()+"...");
BrooklynMementoRawData mementoRawData = persistenceStoreAccess.loadMementoRawData(exceptionHandler);
BrooklynMementoManifest mementoManifest = persistenceStoreAccess.loadMementoManifest(mementoRawData, exceptionHandler);
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/45fa39b3/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
index 91b738f..0ee9a73 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
@@ -65,6 +65,7 @@ import com.google.common.annotations.Beta;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Objects;
import com.google.common.base.Stopwatch;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.util.concurrent.Futures;
@@ -93,9 +94,9 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
"Maximum number of attempts to serialize a memento (e.g. if first attempts fail because of concurrent modifications of an entity)",
5);
- static final BrooklynObjectType[] PERSISTED_OBJECT_TYPES_IN_ORDER = new BrooklynObjectType[] {
+ static final List<BrooklynObjectType> PERSISTED_OBJECT_TYPES_IN_ORDER = ImmutableList.of(
BrooklynObjectType.ENTITY, BrooklynObjectType.LOCATION, BrooklynObjectType.POLICY,
- BrooklynObjectType.ENRICHER, BrooklynObjectType.FEED, BrooklynObjectType.CATALOG_ITEM };
+ BrooklynObjectType.ENRICHER, BrooklynObjectType.FEED, BrooklynObjectType.CATALOG_ITEM);
private final PersistenceObjectStore objectStore;
private final MementoSerializer<Object> serializer;