Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/compaction/CompactionStrategy.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/compaction/CompactionStrategy.java (date 1438013193000) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/compaction/CompactionStrategy.java (revision ) @@ -146,7 +146,7 @@ case CLEAN_NONE: return false; case CLEAN_OLD: - return compactionStart - id.getCreationTime() > olderThan; + return !(id.isCMSegmentId()) && compactionStart - id.getCreationTime() > olderThan; } return false; } Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java (date 1438013193000) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java (revision ) @@ -715,7 +715,7 @@ long start = System.currentTimeMillis(); SegmentWriter writer = new SegmentWriter(this, tracker, getVersion()); SegmentWriter mapWriter = compactionStrategy.getPersistCompactionMap() - ? new SegmentWriter(this, tracker, getVersion()) + ? new SegmentWriter(this, tracker, getVersion(), true) : null; final Compactor compactor = new Compactor(writer, mapWriter, compactionStrategy.cloneBinaries()); SegmentNodeState before = getHead(); Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentId.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentId.java (date 1438013193000) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentId.java (revision ) @@ -55,7 +55,7 @@ * @return {@code true} for a data segment, {@code false} otherwise */ public static boolean isDataSegmentId(long lsb) { - return (lsb >>> 60) == 0xAL; + return (lsb >>> 60) == 0xAL || (lsb >>> 60) == 0xCL; // michid refactor } private final SegmentTracker tracker; @@ -103,9 +103,13 @@ * @return {@code true} for a bulk segment, {@code false} otherwise */ public boolean isBulkSegmentId() { - return (lsb >>> 60) == 0xBL; + return (lsb >>> 60) == 0xBL; // michid refactor } + public boolean isCMSegmentId() { + return (lsb >>> 60) == 0xCL; // michid refactor + } + public boolean equals(long msb, long lsb) { return this.msb == msb && this.lsb == lsb; } @@ -164,13 +168,6 @@ public long getCreationTime() { return creationTime; - } - - /** - * Pins this segment so it won't be cleaned by the {@code CLEAN_OLD} strategy. - */ - void pin() { - creationTime = Long.MAX_VALUE; } /** Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java (date 1438013193000) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java (revision ) @@ -227,6 +227,22 @@ this.version = SegmentVersion.fromByte(buffer[3]); } + Segment(SegmentTracker tracker, byte[] buffer, boolean cm) { + this.tracker = checkNotNull(tracker); + this.id = tracker.newCMSegmentId(); + if (tracker.getStringCache() == null) { + strings = newConcurrentMap(); + stringCache = null; + } else { + strings = null; + stringCache = tracker.getStringCache(); + } + this.data = ByteBuffer.wrap(checkNotNull(buffer)); + this.refids = new SegmentId[SEGMENT_REFERENCE_LIMIT + 1]; + this.refids[0] = id; + this.version = SegmentVersion.fromByte(buffer[3]); + } + void access() { accessed++; } Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java (date 1438013193000) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java (revision ) @@ -63,6 +63,8 @@ private static final long DATA = 0xAL << 60; + private static final long CM = 0xCL << 60; + private static final long BULK = 0xBL << 60; private static final int MB = 1024 * 1024; @@ -287,6 +289,10 @@ SegmentId newDataSegmentId() { return newSegmentId(DATA); + } + + SegmentId newCMSegmentId() { + return newSegmentId(CM); } SegmentId newBulkSegmentId() { Index: oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionAndCleanupTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionAndCleanupTest.java (date 1438013193000) +++ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionAndCleanupTest.java (revision ) @@ -61,7 +61,6 @@ import org.apache.jackrabbit.oak.spi.state.NodeStore; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -190,7 +189,6 @@ } } - @Ignore("OAK-3139") // FIXME OAK-3139 @Test public void noCleanupOnCompactionMap() throws Exception { // 2MB data, 5MB blob Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java (date 1438013193000) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java (revision ) @@ -162,15 +162,28 @@ */ private final SegmentVersion version; + private final boolean cmWriter; + public SegmentWriter(SegmentStore store, SegmentTracker tracker, SegmentVersion version) { this.store = store; this.tracker = tracker; this.version = version; + this.cmWriter = false; this.buffer = createNewBuffer(version); - this.segment = new Segment(tracker, buffer); + this.segment = new Segment(tracker, buffer, false); segment.getSegmentId().setSegment(segment); } + public SegmentWriter(SegmentStore store, SegmentTracker tracker, SegmentVersion version, boolean cmWriter) { + this.store = store; + this.tracker = tracker; + this.version = version; + this.cmWriter = true; + this.buffer = createNewBuffer(version); + this.segment = new Segment(tracker, buffer, cmWriter); + segment.getSegmentId().setSegment(segment); + } + /** * Adds a segment header to the buffer and writes a segment to the segment * store. This is done automatically (called from prepare) when there is not @@ -243,7 +256,7 @@ blobrefs.clear(); length = 0; position = buffer.length; - segment = new Segment(tracker, buffer); + segment = new Segment(tracker, buffer, cmWriter); segment.getSegmentId().setSegment(segment); } } Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/PersistedCompactionMap.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/PersistedCompactionMap.java (date 1438013193000) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/PersistedCompactionMap.java (revision ) @@ -207,7 +207,6 @@ RecordId previousBaseId = entries == null ? null : entries.getRecordId(); entries = writer.writeMap(entries, segmentIdMap); - entries.getSegment().getSegmentId().pin(); String mapInfo = PERSISTED_COMPACTION_MAP + '{' + "id=" + entries.getRecordId() + ", baseId=" + previousBaseId + '}';