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()));
}