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

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

Github user aledsage commented on the issue:

    https://github.com/apache/brooklyn-server/pull/867
  
    @ahgittin Still requires some more testing, but wanted to share this now 
for feedback.
    
    ----
    As discussed with @ahgittin, there was an additional rebind issue when 
loading the initial catalog (and subsequently loading persisted bundles). Karaf 
will have cached OSGi bundles for that initial catalog. The initial catalog 
would duplicate some of these - it couldn't tell that the karaf bundle 
installed on the previous brooklyn run was identical to the bundle it wanted to 
install (it can't yet see the persisted brooklyn-managed records, and it can't 
understand osgi location `brooklyn:ID`).
    
    Possible solutions for that included:
    1) make `brooklyn:ID` osgi location be a checksum (so the same osgi 
location would be used for two identical brooklyn-managed bundles).
    2) clear the karaf cache of brooklyn-managed bundles (e.g. all those with 
location in the form `brooklyn:ID`), in the knowledge that the initial catalog 
and persisted state will reinstall them.
    3) load initial catalog _after_ persistence (but we expect the initial 
catalog to tell us whether to remove some items from persistence so this isn't 
a good option without major re-work).
    4) if we're not certain that it's identical, then uninstall and reinstall 
the bundle (which is what happens currently). This might be a problem if it's a 
core brooklyn module, but those should have `mvn:` urls so it _can_ confirm 
whether it's a duplicate).
    5) rework rebind / initial catalog load so that we load placeholders for 
bundles that have been persisted (enough to do the deduping or install things 
referenced in initial catalog load).
    
    We opted for doing (1) and (4).
    
    ---
    Another issue (FAO @ahgittin) is that every time Brooklyn was started, we'd 
add to the persisted state another copy of each core brooklyn bundle!
    
    This is because the initial catalog references things like 
`org.apache.brooklyn.policy`. The `ManagedBundle` we create to represent it 
gets an auto-generated unique id. We see that the bundle is already installed, 
so we don't re-install it in karaf (good). But we do still persist it to the 
`/bundles` persisted state sub-directory.
    
    I've worked around that by black-listing `org.apache.brooklyn.*` from being 
persisted (see 
`OsgiArchiveInstaller.isBlacklistedForPersistence(ManagedBundle)`. The 
assumption is that those will always ship with Brooklyn - we should use just 
the version that is shipped with the given release of Brooklyn.
    
    ---
    Another issue (similar, not yet fixed) is that we persist a new identical 
copy of `brooklyn-default-karaf-catalog` every time we restart Brooklyn. This 
is because the `ManagedBundle` for the initial catalog has an auto-generated 
unique id. As above, we do not install the duplicate bundle, but we still 
persist it.
    
    Luckily rebind is not as bad as you might think! It spots that an identical 
bundle is already installed, so doesn't install it or parse the catalog.bom of 
every copy that is in persisted state.
    
    Possible solutions for this include:
    1) changing the persistence file/object names to use the 
`symbolicName_version.jar` format (similar naming to the old `/catalog` 
directory).
    2) only persist the bundle if we actually installed it (i.e. it wasn't a 
duplicate).
    3) search persisted state for a duplicate, and don't add if it already 
exists.
    
    Option (1) is very tempting, given that is it's logical unique identity: we 
shouldn't be persisting (and thus installing) multiple things with the same 
name:version. We'd need to be careful with backwards compatibility if someone 
has `/bundles` that uses the unique ids. We could later add additional checks 
to only replace the persisted file if its checksum had actually changed.
    
    Option (2) feels wrong - what is persisted depends on what is in your karaf 
cache! For example, if you change the persisted state directory then we 
wouldn't write out the initial catalog to it because karaf would have cached 
those bundles from the previous run.


> On restart fails to install catalog bundles due to existing bundles installed 
> with different location
> -----------------------------------------------------------------------------------------------------
>
>                 Key: BROOKLYN-546
>                 URL: https://issues.apache.org/jira/browse/BROOKLYN-546
>             Project: Brooklyn
>          Issue Type: Bug
>            Reporter: Duncan Grant
>            Priority: Blocker
>
> Rebind will always fail on restart due to errors like the following:
> java.lang.IllegalStateException: Bundle 
> BasicManagedBundle{symbolicName=org.apache.brooklyn.software-cm-ansible, 
> version=1.0.0.SNAPSHOT, 
> url=mvn:org.apache.brooklyn/brooklyn-software-cm-ansible/1.0.0-SNAPSHOT} 
> failed installation: BundleException: Bundle symbolic name and version are 
> not unique: org.apache.brooklyn.software-cm-ansible:1.0.0.SNAPSHOT
> This seems to have been "caused" by the change: 
> https://github.com/apache/brooklyn-server/pull/862/commits/c4f9d95aa2113a1a5022da17768675599e528dd4
> This can be easily tested by starting brooklyn.  Stopping brooklyn.  And then 
> starting brooklyn.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to