brooklyn-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "ASF GitHub Bot (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (BROOKLYN-149) Rebind failed when entity's catalog item not found
Date Tue, 09 Jun 2015 15:08:01 GMT

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

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

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

    https://github.com/apache/incubator-brooklyn/pull/683#discussion_r32023110
  
    --- Diff: core/src/main/java/brooklyn/entity/rebind/RebindIteration.java ---
    @@ -899,48 +914,64 @@ protected void setCatalogItemId(BrooklynObject item, String catalogItemId)
{
                 }
             }
     
    -        protected <T extends BrooklynObject> Class<? extends T> load(Class<T>
bType, Memento memento) {
    +        protected <T extends BrooklynObject> LoadedClass<? 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) {
    +        protected <T extends BrooklynObject> LoadedClass<? 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) {
    +                    if (BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_AUTO_FIX_CATALOG_REF_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);
    +                            
    +                            if (catalogItem != null) {
    +                                LOG.warn("Unable to load catalog item "+catalogItemId+"
for "+contextSuchAsId
    +                                        +" ("+bType.getSimpleName()+"); will auto-upgrade
to "+catalogItem.getCatalogItemId());
    +                                catalogItemId = catalogItem.getCatalogItemId();
    +                            }
                             }
                         }
    -                    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 new LoadedClass<T>(loader.loadClass(jType, bType), catalogItemId);
                     } 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 new LoadedClass<T>((Class<T>)reflections.loadClass(jType),
catalogItemId);
    --- End diff --
    
    This is possible even now if you use `exceptionHandler` to log the errors. Depending on
the startup options the process will abort or show a warning in the web console.


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

Mime
View raw message