[ https://issues.apache.org/jira/browse/ARIES-1068?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13782973#comment-13782973 ]
Guillaume Nodet edited comment on ARIES-1068 at 2/19/18 10:09 AM: ------------------------------------------------------------------ Found some probable issues with the fix patch linked - org.apache.aries.jndi.startup.Activator - Need to make the BundleTracker bt a field, and if it is not null, bt.close() it at the end of the stop method. org.apache.aries.jndi.tracker.ServiceTrackerCustomizers - BaseCachingServiceTracker.clearCache(Bundle b) should be: {code} private void clearCache(Bundle b) { for (BundleContext bCtx : ctxServiceRefServiceCache.keySet()) { Bundle cacheB = null; try { cacheB = bCtx.getBundle(); } catch (IllegalStateException ise) \{ if (LOGGER.isLoggable(Level.FINE)) LOGGER.fine("BaseCachingServiceTracker.clearCache IllegalStateException caught getting bundle on " + bCtx); } if (cacheB == null || cacheB.equals(b)) \{ Object removedObj = ctxServiceRefServiceCache.remove(bCtx); if (LOGGER.isLoggable(Level.FINE)) LOGGER.fine("BaseCachingServiceTracker.clearCache Removed " + removedObj); } } } \{code} CacheBundleTrackerCustomizer.removedBundle should start with : \{code} public void removedBundle(Bundle arg0, BundleEvent arg1, Object arg2) { //Work through srCache to find the bundle by matching to the context if (LOGGER.isLoggable(Level.FINE)) LOGGER.fine("removedBundle: Bundle " + arg0); for (BundleContext bCtx : srCache.keySet()) { Bundle cacheB = null; try \{ cacheB = bCtx.getBundle(); } catch (IllegalStateException ise) { if (LOGGER.isLoggable(Level.FINE)) LOGGER.fine("CacheBundleTrackerCustomizer.removedBundle IllegalStateException caught getting bundle on " + bCtx); } if (cacheB == null || cacheB.equals(arg0)) { if (LOGGER.isLoggable(Level.FINE)) LOGGER.fine("Found matching bundleContext " + bCtx); //Removing the bundle in the cache, so clear it out. ... {code} was (Author: sgormley): Found some probable issues with the fix patch linked - org.apache.aries.jndi.startup.Activator - Need to make the BundleTracker bt a field, and if it is not null, bt.close() it at the end of the stop method. org.apache.aries.jndi.tracker.ServiceTrackerCustomizers - BaseCachingServiceTracker.clearCache(Bundle b) should be: private void clearCache(Bundle b) { for (BundleContext bCtx : ctxServiceRefServiceCache.keySet()) { Bundle cacheB = null; try { cacheB = bCtx.getBundle(); } catch (IllegalStateException ise) { if (LOGGER.isLoggable(Level.FINE)) LOGGER.fine("BaseCachingServiceTracker.clearCache IllegalStateException caught getting bundle on " + bCtx); } if (cacheB == null || cacheB.equals(b)) { Object removedObj = ctxServiceRefServiceCache.remove(bCtx); if (LOGGER.isLoggable(Level.FINE)) LOGGER.fine("BaseCachingServiceTracker.clearCache Removed " + removedObj); } } } CacheBundleTrackerCustomizer.removedBundle should start with : public void removedBundle(Bundle arg0, BundleEvent arg1, Object arg2) { //Work through srCache to find the bundle by matching to the context if (LOGGER.isLoggable(Level.FINE)) LOGGER.fine("removedBundle: Bundle " + arg0); for (BundleContext bCtx : srCache.keySet()) { Bundle cacheB = null; try { cacheB = bCtx.getBundle(); } catch (IllegalStateException ise) { if (LOGGER.isLoggable(Level.FINE)) LOGGER.fine("CacheBundleTrackerCustomizer.removedBundle IllegalStateException caught getting bundle on " + bCtx); } if (cacheB == null || cacheB.equals(arg0)) { if (LOGGER.isLoggable(Level.FINE)) LOGGER.fine("Found matching bundleContext " + bCtx); //Removing the bundle in the cache, so clear it out. ... > JNDI lookup performance bad when security enabled > ------------------------------------------------- > > Key: ARIES-1068 > URL: https://issues.apache.org/jira/browse/ARIES-1068 > Project: Aries > Issue Type: Bug > Components: JNDI > Reporter: Simon Gormley > Assignee: Jeremy Hughes > Priority: Critical > Attachments: servicelookupperf.patch > > > JNDI lookups can be slow if Java security is enabled, specifically the > getService methods take time. > If the services are cached then the lookup only has to be performed once, but > care has to be taken that the context performing the service lookup has the > required permissions to do so, and so cache buckets for each context will be > necessary. > Also to prevent a leak, when contexts drop from scope, the associated caches > need to be cleared out. > The ServiceTrackerCustomizer for JNDI already had some caching ability, and > the provided patch extends this to avoid looking up Services where possible. -- This message was sent by Atlassian JIRA (v7.6.3#76005)