You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2016/11/24 16:09:37 UTC

svn commit: r1771173 - in /sling/trunk/installer/providers/jcr/src: main/java/org/apache/sling/installer/provider/jcr/impl/ test/java/org/apache/sling/installer/provider/jcr/impl/

Author: rombert
Date: Thu Nov 24 16:09:37 2016
New Revision: 1771173

URL: http://svn.apache.org/viewvc?rev=1771173&view=rev
Log:
SLING-6326 - JcrInstaller.counters should be accessed in a thread-safe
manner

JcrInstaller.counters is now an AtomicLongArray

Modified:
    sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/JcrInstaller.java
    sling/trunk/installer/providers/jcr/src/test/java/org/apache/sling/installer/provider/jcr/impl/MiscUtil.java
    sling/trunk/installer/providers/jcr/src/test/java/org/apache/sling/installer/provider/jcr/impl/ScanningLoopTest.java

Modified: sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/JcrInstaller.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/JcrInstaller.java?rev=1771173&r1=1771172&r2=1771173&view=diff
==============================================================================
--- sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/JcrInstaller.java (original)
+++ sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/JcrInstaller.java Thu Nov 24 16:09:37 2016
@@ -31,6 +31,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLongArray;
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
@@ -87,7 +88,7 @@ public class JcrInstaller implements Upd
 	private final Logger logger = LoggerFactory.getLogger(getClass());
 
 	/** Counters, used for statistics and testing */
-	private final long [] counters = new long[COUNTERS_COUNT];
+	private final AtomicLongArray counters = new AtomicLongArray(COUNTERS_COUNT);
 	public static final int SCAN_FOLDERS_COUNTER = 0;
     public static final int UPDATE_FOLDERS_LIST_COUNTER = 1;
     public static final int RUN_LOOP_COUNTER = 2;
@@ -320,7 +321,7 @@ public class JcrInstaller implements Upd
                 }
             }
             logger.info("Background thread {} done", Thread.currentThread().getName());
-            counters[RUN_LOOP_COUNTER] = -1;
+            counters.set(RUN_LOOP_COUNTER, -1);
         }
 
         public InstallerConfig getConfiguration() {
@@ -528,9 +529,7 @@ public class JcrInstaller implements Upd
                     session.refresh(false);
                     didRefresh = true;
                 }
-                counters[SCAN_FOLDERS_COUNTER]++;
-                
-                new RuntimeException("SCAN_FOLDERS_COUNTER is now " + counters[SCAN_FOLDERS_COUNTER]).printStackTrace();
+                counters.incrementAndGet(SCAN_FOLDERS_COUNTER);
                 
                 final WatchedFolder.ScanResult sr = wf.scan();
                 boolean toDo = false;
@@ -556,7 +555,7 @@ public class JcrInstaller implements Upd
                     didRefresh = true;
                 }
                 updateFoldersListTimer.reset();
-                counters[UPDATE_FOLDERS_LIST_COUNTER]++;
+                counters.incrementAndGet(UPDATE_FOLDERS_LIST_COUNTER);
                 final List<String> toRemove = updateFoldersList(cfg, session);
                 if ( toRemove.size() > 0 ) {
                     logger.info("Removing resource from OSGi installer (folder deleted): {}", toRemove);
@@ -579,7 +578,7 @@ public class JcrInstaller implements Upd
                 }
             }
         }
-        counters[RUN_LOOP_COUNTER]++;
+        counters.incrementAndGet(RUN_LOOP_COUNTER);
     }
 
     boolean scanningIsPaused(final InstallerConfig cfg, final Session session) throws RepositoryException {
@@ -599,8 +598,8 @@ public class JcrInstaller implements Upd
         return false;
     }
 
-    long [] getCounters() {
-        return counters;
+    long getCounterValue(int key) {
+        return counters.get(key);
     }
 
     /**

Modified: sling/trunk/installer/providers/jcr/src/test/java/org/apache/sling/installer/provider/jcr/impl/MiscUtil.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/providers/jcr/src/test/java/org/apache/sling/installer/provider/jcr/impl/MiscUtil.java?rev=1771173&r1=1771172&r2=1771173&view=diff
==============================================================================
--- sling/trunk/installer/providers/jcr/src/test/java/org/apache/sling/installer/provider/jcr/impl/MiscUtil.java (original)
+++ sling/trunk/installer/providers/jcr/src/test/java/org/apache/sling/installer/provider/jcr/impl/MiscUtil.java Thu Nov 24 16:09:37 2016
@@ -32,7 +32,7 @@ class MiscUtil {
         final long endTime = System.currentTimeMillis() + timeoutMsec;
         long cycles = 0;
         while(System.currentTimeMillis() < endTime) {
-            cycles = installer.getCounters()[JcrInstaller.RUN_LOOP_COUNTER] - initialCycleCount;
+            cycles = installer.getCounterValue(JcrInstaller.RUN_LOOP_COUNTER) - initialCycleCount;
             if(cycles >= expectedCycles) {
                 return;
             }
@@ -49,7 +49,7 @@ class MiscUtil {
 
     /** Wait long enough for all changes in content to be processed by JcrInstaller */
     static void waitAfterContentChanges(EventHelper eventHelper, JcrInstaller installer) throws Exception {
-        final long startCycles = installer.getCounters()[JcrInstaller.RUN_LOOP_COUNTER];
+        final long startCycles = installer.getCounterValue(JcrInstaller.RUN_LOOP_COUNTER);
 
         // First wait for all JCR events to be delivered
         eventHelper.waitForEvents(5000L);
@@ -64,7 +64,7 @@ class MiscUtil {
     static void waitForInstallerThread(JcrInstaller installer, long timeoutMsec) throws Exception {
         final long endTime = System.currentTimeMillis() + timeoutMsec;
         while(System.currentTimeMillis() < endTime) {
-            if(installer.getCounters()[JcrInstaller.RUN_LOOP_COUNTER] == -1) {
+            if(installer.getCounterValue(JcrInstaller.RUN_LOOP_COUNTER) == -1) {
                 return;
             }
         }

Modified: sling/trunk/installer/providers/jcr/src/test/java/org/apache/sling/installer/provider/jcr/impl/ScanningLoopTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/providers/jcr/src/test/java/org/apache/sling/installer/provider/jcr/impl/ScanningLoopTest.java?rev=1771173&r1=1771172&r2=1771173&view=diff
==============================================================================
--- sling/trunk/installer/providers/jcr/src/test/java/org/apache/sling/installer/provider/jcr/impl/ScanningLoopTest.java (original)
+++ sling/trunk/installer/providers/jcr/src/test/java/org/apache/sling/installer/provider/jcr/impl/ScanningLoopTest.java Thu Nov 24 16:09:37 2016
@@ -50,19 +50,19 @@ public class ScanningLoopTest extends Jc
                 break;
         }
         
-        assertEquals("Counter " + label, value, installer.getCounters()[index]);
+        assertEquals("Counter " + label, value, installer.getCounterValue(index));
     }
 
     private void assertIdle() throws Exception {
-        final long sf = installer.getCounters()[JcrInstaller.SCAN_FOLDERS_COUNTER];
-        final long uc = installer.getCounters()[JcrInstaller.UPDATE_FOLDERS_LIST_COUNTER];
+        final long sf = installer.getCounterValue(JcrInstaller.SCAN_FOLDERS_COUNTER);
+        final long uc = installer.getCounterValue(JcrInstaller.UPDATE_FOLDERS_LIST_COUNTER);
         Thread.sleep(JcrInstaller.RUN_LOOP_DELAY_MSEC * 2);
         assertCounter(JcrInstaller.SCAN_FOLDERS_COUNTER, sf);
         assertCounter(JcrInstaller.UPDATE_FOLDERS_LIST_COUNTER, uc);
     }
 
     private void assertEvents(String info, long oldCount, int counterIndex) {
-        final long newCount = installer.getCounters()[counterIndex];
+        final long newCount = installer.getCounterValue(counterIndex);
         assertTrue(info + " (old=" + oldCount + ", new=" + newCount + ")", newCount > oldCount);
     }
 
@@ -88,13 +88,13 @@ public class ScanningLoopTest extends Jc
         eventHelper.waitForEvents(TIMEOUT);
 
         assertTrue(installer.scanningIsPaused(installer.getConfiguration(), installer.getSession()));
-        final long sf = installer.getCounters()[JcrInstaller.SCAN_FOLDERS_COUNTER];
-        final long uc = installer.getCounters()[JcrInstaller.UPDATE_FOLDERS_LIST_COUNTER];
+        final long sf = installer.getCounterValue(JcrInstaller.SCAN_FOLDERS_COUNTER);
+        final long uc = installer.getCounterValue(JcrInstaller.UPDATE_FOLDERS_LIST_COUNTER);
 
         Thread.sleep(JcrInstaller.RUN_LOOP_DELAY_MSEC * 2);
 
         //Counters should not have changed as no scanning being performed
-        assertEquals(sf, installer.getCounters()[JcrInstaller.SCAN_FOLDERS_COUNTER]);
+        assertEquals(sf, installer.getCounterValue(JcrInstaller.SCAN_FOLDERS_COUNTER));
 
         //Now lets resume again
         testNode.remove();
@@ -116,8 +116,8 @@ public class ScanningLoopTest extends Jc
 
     @Test
     public void testAddContentOutside() throws Exception {
-        final long sf = installer.getCounters()[JcrInstaller.SCAN_FOLDERS_COUNTER];
-        final long uc = installer.getCounters()[JcrInstaller.UPDATE_FOLDERS_LIST_COUNTER];
+        final long sf = installer.getCounterValue(JcrInstaller.SCAN_FOLDERS_COUNTER);
+        final long uc = installer.getCounterValue(JcrInstaller.UPDATE_FOLDERS_LIST_COUNTER);
 
         contentHelper.createOrUpdateFile("/" + System.currentTimeMillis());
         eventHelper.waitForEvents(TIMEOUT);
@@ -135,7 +135,7 @@ public class ScanningLoopTest extends Jc
         Thread.sleep(JcrInstaller.RUN_LOOP_DELAY_MSEC * 2);
         assertIdle();
 
-        final long sf = installer.getCounters()[JcrInstaller.SCAN_FOLDERS_COUNTER];
+        final long sf = installer.getCounterValue(JcrInstaller.SCAN_FOLDERS_COUNTER);
         contentHelper.delete(contentHelper.FAKE_RESOURCES[0]);
         eventHelper.waitForEvents(TIMEOUT);
         Thread.sleep(JcrInstaller.RUN_LOOP_DELAY_MSEC * 2);
@@ -152,7 +152,7 @@ public class ScanningLoopTest extends Jc
         Thread.sleep(JcrInstaller.RUN_LOOP_DELAY_MSEC * 2);
         assertIdle();
 
-        final long uc = installer.getCounters()[JcrInstaller.UPDATE_FOLDERS_LIST_COUNTER];
+        final long uc = installer.getCounterValue(JcrInstaller.UPDATE_FOLDERS_LIST_COUNTER);
         contentHelper.delete("/libs");
         eventHelper.waitForEvents(TIMEOUT);
         Thread.sleep(JcrInstaller.RUN_LOOP_DELAY_MSEC * 2);
@@ -161,9 +161,4 @@ public class ScanningLoopTest extends Jc
 
         assertIdle();
     }
-
-    private static String getParentPath(String absPath){
-        int pos = absPath.lastIndexOf('/');
-        return absPath.substring(0, pos);
-    }
 }
\ No newline at end of file