[ 
https://issues.apache.org/jira/browse/BROOKLYN-149?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14577788#comment-14577788
 ] 

ASF GitHub Bot commented on BROOKLYN-149:
-----------------------------------------

Github user aledsage commented on a diff in the pull request:

    https://github.com/apache/incubator-brooklyn/pull/683#discussion_r31956212
  
    --- Diff: core/src/main/java/brooklyn/entity/rebind/RebindIteration.java ---
    @@ -902,45 +902,53 @@ protected void setCatalogItemId(BrooklynObject item, 
String catalogItemId) {
             protected <T extends BrooklynObject> Class<? extends T> 
load(Class<T> bType, Memento memento) {
                 return load(bType, memento.getType(), 
memento.getCatalogItemId(), memento.getId());
             }
    +        
             @SuppressWarnings("unchecked")
             protected <T extends BrooklynObject> Class<? extends T> 
load(Class<T> bType, String jType, String catalogItemId, String 
contextSuchAsId) {
                 checkNotNull(jType, "Type of %s (%s) must not be null", 
contextSuchAsId, bType.getSimpleName());
    +            
                 if (catalogItemId != null) {
    -                BrooklynClassLoadingContext loader = 
getLoadingContextFromCatalogItemId(catalogItemId, classLoader, rebindContext);
    -                return loader.loadClass(jType, bType);
    -            } else {
    -                // we have previously used reflections; not sure if that's 
needed?
    -                try {
    -                    return (Class<T>)reflections.loadClass(jType);
    -                } catch (Exception e) {
    -                    LOG.warn("Unable to load "+jType+" using reflections; 
will try standard context");
    -                }
    -
    -                if 
(BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_INFER_CATALOG_ITEM_ON_REBIND))
 {
    -                    //Try loading from whichever catalog bundle succeeds.
    -                    BrooklynCatalog catalog = 
managementContext.getCatalog();
    -                    for (CatalogItem<?, ?> item : 
catalog.getCatalogItems()) {
    -                        BrooklynClassLoadingContext catalogLoader = 
CatalogUtils.newClassLoadingContext(managementContext, item);
    -                        Maybe<Class<?>> catalogClass = 
catalogLoader.tryLoadClass(jType);
    -                        if (catalogClass.isPresent()) {
    -                            return (Class<? extends T>) catalogClass.get();
    -                        }
    +                CatalogItem<?, ?> catalogItem = 
rebindContext.lookup().lookupCatalogItem(catalogItemId);
    +                if (catalogItem == null && 
BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_INFER_CATALOG_ITEM_ON_REBIND))
 {
    +                    // See 
https://issues.apache.org/jira/browse/BROOKLYN-149
    +                    // This is a dangling reference to the catalog item 
(which will have been logged by lookupCatalogItem).
    +                    // Try loading as any version.
    +                    if (CatalogUtils.looksLikeVersionedId(catalogItemId)) {
    +                        String symbolicName = 
CatalogUtils.getIdFromVersionedId(catalogItemId);
    +                        catalogItem = 
rebindContext.lookup().lookupCatalogItem(symbolicName);
                         }
    -                    throw new IllegalStateException("No catalogItemId 
specified and can't load class from either classpath of catalog items");
    +                }
    +                if (catalogItem != null) {
    +                    BrooklynClassLoadingContext loader = 
CatalogUtils.newClassLoadingContext(managementContext, catalogItem);
    +                    return loader.loadClass(jType, bType);
                     } else {
    -                    throw new IllegalStateException("No catalogItemId 
specified and can't load class from classpath");
    +                    LOG.warn("Unable to load catalog item 
"+catalogItemId+" for "+contextSuchAsId
    +                            +" ("+bType.getSimpleName()+"); will try 
default class loader");
                     }
    -
                 }
    -        }
    +            
    +            try {
    +                return (Class<T>)reflections.loadClass(jType);
    +            } catch (Exception e) {
    +                Exceptions.propagateIfFatal(e);
    +                LOG.warn("Unable to load "+jType+" using reflections; will 
try standard context");
    +            }
     
    -        protected BrooklynClassLoadingContext 
getLoadingContextFromCatalogItemId(String catalogItemId, ClassLoader 
classLoader, RebindContext rebindContext) {
    -            Preconditions.checkNotNull(catalogItemId, "catalogItemId 
required (should not be null)");
    -            CatalogItem<?, ?> catalogItem = 
rebindContext.lookup().lookupCatalogItem(catalogItemId);
    -            if (catalogItem != null) {
    -                return 
CatalogUtils.newClassLoadingContext(managementContext, catalogItem);
    +            if (catalogItemId != null) {
    +                throw new IllegalStateException("Unable to load catalog 
item "+catalogItemId+" for "+contextSuchAsId+", or load class from classpath");
    --- End diff --
    
    Yes, full context of method is that we've tried all available ways of 
loading (there are earlier return statements in the method), so will now fail. 
However, if no catalogItemId was specified and if the backards_compatibility 
feature was enabled then we'll try to infer a catalog item id.
    
    Not particularly nice logic, having multiple return statements, but is 
possibly the simplest given the unfortunate number of if-else statements to 
deal with the different scenarios.


> Rebind failed when entity's catalog item not found
> --------------------------------------------------
>
>                 Key: BROOKLYN-149
>                 URL: https://issues.apache.org/jira/browse/BROOKLYN-149
>             Project: Brooklyn
>          Issue Type: Bug
>    Affects Versions: 0.7.0-SNAPSHOT
>            Reporter: Aled Sage
>             Fix For: 0.7.0-SNAPSHOT
>
>
> A customer's Brooklyn instance failed to rebind on restart. The error was:
> {noformat}
> vcompose1476-compose-amp.console-v1.5.3.log:2015-05-15 06:57:12,808 ERROR 
> Management node zdJa2A7Y enountered problem during rebind when promoting self 
> to master; demoting to FAILED and rethrowing: 
> brooklyn.util.exceptions.PropagatedRuntimeException: Failure rebinding, 71 
> errors including: problem creating ENTITY Ocs2eaWX of type 
> brooklyn.entity.nosql.riak.RiakClusterImpl: Failed to load catalog item 
> OJ081XYKT_0=:1.0 required for rebinding.
> oklyn-Allow-Non-Master-Access' to force)
> {noformat}
> The full exception was:
> {noformat}
> 2015-05-15 06:40:31,369 WARN  b.e.r.RebindExceptionHandlerImpl 
> [brooklyn-execmanager-boo0I83w-0]: No catalog item found with id 
> OJ081XYKT_0=:1.0; returning null
> 2015-05-15 06:40:31,395 WARN  b.e.r.RebindExceptionHandlerImpl 
> [brooklyn-execmanager-boo0I83w-0]: Rebind: continuing after problem creating 
> ENTITY Ocs2eaWX of type brooklyn.entity.nosql.riak.RiakClusterImpl
> java.lang.IllegalStateException: Failed to load catalog item OJ081XYKT_0=:1.0 
> required for rebinding.
>         at 
> brooklyn.entity.rebind.RebindIteration$BrooklynObjectInstantiator.getLoadingContextFromCatalogItemId(RebindIteration.java:903)
>  ~[brooklyn-core-0.7.0-20150509.1751.jar:0.7.0-20150509.1751]
>         at 
> brooklyn.entity.rebind.RebindIteration$BrooklynObjectInstantiator.load(RebindIteration.java:869)
>  ~[brooklyn-core-0.7.0-20150509.1751.jar:0.7.0-20150509.1751]
>         at 
> brooklyn.entity.rebind.RebindIteration$BrooklynObjectInstantiator.newEntity(RebindIteration.java:814)
>  ~[brooklyn-core-0.7.0-20150509.1751.jar:0.7.0-20150509.1751]
>         at 
> brooklyn.entity.rebind.RebindIteration.instantiateLocationsAndEntities(RebindIteration.java:407)
>  [brooklyn-core-0.7.0-20150509.1751.jar:0.7.0-20150509.1751]
>         at 
> brooklyn.entity.rebind.RebindIteration.doRun(RebindIteration.java:234) 
> [brooklyn-core-0.7.0-20150509.1751.jar:0.7.0-20150509.1751]
>         at 
> brooklyn.entity.rebind.InitialFullRebindIteration.doRun(InitialFullRebindIteration.java:69)
>  [brooklyn-core-0.7.0-20150509.1751.jar:0.7.0-20150509.1751]
>         at 
> brooklyn.entity.rebind.RebindIteration.run(RebindIteration.java:260) 
> [brooklyn-core-0.7.0-20150509.1751.jar:0.7.0-20150509.1751]
>         at 
> brooklyn.entity.rebind.RebindManagerImpl.rebindImpl(RebindManagerImpl.java:545)
>  [brooklyn-core-0.7.0-20150509.1751.jar:0.7.0-20150509.1751]
>         at 
> brooklyn.entity.rebind.RebindManagerImpl$3.call(RebindManagerImpl.java:496) 
> [brooklyn-core-0.7.0-20150509.1751.jar:0.7.0-20150509.1751]
>         at 
> brooklyn.entity.rebind.RebindManagerImpl$3.call(RebindManagerImpl.java:494) 
> [brooklyn-core-0.7.0-20150509.1751.jar:0.7.0-20150509.1751]
>         at 
> brooklyn.util.task.BasicExecutionManager$SubmissionCallable.call(BasicExecutionManager.java:469)
>  [brooklyn-core-0.7.0-20150509.1751.jar:0.7.0-20150509.1751]
>         at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
> [na:1.7.0_71]
>         at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
>  [na:1.7.0_71]
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>  [na:1.7.0_71]
>         at java.lang.Thread.run(Thread.java:745) [na:1.7.0_71]
> {noformat}
> In the persisted state, there is no mention of the catalog item OJ081XYKT_0.
> My assumption is that the customer manually added a catalog item (via the 
> web-console), deployed an app (entitled "<snip> riak", of type RiakCluster), 
> and then deleted the catalog item (or that "deletion" could have been an 
> issue with persistence of catalog items - see 
> https://github.com/apache/incubator-brooklyn/pull/555).
> The desired behaviour is that this does not cause the entire Brooklyn 
> instance to fail to rebind/start.
> ---
> There are several potential things to investigate/improve:
> * Test (manually, and then perhaps automated tests?):
>    * adding a catalog item (via web-console), deploying an app, and 
> restarting AMP
>    * adding a catalog item (via web-console), deploying an app, deleting the 
> catalog item (but not the app), and restarting AMP
> * Investigate what catalog ids are used when adding through the web-console  
>   (or did they manually choose the name OJ081XYKT_0?)
> * Configurable for whether to continue startup onCreateFailed  
>   (e.g. web-console pops up with "there was an error..."), but can click 
> continue.
> * Broolyn web-console to have a page showing all errors
>   * Support "quick fixes" such as deleting the item(s).



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to