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 2022/01/06 18:04:51 UTC
[brooklyn-server] 01/04: tidy logging esp for some edge case errors
This is an automated email from the ASF dual-hosted git repository.
heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
commit 9c5cc10af7520316b8fbfd630d8cdc48448d2581
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Thu Jan 6 16:43:21 2022 +0000
tidy logging esp for some edge case errors
---
.../BrooklynComponentTemplateResolver.java | 20 ++++++-----
.../catalog/internal/BasicBrooklynCatalog.java | 39 +++++++++++++---------
.../core/objs/BasicEntityTypeRegistry.java | 4 +++
.../core/typereg/TypePlanTransformers.java | 14 +++++---
4 files changed, 48 insertions(+), 29 deletions(-)
diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
index f8c9844..eacb289 100644
--- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
+++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
@@ -199,15 +199,17 @@ public class BrooklynComponentTemplateResolver {
}
throw new IllegalStateException("Unable to create spec for type " + type + ". " + msgDetails);
}
- spec = EntityManagementUtils.unwrapEntity(spec);
-
- CampResolver.fixScopeRootAtRoot(mgmt, spec);
-
- populateSpec(spec, encounteredRegisteredTypeSymbolicNames);
-
- @SuppressWarnings("unchecked")
- EntitySpec<T> typedSpec = (EntitySpec<T>) spec;
- return typedSpec;
+ try {
+ spec = EntityManagementUtils.unwrapEntity(spec);
+ CampResolver.fixScopeRootAtRoot(mgmt, spec);
+ populateSpec(spec, encounteredRegisteredTypeSymbolicNames);
+
+ @SuppressWarnings("unchecked")
+ EntitySpec<T> typedSpec = (EntitySpec<T>) spec;
+ return typedSpec;
+ } catch (Exception e) {
+ throw Exceptions.propagateAnnotated("Error populating spec "+spec, e);
+ }
}
private List<EntitySpecResolver> getServiceTypeResolverOverrides() {
diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
index 4cde1de..64b578f 100644
--- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
+++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
@@ -843,7 +843,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
// if version not set, infer from: id, then from name, then item version
if (versionFromId!=null) {
if (Strings.isNonBlank(version) && !versionFromId.equals(version)) {
- throw new IllegalArgumentException("Discrepency between version set in id " + versionFromId + " and version property " + version);
+ throw new IllegalArgumentException("Discrepancy between version set in id " + versionFromId + " and version property " + version);
}
version = versionFromId;
}
@@ -857,8 +857,8 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
if (Strings.isBlank(version)) {
version = setFromItemIfUnset(version, itemAsMap, "version");
version = setFromItemIfUnset(version, itemAsMap, "template_version");
- if (version==null) {
- log.debug("No version specified for catalog item " + symbolicName + ". Using default value.");
+ if (Strings.isBlank(version)) {
+ if (log.isTraceEnabled()) log.trace("No version specified for catalog item " + symbolicName + " or BOM ancestors. Using default/bundle value.");
version = null;
}
}
@@ -958,6 +958,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
}
if (version==null) {
// use this as default version when nothing specified or inferrable from containing bundle
+ log.debug("No version specified for catalog item " + symbolicName + " or BOM ancestors and not available from bundle. Using default value "+BasicBrooklynCatalog.NO_VERSION+".");
version = BasicBrooklynCatalog.NO_VERSION;
}
}
@@ -1605,7 +1606,8 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
* primarily used to downgrade log messages when trying to resolve with different strategies.
* can also be used to say which item is being currently resolved.
*/
- public static ThreadLocal<String> currentlyResolvingType = new ThreadLocal<String>();
+ public static ThreadLocal<String> currentlyResolvingType = new ThreadLocal<>();
+ public static ThreadLocal<RegisteredType> currentlyValidatingType = new ThreadLocal<>();
private String makeAsIndentedList(String yaml) {
String[] lines = yaml.split("\n");
@@ -1790,20 +1792,25 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
@Override @Beta
public Collection<Throwable> validateType(RegisteredType typeToValidate, RegisteredTypeLoadingContext constraint, boolean allowUnresolved) {
- ReferenceWithError<RegisteredType> result = validateResolve(typeToValidate, constraint);
- if (result.hasError()) {
- if (allowUnresolved && RegisteredTypes.isTemplate(typeToValidate)) {
- // ignore for templates
- return Collections.emptySet();
- }
- if (result.getError() instanceof CompoundRuntimeException) {
- return ((CompoundRuntimeException)result.getError()).getAllCauses();
+ try {
+ currentlyValidatingType.set(typeToValidate);
+ ReferenceWithError<RegisteredType> result = validateResolve(typeToValidate, constraint);
+ if (result.hasError()) {
+ if (allowUnresolved && RegisteredTypes.isTemplate(typeToValidate)) {
+ // ignore for templates
+ return Collections.emptySet();
+ }
+ if (result.getError() instanceof CompoundRuntimeException) {
+ return ((CompoundRuntimeException)result.getError()).getAllCauses();
+ }
+ return Collections.singleton(result.getError());
}
- return Collections.singleton(result.getError());
+ // replace what's in catalog with resolved+validated version
+ ((BasicBrooklynTypeRegistry) mgmt.getTypeRegistry()).addToLocalUnpersistedTypeRegistry(result.get(), true);
+ return Collections.emptySet();
+ } finally {
+ currentlyValidatingType.set(null);
}
- // replace what's in catalog with resolved+validated version
- ((BasicBrooklynTypeRegistry) mgmt.getTypeRegistry()).addToLocalUnpersistedTypeRegistry(result.get(), true);
- return Collections.emptySet();
}
/**
diff --git a/core/src/main/java/org/apache/brooklyn/core/objs/BasicEntityTypeRegistry.java b/core/src/main/java/org/apache/brooklyn/core/objs/BasicEntityTypeRegistry.java
index 720241c..206f84d 100644
--- a/core/src/main/java/org/apache/brooklyn/core/objs/BasicEntityTypeRegistry.java
+++ b/core/src/main/java/org/apache/brooklyn/core/objs/BasicEntityTypeRegistry.java
@@ -105,12 +105,16 @@ public class BasicEntityTypeRegistry implements EntityTypeRegistry {
}
private <T extends Entity> Class<? extends T> getFromAnnotation(Class<T> type) {
+ try {
ImplementedBy annotation = type.getAnnotation(org.apache.brooklyn.api.entity.ImplementedBy.class);
if (annotation == null)
return null;
Class<? extends Entity> value = annotation.value();
checkIsImplementation(type, value);
return (Class<? extends T>) value;
+ } catch (Exception e) {
+ throw Exceptions.propagateAnnotated("Error reading ImplementedBy on "+type, e);
+ }
}
private <T extends Entity> Class<? super T> getInterfaceWithAnnotationMatching(Class<T> implClazz) {
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/TypePlanTransformers.java b/core/src/main/java/org/apache/brooklyn/core/typereg/TypePlanTransformers.java
index 94d2b57..8de3d51 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/TypePlanTransformers.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/TypePlanTransformers.java
@@ -138,14 +138,20 @@ public class TypePlanTransformers {
}
if (log.isDebugEnabled()) {
- Supplier<String> s = () -> "Failure transforming plan; returning summary failure, but for reference "
+ Supplier<String> s = () -> "Interim failure transforming plan "
+ + BasicBrooklynCatalog.currentlyResolvingType.get()+"/"+BasicBrooklynCatalog.currentlyValidatingType.get()
+ + "; will throw/return summary failure and catalog routines often wrap and retry, "
+ + "but for reference in the event this failure is unexpected: "
+ "potentially applicable transformers were "+transformers+", "
+ "available ones are "+MutableList.builder().addAll(all(mgmt)).build()+"; "
- + "failures: "+failuresFromTransformers +"; "
- + "unsupported by: "+transformersWhoDontSupport;
- if (BasicBrooklynCatalog.currentlyResolvingType.get()==null) {
+ + "unsupported by: "+transformersWhoDontSupport+"; "
+ + "failures: "+failuresFromTransformers
+ ;
+ if (BasicBrooklynCatalog.currentlyResolvingType.get()==null && BasicBrooklynCatalog.currentlyValidatingType.get()==null) {
+ // if both are null, we don't know who is calling us, so log it as debug
log.debug(s.get());
} else if (log.isTraceEnabled()) {
+ // trace can be enabled to get more information if this is occurring unexpectedly
log.trace(s.get());
}
}