Author: cziegeler
Date: Mon Mar 30 14:36:34 2015
New Revision: 1670113
URL: http://svn.apache.org/r1670113
Log:
SLING-4533 : OakResourceListener does not allow to configure the OAK
observation queue length. Apply patch from Marc Pfaff
Modified:
sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/OakResourceListener.java
sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderFactory.java
sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/SynchronousOakResourceListener.java
Modified:
sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/OakResourceListener.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/OakResourceListener.java?rev=1670113&r1=1670112&r2=1670113&view=diff
==============================================================================
---
sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/OakResourceListener.java
(original)
+++
sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/OakResourceListener.java
Mon Mar 30 14:36:34 2015
@@ -80,7 +80,8 @@ public class OakResourceListener extends
final ObservationListenerSupport support,
final BundleContext bundleContext,
final Executor executor,
- final PathMapper pathMapper)
+ final PathMapper pathMapper,
+ final int observationQueueLength)
throws RepositoryException {
super("/", "jcr:primaryType", "sling:resourceType",
"sling:resourceSuperType");
this.support = support;
@@ -91,7 +92,15 @@ public class OakResourceListener extends
props.put(Constants.SERVICE_VENDOR, "The Apache Software Foundation");
props.put(Constants.SERVICE_DESCRIPTION, "Apache Sling JCR Observation
Listener for Oak");
- final Observer observer = new BackgroundObserver(this, executor);
+ final Observer observer = new BackgroundObserver(this, executor,
observationQueueLength) {
+ @Override
+ protected void added(int queueSize) {
+ if (queueSize == observationQueueLength) {
+ logger.warn("Revision queue for observer {} is full (max =
{}). Further revisions will be compacted.",
+ getClass().getName(), observationQueueLength);
+ }
+ }
+ };
serviceRegistration =
bundleContext.registerService(Observer.class.getName(), observer, props);
}
Modified:
sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderFactory.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderFactory.java?rev=1670113&r1=1670112&r2=1670113&view=diff
==============================================================================
---
sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderFactory.java
(original)
+++
sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderFactory.java
Mon Mar 30 14:36:34 2015
@@ -84,6 +84,8 @@ public class JcrResourceProviderFactory
*/
private static final String NEW_PASSWORD = "user.newpassword";
+ private static final int DEFAULT_OBSERVATION_QUEUE_LENGTH = 1000;
+
/** Logger */
private final Logger log = LoggerFactory.getLogger(getClass());
@@ -93,6 +95,12 @@ public class JcrResourceProviderFactory
description="If this switch is enabled, and Oak is used as the
repository implementation, some optimized components are used.")
private static final String PROPERTY_OPTIMIZE_FOR_OAK = "optimize.oak";
+ @Property(
+ intValue = DEFAULT_OBSERVATION_QUEUE_LENGTH,
+ label = "Observation queue length",
+ description = "Maximum number of pending revisions in a
observation listener queue")
+ private static final String OBSERVATION_QUEUE_LENGTH =
"oak.observation.queue-length";
+
private static final String REPOSITORY_REFERNENCE_NAME = "repository";
/** The dynamic class loader */
@@ -147,8 +155,9 @@ public class JcrResourceProviderFactory
try {
if ( isOak ) {
try {
- this.listener = new OakResourceListener(root, support,
context.getBundleContext(), executor, pathMapper);
- log.info("Detected Oak based repository. Using improved
JCR Resource Listener");
+ int observationQueueLength =
PropertiesUtil.toInteger(context.getProperties().get(OBSERVATION_QUEUE_LENGTH),
DEFAULT_OBSERVATION_QUEUE_LENGTH);
+ this.listener = new OakResourceListener(root, support,
context.getBundleContext(), executor, pathMapper, observationQueueLength);
+ log.info("Detected Oak based repository. Using improved
JCR Resource Listener with observation queue length {}",
observationQueueLength);
} catch ( final RepositoryException re ) {
throw re;
} catch ( final Throwable t ) {
Modified:
sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/SynchronousOakResourceListener.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/SynchronousOakResourceListener.java?rev=1670113&r1=1670112&r2=1670113&view=diff
==============================================================================
---
sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/SynchronousOakResourceListener.java
(original)
+++
sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/SynchronousOakResourceListener.java
Mon Mar 30 14:36:34 2015
@@ -45,7 +45,7 @@ public class SynchronousOakResourceListe
final ServiceTracker tracker,
final Executor executor)
throws LoginException, RepositoryException, NoSuchFieldException {
- super("/", new ObservationListenerSupport(bundleContext, repo),
bundleContext, executor, new PathMapperImpl());
+ super("/", new ObservationListenerSupport(bundleContext, repo),
bundleContext, executor, new PathMapperImpl(), 1000);
PrivateAccessor.setField(this.support, "resourceResolver", resolver);
PrivateAccessor.setField(this.support, "eventAdminTracker", tracker);
}