You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by to...@apache.org on 2016/11/04 15:57:44 UTC
svn commit: r1768058 - in
/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution:
monitor/impl/ serialization/impl/ serialization/impl/vlt/
Author: tommaso
Date: Fri Nov 4 15:57:44 2016
New Revision: 1768058
URL: http://svn.apache.org/viewvc?rev=1768058&view=rev
Log:
SLING-6232 - applied patch from Simone Tripodi about monitoring package builders
Added:
sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/monitor/impl/DistributionPackageMBean.java (with props)
sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/monitor/impl/DistributionPackageMBeanImpl.java (with props)
sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/monitor/impl/MonitoringDistributionPackageBuilder.java (with props)
Modified:
sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/DistributionPackageBuilderFactory.java
sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java
Added: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/monitor/impl/DistributionPackageMBean.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/monitor/impl/DistributionPackageMBean.java?rev=1768058&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/monitor/impl/DistributionPackageMBean.java (added)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/monitor/impl/DistributionPackageMBean.java Fri Nov 4 15:57:44 2016
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.distribution.monitor.impl;
+
+import org.apache.sling.distribution.packaging.DistributionPackage;
+
+/**
+ * An Mbean for a {@link DistributionPackage}
+ */
+public interface DistributionPackageMBean {
+
+ String getId();
+
+ String getType();
+
+ String[] getPaths();
+
+ String getRequestType();
+
+ long getSize();
+
+ long getProcessingTime();
+
+}
Propchange: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/monitor/impl/DistributionPackageMBean.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/monitor/impl/DistributionPackageMBeanImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/monitor/impl/DistributionPackageMBeanImpl.java?rev=1768058&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/monitor/impl/DistributionPackageMBeanImpl.java (added)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/monitor/impl/DistributionPackageMBeanImpl.java Fri Nov 4 15:57:44 2016
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.distribution.monitor.impl;
+
+/**
+ * Implementation of {@link DistributionPackageMBean}
+ */
+public final class DistributionPackageMBeanImpl implements DistributionPackageMBean {
+
+ private final String id;
+
+ private final String type;
+
+ private final String[] paths;
+
+ private final String requestType;
+
+ private final long size;
+
+ private final long processingTime;
+
+ public DistributionPackageMBeanImpl(String id,
+ String type,
+ String[] paths,
+ String requestType,
+ long size,
+ long processingTime) {
+ this.id = id;
+ this.type = type;
+ this.paths = paths;
+ this.requestType = requestType;
+ this.size = size;
+ this.processingTime = processingTime;
+ }
+
+ @Override
+ public String getId() {
+ return id;
+ }
+
+ @Override
+ public String getType() {
+ return type;
+ }
+
+ @Override
+ public String[] getPaths() {
+ return paths;
+ }
+
+ @Override
+ public String getRequestType() {
+ return requestType;
+ }
+
+ @Override
+ public long getSize() {
+ return size;
+ }
+
+ @Override
+ public long getProcessingTime() {
+ return processingTime;
+ }
+
+}
Propchange: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/monitor/impl/DistributionPackageMBeanImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/monitor/impl/MonitoringDistributionPackageBuilder.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/monitor/impl/MonitoringDistributionPackageBuilder.java?rev=1768058&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/monitor/impl/MonitoringDistributionPackageBuilder.java (added)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/monitor/impl/MonitoringDistributionPackageBuilder.java Fri Nov 4 15:57:44 2016
@@ -0,0 +1,135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.distribution.monitor.impl;
+
+import java.io.InputStream;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Queue;
+import java.util.concurrent.PriorityBlockingQueue;
+
+import javax.management.ObjectName;
+
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.distribution.DistributionRequest;
+import org.apache.sling.distribution.common.DistributionException;
+import org.apache.sling.distribution.packaging.DistributionPackage;
+import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
+import org.apache.sling.distribution.packaging.DistributionPackageInfo;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+
+public final class MonitoringDistributionPackageBuilder implements DistributionPackageBuilder {
+
+ private final DistributionPackageBuilder wrapped;
+
+ private final BundleContext context;
+
+ private final int queueCapacity;
+
+ private final Queue<ServiceRegistration> mBeans;
+
+ public MonitoringDistributionPackageBuilder(int queueCapacity, DistributionPackageBuilder wrapped, BundleContext context) {
+ this.wrapped = wrapped;
+ this.context = context;
+ this.queueCapacity = queueCapacity;
+
+ mBeans = new PriorityBlockingQueue<ServiceRegistration>(queueCapacity);
+ }
+
+ @Override
+ public String getType() {
+ return wrapped.getType();
+ }
+
+ @Override
+ public DistributionPackage createPackage(ResourceResolver resourceResolver, DistributionRequest request) throws DistributionException {
+ long start = System.currentTimeMillis();
+ DistributionPackage distributionPackage = wrapped.createPackage(resourceResolver, request);
+ registerDistributionPackageMBean(start, distributionPackage);
+ return distributionPackage;
+ }
+
+ @Override
+ public DistributionPackage readPackage(ResourceResolver resourceResolver, InputStream stream) throws DistributionException {
+ long start = System.currentTimeMillis();
+ DistributionPackage distributionPackage = wrapped.readPackage(resourceResolver, stream);
+ registerDistributionPackageMBean(start, distributionPackage);
+ return distributionPackage;
+ }
+
+ @Override
+ public DistributionPackage getPackage(ResourceResolver resourceResolver, String id) throws DistributionException {
+ long start = System.currentTimeMillis();
+ DistributionPackage distributionPackage = wrapped.getPackage(resourceResolver, id);
+ registerDistributionPackageMBean(start, distributionPackage);
+ return distributionPackage;
+ }
+
+ @Override
+ public boolean installPackage(ResourceResolver resourceResolver, DistributionPackage distributionPackage) throws DistributionException {
+ long start = System.currentTimeMillis();
+ boolean installed = wrapped.installPackage(resourceResolver, distributionPackage);
+ registerDistributionPackageMBean(start, distributionPackage);
+ return installed;
+ }
+
+ @Override
+ public DistributionPackageInfo installPackage(ResourceResolver resourceResolver, InputStream stream) throws DistributionException {
+ return wrapped.installPackage(resourceResolver, stream);
+ }
+
+ private final void registerDistributionPackageMBean(long start, DistributionPackage distributionPackage) {
+ long processingTime = System.currentTimeMillis() - start;
+
+ DistributionPackageMBean mBean = new DistributionPackageMBeanImpl(distributionPackage.getId(),
+ wrapped.getType(),
+ distributionPackage.getInfo().getPaths(),
+ distributionPackage.getInfo().getRequestType().name(),
+ distributionPackage.getSize(),
+ processingTime);
+
+ Dictionary<String, String> mbeanProps = new Hashtable<String, String>();
+ mbeanProps.put("jmx.objectname", "org.apache.sling.distribution:type=distributionpackage,id="
+ + ObjectName.quote(distributionPackage.getId()));
+
+ ServiceRegistration mBeanRegistration = context.registerService(DistributionPackageMBean.class.getName(), mBean, mbeanProps);
+
+ if (queueCapacity == mBeans.size()) {
+ ServiceRegistration toBeRemoved = mBeans.poll();
+ safeUnregister(toBeRemoved);
+ }
+
+ mBeans.offer(mBeanRegistration);
+ }
+
+ public void clear() {
+ while (!mBeans.isEmpty()) {
+ ServiceRegistration toBeRemoved = mBeans.poll();
+ safeUnregister(toBeRemoved);
+ }
+ }
+
+ private static void safeUnregister(ServiceRegistration serviceRegistration) {
+ if (serviceRegistration != null) {
+ serviceRegistration.unregister();
+ }
+ }
+
+}
Propchange: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/monitor/impl/MonitoringDistributionPackageBuilder.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/DistributionPackageBuilderFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/DistributionPackageBuilderFactory.java?rev=1768058&r1=1768057&r2=1768058&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/DistributionPackageBuilderFactory.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/DistributionPackageBuilderFactory.java Fri Nov 4 15:57:44 2016
@@ -27,6 +27,7 @@ import javax.annotation.Nonnull;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.ConfigurationPolicy;
+import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.PropertyOption;
import org.apache.felix.scr.annotations.Reference;
@@ -37,6 +38,7 @@ import org.apache.sling.distribution.Dis
import org.apache.sling.distribution.common.DistributionException;
import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.component.impl.SettingsUtils;
+import org.apache.sling.distribution.monitor.impl.MonitoringDistributionPackageBuilder;
import org.apache.sling.distribution.packaging.DistributionPackage;
import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
import org.apache.sling.distribution.packaging.DistributionPackageInfo;
@@ -44,6 +46,7 @@ import org.apache.sling.distribution.pac
import org.apache.sling.distribution.packaging.impl.ResourceDistributionPackageBuilder;
import org.apache.sling.distribution.serialization.DistributionContentSerializer;
import org.apache.sling.distribution.util.impl.FileBackedMemoryOutputStream.MemoryUnit;
+import org.osgi.framework.BundleContext;
/**
* A factory for package builders
@@ -142,10 +145,20 @@ public class DistributionPackageBuilderF
)
private static final String DIGEST_ALGORITHM = "digestAlgorithm";
- private DistributionPackageBuilder packageBuilder;
+ private static final int DEFAULT_MONITORING_QUEUE_SIZE = 100;
+
+ @Property(
+ label="The number of items for monitoring distribution packages creation/installation",
+ description = "The number of items for monitoring distribution packages creation/installation, 100 by default",
+ intValue = DEFAULT_MONITORING_QUEUE_SIZE
+ )
+ private static final String MONITORING_QUEUE_SIZE = "monitoringQueueSize";
+
+ private MonitoringDistributionPackageBuilder packageBuilder;
@Activate
- public void activate(Map<String, Object> config) {
+ public void activate(BundleContext context,
+ Map<String, Object> config) {
String persistenceType = PropertiesUtil.toString(config.get(PERSISTENCE), null);
String tempFsFolder = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(TEMP_FS_FOLDER), null));
@@ -154,17 +167,24 @@ public class DistributionPackageBuilderF
digestAlgorithm = null;
}
+ DistributionPackageBuilder wrapped;
if ("file".equals(persistenceType)) {
- packageBuilder = new FileDistributionPackageBuilder(contentSerializer.getName(), contentSerializer, tempFsFolder, digestAlgorithm);
+ wrapped = new FileDistributionPackageBuilder(contentSerializer.getName(), contentSerializer, tempFsFolder, digestAlgorithm);
} else {
final int fileThreshold = PropertiesUtil.toInteger(config.get(FILE_THRESHOLD), DEFAULT_FILE_THRESHOLD_VALUE);
String memoryUnitName = PropertiesUtil.toString(config.get(MEMORY_UNIT), DEFAULT_MEMORY_UNIT);
final MemoryUnit memoryUnit = MemoryUnit.valueOf(memoryUnitName);
final boolean useOffHeapMemory = PropertiesUtil.toBoolean(config.get(USE_OFF_HEAP_MEMORY), DEFAULT_USE_OFF_HEAP_MEMORY);
- packageBuilder = new ResourceDistributionPackageBuilder(contentSerializer.getName(), contentSerializer, tempFsFolder, fileThreshold, memoryUnit, useOffHeapMemory, digestAlgorithm);
+ wrapped = new ResourceDistributionPackageBuilder(contentSerializer.getName(), contentSerializer, tempFsFolder, fileThreshold, memoryUnit, useOffHeapMemory, digestAlgorithm);
}
+ int monitoringQueueSize = PropertiesUtil.toInteger(config.get(MONITORING_QUEUE_SIZE), DEFAULT_MONITORING_QUEUE_SIZE);
+ packageBuilder = new MonitoringDistributionPackageBuilder(monitoringQueueSize, wrapped, context);
+ }
+ @Deactivate
+ public void deactivate() {
+ packageBuilder.clear();
}
public String getType() {
Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java?rev=1768058&r1=1768057&r2=1768058&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java Fri Nov 4 15:57:44 2016
@@ -18,14 +18,16 @@
*/
package org.apache.sling.distribution.serialization.impl.vlt;
-import javax.annotation.CheckForNull;
-import javax.annotation.Nonnull;
import java.io.InputStream;
import java.util.Map;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.ConfigurationPolicy;
+import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.PropertyOption;
import org.apache.felix.scr.annotations.PropertyUnbounded;
@@ -40,13 +42,15 @@ import org.apache.sling.distribution.Dis
import org.apache.sling.distribution.common.DistributionException;
import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.component.impl.SettingsUtils;
-import org.apache.sling.distribution.serialization.DistributionContentSerializer;
-import org.apache.sling.distribution.util.impl.FileBackedMemoryOutputStream.MemoryUnit;
+import org.apache.sling.distribution.monitor.impl.MonitoringDistributionPackageBuilder;
import org.apache.sling.distribution.packaging.DistributionPackage;
import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
import org.apache.sling.distribution.packaging.DistributionPackageInfo;
import org.apache.sling.distribution.packaging.impl.FileDistributionPackageBuilder;
import org.apache.sling.distribution.packaging.impl.ResourceDistributionPackageBuilder;
+import org.apache.sling.distribution.serialization.DistributionContentSerializer;
+import org.apache.sling.distribution.util.impl.FileBackedMemoryOutputStream.MemoryUnit;
+import org.osgi.framework.BundleContext;
/**
* A package builder for Apache Jackrabbit FileVault based implementations.
@@ -178,14 +182,23 @@ public class VaultDistributionPackageBui
)
private static final String DIGEST_ALGORITHM = "digestAlgorithm";
+ private static final int DEFAULT_MONITORING_QUEUE_SIZE = 100;
+
+ @Property(
+ label="The number of items for monitoring distribution packages creation/installation",
+ description = "The number of items for monitoring distribution packages creation/installation, 100 by default",
+ intValue = DEFAULT_MONITORING_QUEUE_SIZE
+ )
+ private static final String MONITORING_QUEUE_SIZE = "monitoringQueueSize";
+
@Reference
private Packaging packaging;
- private DistributionPackageBuilder packageBuilder;
+ private MonitoringDistributionPackageBuilder packageBuilder;
@Activate
- public void activate(Map<String, Object> config) {
+ public void activate(BundleContext context, Map<String, Object> config) {
String name = PropertiesUtil.toString(config.get(NAME), null);
String type = PropertiesUtil.toString(config.get(TYPE), null);
@@ -218,15 +231,24 @@ public class VaultDistributionPackageBui
DistributionContentSerializer contentSerializer = new FileVaultContentSerializer(name, packaging, importMode, aclHandling,
packageRoots, packageNodeFilters, packagePropertyFilters, useBinaryReferences, autosaveThreshold);
+ DistributionPackageBuilder wrapped;
if ("filevlt".equals(type)) {
- packageBuilder = new FileDistributionPackageBuilder(name, contentSerializer, tempFsFolder, digestAlgorithm);
+ wrapped = new FileDistributionPackageBuilder(name, contentSerializer, tempFsFolder, digestAlgorithm);
} else {
final int fileThreshold = PropertiesUtil.toInteger(config.get(FILE_THRESHOLD), DEFAULT_FILE_THRESHOLD_VALUE);
String memoryUnitName = PropertiesUtil.toString(config.get(MEMORY_UNIT), DEFAULT_MEMORY_UNIT);
final MemoryUnit memoryUnit = MemoryUnit.valueOf(memoryUnitName);
final boolean useOffHeapMemory = PropertiesUtil.toBoolean(config.get(USE_OFF_HEAP_MEMORY), DEFAULT_USE_OFF_HEAP_MEMORY);
- packageBuilder = new ResourceDistributionPackageBuilder(contentSerializer.getName(), contentSerializer, tempFsFolder, fileThreshold, memoryUnit, useOffHeapMemory, digestAlgorithm);
+ wrapped = new ResourceDistributionPackageBuilder(contentSerializer.getName(), contentSerializer, tempFsFolder, fileThreshold, memoryUnit, useOffHeapMemory, digestAlgorithm);
}
+
+ int monitoringQueueSize = PropertiesUtil.toInteger(config.get(MONITORING_QUEUE_SIZE), DEFAULT_MONITORING_QUEUE_SIZE);
+ packageBuilder = new MonitoringDistributionPackageBuilder(monitoringQueueSize, wrapped, context);
+ }
+
+ @Deactivate
+ public void deactivate() {
+ packageBuilder.clear();
}
public String getType() {