You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Christian Schneider (JIRA)" <ji...@apache.org> on 2014/03/07 09:26:42 UTC

[jira] [Assigned] (DOSGI-214) Endpoint publication to discovery does not always work

     [ https://issues.apache.org/jira/browse/DOSGI-214?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Christian Schneider reassigned DOSGI-214:
-----------------------------------------

    Assignee: Christian Schneider

> Endpoint publication to discovery does not always work
> ------------------------------------------------------
>
>                 Key: DOSGI-214
>                 URL: https://issues.apache.org/jira/browse/DOSGI-214
>             Project: CXF Distributed OSGi
>          Issue Type: Bug
>          Components: DSW
>    Affects Versions: 1.6.0
>         Environment: Windows 7, Linux (OpenSuse), seems to happen more often with slower CPU computers
>            Reporter: Timo Heinonen
>            Assignee: Christian Schneider
>
> TopologyManager bundle's EndpointListenerNotifier does not call all EndpointListener's at all times correctly and therefore some endpoints don't get published to discovery (zookeeper). 
> I found following problems with the current implementation:
> 1) TopologyManagerExport.exportServiceUsingRemoteServiceAdmin():
> In the end of the exportServiceUsingRemoteServiceAdmin() notifyListeners() is called before updating endpointregistry. This causes problem in EndpointListenerNotifier, because endpointRepository.getAllEndpoints() does not return correct state before endpoints are updated. Basically problem exists when ServiceTracker's addingService() is called simultaneously for discovery bundle's EndpointLIstener and other thread (call coming from TopologyManagerExport) calls notfiyListeners(). stEndpointListeners.getServiceReferences() does not yet return the endpoint listener of discovery bundle and therefore discovery is not notified. Also, addingService() call does not find endpoint from endpointRegistry and therefore does not publish it.
> FIX: By changing the order of notifyListeners() and addEndpoints() in TopologyManagerExport the above is fixed.
> 2) EndpointListenerNotifier is not threadsafe although ServiceTracker is. stEndpointListeners.getServiceReferences() returns just added EndpointListener (the one from discovery bundle) only AFTER whole overrided addingService() method has finished. So following can happen:
> a) addingService() is called with discovery bundle's EPL
> b) super.addingService() call is finished and notifyListener() is called with no new Endpoint because TopologyManagerExport has not yet added it to endPointRepo
> c) TopologyManagerExport calls addEndpoint() and notifyListeners() (in fixed order) and EndpointListenerNotifier does not notify discove EPL, because addingService() call has not yet returned and therefore stEndpointListeners.getServiceReferences() still returns 1 EPL (from topologyManager bundle)
> FIX: Add synchronized (EndpointListenerNotifier.this) to both methods addingService and modifiedService. Also add synchronized (this) to notifyListeners() method so that lock guards call to stdEndpointListeners.getServiceReference(). 



--
This message was sent by Atlassian JIRA
(v6.2#6252)