You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by pa...@apache.org on 2020/07/15 09:51:46 UTC
[sling-org-apache-sling-commons-fsclassloader] branch
issues/SLING-9588 created (now b89019a)
This is an automated email from the ASF dual-hosted git repository.
pauls pushed a change to branch issues/SLING-9588
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-commons-fsclassloader.git.
at b89019a SLING-9588: Make the FSClassLoaderMBeanImpl a component to fix a race condition
This branch includes the following new commits:
new b89019a SLING-9588: Make the FSClassLoaderMBeanImpl a component to fix a race condition
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
[sling-org-apache-sling-commons-fsclassloader] 01/01: SLING-9588:
Make the FSClassLoaderMBeanImpl a component to fix a race condition
Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
pauls pushed a commit to branch issues/SLING-9588
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-commons-fsclassloader.git
commit b89019a40b93c4926eec3e624bb004e5cfa0ce91
Author: Karl Pauls <ka...@gmail.com>
AuthorDate: Wed Jul 15 11:51:26 2020 +0200
SLING-9588: Make the FSClassLoaderMBeanImpl a component to fix a race condition
---
.../fsclassloader/impl/FSClassLoaderMBeanImpl.java | 35 ++++++++++++++++++----
.../fsclassloader/impl/FSClassLoaderProvider.java | 22 --------------
2 files changed, 29 insertions(+), 28 deletions(-)
diff --git a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderMBeanImpl.java b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderMBeanImpl.java
index 2db387d..2f56e75 100644
--- a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderMBeanImpl.java
+++ b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderMBeanImpl.java
@@ -29,21 +29,44 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import org.apache.sling.commons.classloader.ClassLoaderWriter;
import org.apache.sling.commons.fsclassloader.FSClassLoaderMBean;
+import org.osgi.framework.Constants;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Implementation of the FSClassLoaderMBean interface
*/
+@Component(
+ configurationPid = FSClassLoaderProvider.SHARED_CONFIGURATION_PID,
+ property = {
+ Constants.SERVICE_DESCRIPTION + "=Apache Sling FSClassLoader Controller Service",
+ Constants.SERVICE_VENDOR + "=The Apache Software Foundation",
+ "jmx.objectname=org.apache.sling.classloader:name=FSClassLoader,type=ClassLoader"
+ }
+)
public class FSClassLoaderMBeanImpl implements FSClassLoaderMBean {
- private final File root;
- private final FSClassLoaderProvider fsClassLoaderProvider;
+ private volatile File root;
private static final Logger log = LoggerFactory.getLogger(FSClassLoaderMBeanImpl.class);
- public FSClassLoaderMBeanImpl(final FSClassLoaderProvider fsClassLoaderProvider, final File root) {
- this.fsClassLoaderProvider = fsClassLoaderProvider;
- this.root = root;
+ @Reference(target = "(component.name=org.apache.sling.commons.fsclassloader.impl.FSClassLoaderProvider)")
+ private ClassLoaderWriter classLoaderWriter;
+
+ /**
+ * Activate this component. Create the root directory.
+ *
+ * @param componentContext
+ * the component context
+ */
+ @Activate
+ protected void activate(final ComponentContext componentContext, final FSClassLoaderComponentConfig config) {
+ // get the file root
+ this.root = CacheLocationUtils.getRootDir(componentContext.getBundleContext(), config);
}
/*
@@ -93,7 +116,7 @@ public class FSClassLoaderMBeanImpl implements FSClassLoaderMBean {
*/
@Override
public void clearCache() {
- fsClassLoaderProvider.delete("");
+ classLoaderWriter.delete("");
}
/*
diff --git a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java
index 83e2270..845a52a 100644
--- a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java
+++ b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java
@@ -96,8 +96,6 @@ public class FSClassLoaderProvider implements ClassLoaderWriter {
/** The bundle asking for this service instance */
private Bundle callerBundle;
- private static ServiceRegistration<?> mbeanRegistration;
-
/**
* Activate this component. Create the root directory.
*
@@ -137,22 +135,6 @@ public class FSClassLoaderProvider implements ClassLoaderWriter {
}
};
componentContext.getBundleContext().addServiceListener(classLoaderWriterServiceListener, LISTENER_FILTER);
-
- // handle the MBean Installation
- if (mbeanRegistration != null) {
- mbeanRegistration.unregister();
- mbeanRegistration = null;
- }
- Hashtable<String, String> jmxProps = new Hashtable<String, String>();
- jmxProps.put("type", "ClassLoader");
- jmxProps.put("name", "FSClassLoader");
-
- final Hashtable<String, Object> mbeanProps = new Hashtable<String, Object>();
- mbeanProps.put(Constants.SERVICE_DESCRIPTION, "Apache Sling FSClassLoader Controller Service");
- mbeanProps.put(Constants.SERVICE_VENDOR, "The Apache Software Foundation");
- mbeanProps.put("jmx.objectname", new ObjectName("org.apache.sling.classloader", jmxProps));
- mbeanRegistration = componentContext.getBundleContext().registerService(FSClassLoaderMBean.class.getName(),
- new FSClassLoaderMBeanImpl(this, this.root), mbeanProps);
}
/**
@@ -166,10 +148,6 @@ public class FSClassLoaderProvider implements ClassLoaderWriter {
if (classLoaderWriterServiceListener != null) {
componentContext.getBundleContext().removeServiceListener(classLoaderWriterServiceListener);
}
- if (mbeanRegistration != null) {
- mbeanRegistration.unregister();
- mbeanRegistration = null;
- }
}
private void destroyClassLoader() {