You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2013/09/04 17:29:15 UTC

svn commit: r1520051 - in /sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl: dea/DistributedEventReceiver.java support/BatchResourceRemover.java

Author: cziegeler
Date: Wed Sep  4 15:29:15 2013
New Revision: 1520051

URL: http://svn.apache.org/r1520051
Log:
SLING-3039 :  Obsolete events should be removed in batches from the resource tree 

Added:
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/support/BatchResourceRemover.java   (with props)
Modified:
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/dea/DistributedEventReceiver.java

Modified: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/dea/DistributedEventReceiver.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/dea/DistributedEventReceiver.java?rev=1520051&r1=1520050&r2=1520051&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/dea/DistributedEventReceiver.java (original)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/dea/DistributedEventReceiver.java Wed Sep  4 15:29:15 2013
@@ -45,6 +45,7 @@ import org.apache.sling.discovery.Topolo
 import org.apache.sling.discovery.TopologyEvent.Type;
 import org.apache.sling.discovery.TopologyEventListener;
 import org.apache.sling.event.EventUtil;
+import org.apache.sling.event.impl.support.BatchResourceRemover;
 import org.apache.sling.event.impl.support.Environment;
 import org.apache.sling.event.impl.support.ResourceHelper;
 import org.apache.sling.event.jobs.JobUtil;
@@ -255,13 +256,15 @@ public class DistributedEventReceiver
                 final Resource baseResource = resolver.getResource(this.config.getRootPathWithSlash());
                 // sanity check - should never be null
                 if ( baseResource != null ) {
+                    final BatchResourceRemover brr = new BatchResourceRemover();
                     final Iterator<Resource> iter = baseResource.listChildren();
                     while ( iter.hasNext() ) {
                         final Resource rootResource = iter.next();
                         if ( !slingIds.contains(rootResource.getName()) ) {
-                            resolver.delete(rootResource);
+                            brr.delete(rootResource);
                         }
                     }
+                    // final commit for outstanding deletes
                     resolver.commit();
                 }
 
@@ -285,6 +288,7 @@ public class DistributedEventReceiver
             ResourceResolver resolver = null;
             try {
                 resolver = this.resourceResolverFactory.getAdministrativeResourceResolver(null);
+                final BatchResourceRemover brr = new BatchResourceRemover();
 
                 final Resource baseResource = resolver.getResource(this.config.getOwnRootPath());
                 // sanity check - should never be null
@@ -299,7 +303,7 @@ public class DistributedEventReceiver
                         final Resource yearResource = yearIter.next();
                         final int year = Integer.valueOf(yearResource.getName());
                         if ( year < oldYear ) {
-                            resolver.delete(yearResource);
+                            brr.delete(yearResource);
                         } else if ( year == oldYear ) {
 
                             // same year - check months
@@ -309,7 +313,7 @@ public class DistributedEventReceiver
                                 final Resource monthResource = monthIter.next();
                                 final int month = Integer.valueOf(monthResource.getName());
                                 if ( month < oldMonth ) {
-                                    resolver.delete(monthResource);
+                                    brr.delete(monthResource);
                                 } else if ( month == oldMonth ) {
 
                                     // same month - check days
@@ -319,7 +323,7 @@ public class DistributedEventReceiver
                                         final Resource dayResource = dayIter.next();
                                         final int day = Integer.valueOf(dayResource.getName());
                                         if ( day < oldDay ) {
-                                            resolver.delete(dayResource);
+                                            brr.delete(dayResource);
                                         } else if ( day == oldDay ) {
 
                                             // same day - check hours
@@ -329,7 +333,7 @@ public class DistributedEventReceiver
                                                 final Resource hourResource = hourIter.next();
                                                 final int hour = Integer.valueOf(hourResource.getName());
                                                 if ( hour < oldHour ) {
-                                                    resolver.delete(hourResource);
+                                                    brr.delete(hourResource);
                                                 } else if ( hour == oldHour ) {
 
                                                     // same hour - check minutes
@@ -340,7 +344,7 @@ public class DistributedEventReceiver
 
                                                         final int minute = Integer.valueOf(minuteResource.getName());
                                                         if ( minute < oldMinute ) {
-                                                            resolver.delete(minuteResource);
+                                                            brr.delete(minuteResource);
                                                         }
                                                     }
                                                 }
@@ -352,6 +356,7 @@ public class DistributedEventReceiver
                         }
                     }
                 }
+                // final commit for outstanding resources
                 resolver.commit();
 
             } catch (final PersistenceException pe) {

Added: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/support/BatchResourceRemover.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/support/BatchResourceRemover.java?rev=1520051&view=auto
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/support/BatchResourceRemover.java (added)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/support/BatchResourceRemover.java Wed Sep  4 15:29:15 2013
@@ -0,0 +1,55 @@
+/*
+ * 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.event.impl.support;
+
+import org.apache.sling.api.resource.PersistenceException;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+
+/**
+ * This class can be used for batch removal of resources
+ */
+public class BatchResourceRemover {
+
+    private final int max;
+
+    private int count;
+
+    public BatchResourceRemover() {
+        this(50);
+    }
+
+    public BatchResourceRemover(final int batchSize) {
+        this.max = batchSize;
+    }
+
+    public void delete(final Resource rsrc )
+    throws PersistenceException {
+        final ResourceResolver resolver = rsrc.getResourceResolver();
+        for(final Resource child : rsrc.getChildren()) {
+            delete(child);
+        }
+        resolver.delete(rsrc);
+        count++;
+        if ( count >= max ) {
+            resolver.commit();
+            count = 0;
+        }
+    }
+}

Propchange: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/support/BatchResourceRemover.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/support/BatchResourceRemover.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url