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

    https://github.com/apache/incubator-brooklyn/pull/617#discussion_r30582714
  
    --- Diff: core/src/main/java/brooklyn/entity/rebind/RebindIteration.java ---
    @@ -341,38 +340,67 @@ protected void rebuildCatalog() {
                     }
                 }
             }
    +
    +        // See notes in CatalogInitialization
             
    -        // Register catalogue items with the management context. Loads the 
bundles in the OSGi framework.
    -        CatalogLoadMode catalogLoadMode = 
managementContext.getConfig().getConfig(BrooklynServerConfig.CATALOG_LOAD_MODE);
    +        Collection<CatalogItem<?, ?>> catalogItems = 
rebindContext.getCatalogItems();
    +        CatalogInitialization catInit = 
((ManagementContextInternal)managementContext).getCatalogInitialization();
    +        catInit.injectManagementContext(managementContext);
    +        catInit.applyCatalogLoadMode();
    +        Collection<CatalogItem<?,?>> itemsForResettingCatalog = null;
    +        boolean needsInitialCatalog;
             if (rebindManager.persistCatalogItemsEnabled) {
    -            boolean shouldResetCatalog = catalogLoadMode == 
CatalogLoadMode.LOAD_PERSISTED_STATE
    -                    || (!isEmpty && catalogLoadMode == 
CatalogLoadMode.LOAD_BROOKLYN_CATALOG_URL_IF_NO_PERSISTED_STATE);
    -            boolean shouldLoadDefaultCatalog = catalogLoadMode == 
CatalogLoadMode.LOAD_BROOKLYN_CATALOG_URL
    -                    || (isEmpty && catalogLoadMode == 
CatalogLoadMode.LOAD_BROOKLYN_CATALOG_URL_IF_NO_PERSISTED_STATE);
    -            if (shouldResetCatalog) {
    -                // Reset catalog with 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
    -                logRebindingDebug("RebindManager loading default catalog");
    -                ((BasicBrooklynCatalog) 
managementContext.getCatalog()).resetCatalogToContentsAtConfiguredUrl();
    +            if (!catInit.hasRunOfficial() && 
catInit.isInitialResetRequested()) {
    +                String message = "RebindManager resetting catalog on first 
run (catalog persistence enabled, but reset explicitly specified). ";
    +                if (catalogItems.isEmpty()) {
    +                    message += "Catalog was empty anyway.";
    +                } else {
    +                    message += "Deleting "+catalogItems.size()+" persisted 
catalog item"+Strings.s(catalogItems)+": "+catalogItems;
    +                    if (shouldLogRebinding()) {
    +                        LOG.info(message);
    +                    }
    +                }
    +                logRebindingDebug(message);
    +
    +                itemsForResettingCatalog = 
MutableList.<CatalogItem<?,?>>of();
    +                
    +                PersisterDeltaImpl delta = new PersisterDeltaImpl();
    +                for (String catalogItemId: 
mementoRawData.getCatalogItems().keySet()) {
    +                    delta.removedCatalogItemIds.add(catalogItemId);
    +                }
    +                getPersister().queueDelta(delta);
    +                
    +                mementoRawData.clearCatalogItems();
    +                needsInitialCatalog = true;
                 } 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() && shouldLogRebinding()) {
    -                    LOG.info(message + " There {} {} item{} persisted.", 
new Object[]{
    -                            catalogLoadMode, catalogItems.size() == 1 ? 
"was" : "were", catalogItems.size(), Strings.s(catalogItems)});
    -                } else if (LOG.isDebugEnabled()) {
    -                    logRebindingDebug(message, catalogLoadMode);
    +                if (!isEmpty) {
    +                    logRebindingDebug("RebindManager clearing local 
catalog and loading from persisted state");
    +                    itemsForResettingCatalog = 
rebindContext.getCatalogItems();
    +                    needsInitialCatalog = false;
    +                } else {
    +                    if (catInit.hasRunOfficial()) {
    +                        logRebindingDebug("RebindManager will re-add any 
new items (persisted state empty)");
    +                        needsInitialCatalog = false;
    +                    } else {
    +                        logRebindingDebug("RebindManager loading initial 
catalog locally because persisted state empty");
    +                        needsInitialCatalog = true;
    +                    }
                     }
                 }
    -            // TODO destroy old (as above)
             } else {
    -            logRebindingDebug("RebindManager not resetting catalog because 
catalog persistence is disabled");
    +            if (catInit.hasRunOfficial()) {
    +                logRebindingDebug("RebindManager skipping catalog init 
because it has already run (catalog persistence disabled)");
    +                needsInitialCatalog = false;
    +            } else {
    +                logRebindingDebug("RebindManager will initialize catalog 
locally because catalog persistence is disabled");
    +                needsInitialCatalog = true;
    +            }
             }
    +
    +        // TODO in read-only mode, perhaps do this less frequently than 
entities etc ?
    +        // both in RW and in RO mode, the first run reads the 
initialization data;
    +        // maybe not desired for RO as it defers problems, although if 
it's standalone it is desired
    +        catInit.populateCatalog(needsInitialCatalog, 
itemsForResettingCatalog);
    --- End diff --
    
    Personal preference: I like `Optional<Collection<CatalogItem<?,?>>>` rather 
than using null to indicate absence. That makes the behaviour of the method 
more explicit.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

Reply via email to