You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by md...@apache.org on 2015/08/31 16:13:32 UTC

svn commit: r1700252 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/segment/ test/java/org/apache/jackrabbit/oak/plugins/segment/

Author: mduerig
Date: Mon Aug 31 14:13:31 2015
New Revision: 1700252

URL: http://svn.apache.org/r1700252
Log:
OAK-3317: ConcurrentModificationException when running SegmentOverflowExceptionIT
Make CompactionMap.maps immutable and instead leave out empty generations on subsequent cons operation

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/CompactionMap.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/InMemoryCompactionMap.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/PartialCompactionMap.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/PersistedCompactionMap.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/package-info.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionMapTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/CompactionMap.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/CompactionMap.java?rev=1700252&r1=1700251&r2=1700252&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/CompactionMap.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/CompactionMap.java Mon Aug 31 14:13:31 2015
@@ -103,26 +103,25 @@ public class CompactionMap {
      * @param uuids  uuids of the keys to remove
      */
     public void remove(@Nonnull Set<UUID> uuids) {
-        List<PartialCompactionMap> remove = newArrayList();
         for (PartialCompactionMap map : maps) {
             map.remove(uuids);
-            if (map.getSegmentCount() == 0) {
-                remove.add(map);
-            }
         }
-        maps.removeAll(remove);
     }
 
     /**
      * Create a new {@code CompactionMap} containing all maps
-     * of this instances and additional the passed {@code map}.
-     * @param map
+     * of this instances and additional the passed map {@code head}.
+     * @param head
      * @return a new {@code CompactionMap} instance
      */
     @Nonnull
-    public CompactionMap cons(@Nonnull PartialCompactionMap map) {
-        List<PartialCompactionMap> maps = newArrayList(map);
-        maps.addAll(this.maps);
+    public CompactionMap cons(@Nonnull PartialCompactionMap head) {
+        List<PartialCompactionMap> maps = newArrayList(head);
+        for (PartialCompactionMap map : this.maps) {
+            if (!map.isEmpty()) {
+                maps.add(map);
+            }
+        }
         return new CompactionMap(maps);
     }
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/InMemoryCompactionMap.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/InMemoryCompactionMap.java?rev=1700252&r1=1700251&r2=1700252&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/InMemoryCompactionMap.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/InMemoryCompactionMap.java Mon Aug 31 14:13:31 2015
@@ -185,6 +185,11 @@ public class InMemoryCompactionMap imple
         return afterOffsets.length;
     }
 
+    @Override
+    public boolean isEmpty() {
+        return afterOffsets.length == 0 && recent.isEmpty();
+    }
+
     private void compress(@Nonnull Set<UUID> removed) {
         if (recent.isEmpty() && removed.isEmpty()) {
             // no-op

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/PartialCompactionMap.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/PartialCompactionMap.java?rev=1700252&r1=1700251&r2=1700252&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/PartialCompactionMap.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/PartialCompactionMap.java Mon Aug 31 14:13:31 2015
@@ -97,6 +97,12 @@ public interface PartialCompactionMap {
     long getRecordCount();
 
     /**
+     * Determine whether this map contains keys at all.
+     * @return  {@code true} iff this map is empty
+     */
+    boolean isEmpty();
+
+    /**
      * The weight of the compaction map is its heap memory consumption in bytes.
      * @return  Estimated weight of the compaction map
      */

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/PersistedCompactionMap.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/PersistedCompactionMap.java?rev=1700252&r1=1700251&r2=1700252&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/PersistedCompactionMap.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/PersistedCompactionMap.java Mon Aug 31 14:13:31 2015
@@ -66,7 +66,6 @@ public class PersistedCompactionMap impl
 
     private final FileStore store;
 
-    private int recentCount;
     private long recordCount;
     private MapRecord entries;
 
@@ -144,8 +143,7 @@ public class PersistedCompactionMap impl
         }
         entry.put(encode(before.getOffset()), after);
 
-        if (++recentCount > COMPRESS_INTERVAL) {
-            recentCount = 0;
+        if (recent.size() > COMPRESS_INTERVAL) {
             compress();
         }
     }
@@ -170,6 +168,11 @@ public class PersistedCompactionMap impl
         return recordCount;
     }
 
+    @Override
+    public boolean isEmpty() {
+        return recent.size() + recordCount == 0;
+    }
+
     private void compress(@Nonnull Set<UUID> removed) {
         if (recent.isEmpty() && removed.isEmpty()) {
             return;

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/package-info.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/package-info.java?rev=1700252&r1=1700251&r2=1700252&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/package-info.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/package-info.java Mon Aug 31 14:13:31 2015
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@Version("4.1.0")
+@Version("5.0.0")
 @Export(optional = "provide:=true")
 package org.apache.jackrabbit.oak.plugins.segment;
 

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionMapTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionMapTest.java?rev=1700252&r1=1700251&r2=1700252&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionMapTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionMapTest.java Mon Aug 31 14:13:31 2015
@@ -173,7 +173,10 @@ public class CompactionMapTest {
                 removedUUIDs.add(key.asUUID());
             }
             compactionMap.remove(removedUUIDs);
-            assertEquals(--expectedDepth, compactionMap.getDepth());
+            expectedDepth--;
+            // Effect of removed generation is only seen after subsequent cons. See OAK-3317
+            CompactionMap consed = compactionMap.cons(compactionMap1);
+            assertEquals(expectedDepth + 1, consed.getDepth());
             expectedSize -= removedUUIDs.size();
             assertEquals(expectedSize, sum(compactionMap.getSegmentCounts()));
         }