Author: mduerig
Date: Wed Apr 20 10:06:06 2016
New Revision: 1740105
URL: http://svn.apache.org/viewvc?rev=1740105&view=rev
Log:
OAK-3348: Cross gc sessions might introduce references to pre-compacted segments
FIXMEs related to OAK-3348
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackup.java
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/RecordCache.java
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBufferWriter.java
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentParser.java
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentVersion.java
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/WriteOperationHandler.java
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/compaction/CompactionStrategy.java
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarReader.java
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarWriter.java
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackupTest.java
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionAndCleanupIT.java
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraphTest.java
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreServiceTest.java
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackup.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackup.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackup.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackup.java
Wed Apr 20 10:06:06 2016
@@ -53,6 +53,7 @@ public class FileStoreBackup {
FileStore backup = builder.build();
try {
SegmentNodeState state = backup.getHead();
+ // FIXME OAK-3348 Use dedicated implementation instead of
compactor.
// This is allows us to decouple and fix problems for online
compaction independent
// of backup / restore.
// Compactor compactor = new Compactor(backup.getTracker());
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java
Wed Apr 20 10:06:06 2016
@@ -50,6 +50,7 @@ public class FileStoreRestore {
FileStore store = FileStore.builder(destination).build();
SegmentNodeState current = store.getHead();
try {
+ // FIXME OAK-3348 Use dedicated implementation instead of
compactor.
// This is allows us to decouple and fix problems for online
compaction independent
// of backup / restore.
// compactor.setDeepCheckLargeBinaries(true);
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/RecordCache.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/RecordCache.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/RecordCache.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/RecordCache.java
Wed Apr 20 10:06:06 2016
@@ -36,10 +36,13 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
- * FIXME OAK-3348 XXX document
+ * FIXME OAK-3348 document
*/
+// FIXME OAK-3348 implement monitoring for this cache
+// FIXME OAK-3348 unit test
public class RecordCache<T> {
private static final Logger LOG =
LoggerFactory.getLogger(RecordCache.class);
+ // FIXME OAK-3348 make this a feature flag
private static final int RETENTION_THRESHOLD = 1;
private final ConcurrentMap<Integer, Cache<T>> generations =
newConcurrentMap();
@@ -68,6 +71,9 @@ public class RecordCache<T> {
}
/**
+ * FIXME OAK-3348 The getCache might get called multiple times per
generation
+ * as per the comment below. Either come up with a fix for this race
+ * or clearly state that API consumers need to be prepared for this.
*/
protected Cache<T> getCache(int generation) {
return Cache.disabled();
@@ -163,6 +169,10 @@ public class RecordCache<T> {
@Override
public synchronized void put(T key, RecordId value, int cost) {
+ // FIXME OAK-3348 Validate and optimise the eviction strategy.
+ // Nodes with many children should probably get a boost to
+ // protecting them from preemptive eviction. Also it might be
+ // necessary to implement pinning (e.g. for checkpoints).
while (size >= capacity) {
int d = maps.size() - 1;
int removed = maps.remove(d).size();
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java
Wed Apr 20 10:06:06 2016
@@ -173,6 +173,8 @@ public class SegmentBlob extends Record
return true;
}
+ // FIXME OAK-3348 check / test deduplication of large SegmentBlob
instances
+ // FIXME OAK-3348 Can we do something similar for long strings?
if (object instanceof SegmentBlob) {
SegmentBlob that = (SegmentBlob) object;
if (this.length() != that.length()) {
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBufferWriter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBufferWriter.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBufferWriter.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBufferWriter.java
Wed Apr 20 10:06:06 2016
@@ -161,6 +161,7 @@ public class SegmentBufferWriter impleme
buffer[4] = 0; // reserved
buffer[5] = 0; // refcount
+ // FIXME OAK-3348 document change in format
buffer[GC_GEN_OFFSET] = (byte) (generation >> 24);
buffer[GC_GEN_OFFSET + 1] = (byte) (generation >> 16);
buffer[GC_GEN_OFFSET + 2] = (byte) (generation >> 8);
@@ -170,6 +171,9 @@ public class SegmentBufferWriter impleme
roots.clear();
blobrefs.clear();
+ // FIXME OAK-3348 Don't write the GC generation into the segment info
+ // as it is now available from the segment header. Update the tooling
+ // accordingly (SegmentGraph).
String metaInfo = "{\"wid\":\"" + wid + '"' +
",\"sno\":" + tracker.getNextSegmentNo() +
",\"gc\":" + generation +
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java
Wed Apr 20 10:06:06 2016
@@ -193,6 +193,8 @@ public class SegmentNodeStore implements
* of {@code c.call()} otherwise.
* @throws Exception
*/
+ // FIXME OAK-3348 Remove and use an exclusive locking mechanism of the
FileStore
+ // instead. See FileStore.forceCompact
boolean locked(Callable<Boolean> c) throws Exception {
if (commitSemaphore.tryAcquire()) {
try {
@@ -213,6 +215,8 @@ public class SegmentNodeStore implements
* of {@code c.call()} otherwise.
* @throws Exception
*/
+ // FIXME OAK-3348 Remove and use an exclusive locking mechanism of the
FileStore
+ // instead. See FileStore.forceCompact
boolean locked(Callable<Boolean> c, long timeout, TimeUnit unit) throws
Exception {
if (commitSemaphore.tryAcquire(timeout, unit)) {
try {
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentParser.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentParser.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentParser.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentParser.java
Wed Apr 20 10:06:06 2016
@@ -410,6 +410,7 @@ public class SegmentParser {
Segment segment = nodeId.getSegment();
int offset = nodeId.getOffset();
+ // FIXME OAK-3348 Call onString for the node id, which was introduced
here
//segment.readRecordId(offset);
offset += RECORD_ID_BYTES;
RecordId templateId = segment.readRecordId(offset);
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
Wed Apr 20 10:06:06 2016
@@ -246,6 +246,7 @@ public class SegmentTracker {
segmentCache.put(id, segment, segment.size());
}
+ // FIXME OAK-3348 Improve retrieving current GC generation.
// See also the comments in FileStore regarding initialisation and
// cyclic dependencies.
public int getGcGen() {
@@ -330,6 +331,8 @@ public class SegmentTracker {
return getSegmentId(msb, lsb);
}
+ // FIXME OAK-3348 with clean brutal we need to remove those ids that have
been cleaned
+ // i.e. those whose segment was from an old generation
public synchronized void clearSegmentIdTables(CompactionStrategy strategy)
{
for (SegmentIdTable table : tables) {
table.clearSegmentIdTables(strategy);
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentVersion.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentVersion.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentVersion.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentVersion.java
Wed Apr 20 10:06:06 2016
@@ -42,6 +42,7 @@ public enum SegmentVersion {
V_11((byte) 11);
+ // FIXME OAK-3348 upgrade to version 12
/**
* Latest segment version
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
Wed Apr 20 10:06:06 2016
@@ -82,6 +82,7 @@ import org.slf4j.LoggerFactory;
* Converts nodes, properties, and values to records, which are written to
segments.
* FIXME OAK-3348 doc thread safety properties
*/
+// FIXME OAK-3348 Improve the way how SegmentWriter instances are created.
public class SegmentWriter {
private static final Logger LOG =
LoggerFactory.getLogger(SegmentWriter.class);
@@ -123,6 +124,10 @@ public class SegmentWriter {
private final RecordCache<String> nodeCache;
+ // FIXME OAK-3348 Do we need a deduplication cache also for binaries?
+ // Probably/preferably not as long binaries are already de-duplicated
+ // by rewriting its list of block ids and because we should recommend
+ // using a data store for big binaries.
private final SegmentStore store;
@@ -144,14 +149,17 @@ public class SegmentWriter {
/**
* @param store store to write to
* @param version segment version to write
+ * FIXME OAK-3348 document
*/
public SegmentWriter(SegmentStore store, SegmentVersion version,
WriteOperationHandler writeOperationHandler) {
this(store, version, writeOperationHandler, new RecordCache<String>());
}
+ // FIXME OAK-3348 There should be a cleaner way for adding the cached
nodes from the compactor
public void addCachedNodes(int generation, Cache<String> cache) {
nodeCache.put(cache, generation);
+ // FIXME OAK-3348 find a better way to evict the cache from within the
cache itself
stringCache.clearUpTo(generation - 1);
templateCache.clearUpTo(generation - 1);
nodeCache.clearUpTo(generation - 1);
@@ -254,6 +262,10 @@ public class SegmentWriter {
}));
}
+ public void dropCache() {
+ // FIXME OAK-3348 remove
+ }
+
// FIXME OAK-3348 document: not thread safe
private abstract class SegmentWriteOperation implements WriteOperation {
private SegmentBufferWriter writer;
@@ -883,6 +895,7 @@ public class SegmentWriter {
RecordId nodeId = null;
if (state instanceof SegmentNodeState) {
+ // FIXME OAK-3348 offline compaction could remove those ids
byte[] id = ((Record) state).getRecordId().toArray();
nodeId = writeBlock(id, 0, id.length);
}
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/WriteOperationHandler.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/WriteOperationHandler.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/WriteOperationHandler.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/WriteOperationHandler.java
Wed Apr 20 10:06:06 2016
@@ -22,6 +22,7 @@ package org.apache.jackrabbit.oak.plugin
import java.io.IOException;
/**
+ * FIXME OAK-3348 document
*/
interface WriteOperationHandler {
interface WriteOperation {
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/compaction/CompactionStrategy.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/compaction/CompactionStrategy.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/compaction/CompactionStrategy.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/compaction/CompactionStrategy.java
Wed Apr 20 10:06:06 2016
@@ -28,6 +28,7 @@ import org.apache.jackrabbit.oak.plugins
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+// FIXME OAK-3348 Refactor this into a proper AST. Identify and remove
"legacy" parts
public class CompactionStrategy {
private static final Logger LOG =
LoggerFactory.getLogger(CompactionStrategy.class);
@@ -114,6 +115,7 @@ public class CompactionStrategy {
private boolean forceAfterFail = FORCE_AFTER_FAIL_DEFAULT;
+ // FIXME OAK-3348 Make the lock wait time configurable
private int lockWaitTime = 60;
private long compactionStart = currentTimeMillis();
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
Wed Apr 20 10:06:06 2016
@@ -391,6 +391,13 @@ public class FileStore implements Segmen
checkNotNull(builder.directory).mkdirs();
}
+ // FIXME OAK-3348 Improve the setup of FileStore and SegmentTracker.
+ // SegmentTracker and FileStore have a cyclic dependency, which we
should
+ // try to break. Here we pass along a not fully initialised instances
of the
+ // FileStore to the SegmentTracker, which in turn is in later invoked
to write
+ // the initial node state. Notably before this instance is fully
initialised!
+ // Once consequence of this is that we cannot reliably determine the
current
+ // GC generation while writing the initial head state. See further
below.
if (builder.cacheSize < 0) {
this.tracker = new SegmentTracker(this, 0, version);
} else if (builder.cacheSize > 0) {
@@ -542,6 +549,8 @@ public class FileStore implements Segmen
log.debug("TarMK readers {}", this.readers);
}
+ // FIXME OAK-3348 hack: We cannot determine the current GC generation
before
+ // the FileStore is fully initialised so just return 0 for now.
public int getGcGen() {
if (head == null) {
return 0; // not fully initialised
@@ -558,7 +567,7 @@ public class FileStore implements Segmen
Runtime runtime = Runtime.getRuntime();
long avail = runtime.totalMemory() - runtime.freeMemory();
- long delta = 0;
+ long delta = 0; // FIXME OAK-3348 what value should we use for delta?
long needed = delta * compactionStrategy.getMemoryThreshold();
if (needed >= avail) {
gcMonitor.skipped(
@@ -870,10 +879,11 @@ public class FileStore implements Segmen
// Do actual cleanup outside of the lock to prevent blocking
// concurrent writers for a long time
- int generation = getGcGen() - 1;
+ int generation = getGcGen() - 1; // FIXME OAK-3348 make the
generation threshold configurable
Set<UUID> reclaim = newHashSet();
for (TarReader reader : cleaned.keySet()) {
reader.mark(bulkRefs, reclaim, generation);
+ // FIXME OAK-3348 log at debug level
log.info("Size of bulk references/reclaim set {}/{}",
bulkRefs.size(), reclaim.size());
if (shutdown) {
gcMonitor.info("TarMK GC #{}: cleanup interrupted", gcCount);
@@ -1002,8 +1012,10 @@ public class FileStore implements Segmen
gcMonitor.info("TarMK GC #{}: compaction started, strategy={}",
gcCount, compactionStrategy);
Stopwatch watch = Stopwatch.createStarted();
+ // FIXME OAK-3348 Make the capacity and initial depth of the
deduplication cache configurable
final DeduplicationCache<String> nodeCache = new
DeduplicationCache<String>(1000000, 20);
+ // FIXME OAK-3348 this way of compacting has not progress logging and
cannot be cancelled
int gcGeneration = tracker.getGcGen() + 1;
SegmentWriter writer = new SegmentWriter(this,
tracker.getSegmentVersion(),
new SegmentBufferWriter(this, tracker.getSegmentVersion(), "c",
gcGeneration),
@@ -1046,7 +1058,8 @@ public class FileStore implements Segmen
if (success) {
tracker.getWriter().addCachedNodes(gcGeneration, nodeCache);
tracker.clearSegmentIdTables(compactionStrategy);
- gcMonitor.compacted(new long[0], new long[0], new long[0]);
+ // FIXME OAK-3348 refactor GCMonitor: there is no more
compaction map stats
+ gcMonitor.compacted(new long[]{}, new long[]{}, new long[]{});
} else {
gcMonitor.info("TarMK GC #{}: compaction gave up compacting
concurrent commits after {} cycles.",
gcCount, cycles - 1);
@@ -1057,6 +1070,7 @@ public class FileStore implements Segmen
"Most likely compaction didn't get exclusive
access to the store.", gcCount);
}
}
+ // FIXME OAK-3348 giving up leaves garbage that will only be
cleaned up 2 generations later!
}
gcMonitor.info("TarMK GC #{}: compaction completed in {} ({} ms),
after {} cycles",
@@ -1122,6 +1136,8 @@ public class FileStore implements Segmen
return new SegmentNodeState(head.get());
}
+ // FIXME OAK-3348 Maybe us a lock implementation that could expedite
important commits
+ // like compaction and checkpoints. See OAK-4015. Needs to be evaluated.
private ReadWriteLock rwLock = new ReentrantReadWriteLock();
@Override
@@ -1148,7 +1164,8 @@ public class FileStore implements Segmen
closeAndLogOnFail(diskSpaceThread);
try {
flush();
- // FIXME OAK-3348 XXX replace with some sort of close call
tracker.getWriter().dropCache();
+ // FIXME OAK-3348 Replace this with a way to "close" the
underlying SegmentBufferWriter(s)
+ // tracker.getWriter().dropCache();
fileStoreLock.writeLock().lock();
try {
closeAndLogOnFail(writer);
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarReader.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarReader.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarReader.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarReader.java
Wed Apr 20 10:06:06 2016
@@ -741,7 +741,7 @@ class TarReader implements Closeable {
UUID id = new UUID(entry.msb(), entry.lsb());
if ((!isDataSegmentId(entry.lsb()) && !bulkRefs.remove(id)) ||
(isDataSegmentId(entry.lsb()) && entry.generation() <
generation)) {
- // non references bulk segment or old data segment
+ // non referenced bulk segment or old data segment
reclaim.add(id);
} else {
if (isDataSegmentId(entry.lsb())) {
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarWriter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarWriter.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarWriter.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarWriter.java
Wed Apr 20 10:06:06 2016
@@ -475,6 +475,7 @@ class TarWriter implements Closeable {
return header;
}
+ // FIXME OAK-3348 this method is not used anymore. Remove unless we decide
// to offer an alternative cleanup strategy based on reachability, in which
// case it will still be needed
/**
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackupTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackupTest.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackupTest.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackupTest.java
Wed Apr 20 10:06:06 2016
@@ -43,6 +43,7 @@ import org.junit.Test;
import org.junit.rules.TemporaryFolder;
@Ignore
+// FIXME OAK-3348 FileStoreBackupTest
public class FileStoreBackupTest {
private File src;
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionAndCleanupIT.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionAndCleanupIT.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionAndCleanupIT.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionAndCleanupIT.java
Wed Apr 20 10:06:06 2016
@@ -88,7 +88,7 @@ public class CompactionAndCleanupIT {
}
@Test
- @Ignore
+ @Ignore // FIXME OAK-3348 fix failing test compactionNoBinaryClone
public void compactionNoBinaryClone() throws Exception {
// 2MB data, 5MB blob
final int blobSize = 5 * 1024 * 1024;
@@ -374,6 +374,7 @@ public class CompactionAndCleanupIT {
nodeStore.merge(preGCBuilder, EmptyHook.INSTANCE,
CommitInfo.EMPTY);
}
+ // FIXME OAK-3348 need to compact twice because of the
generation cleanup threshold
// (currently hard coded to 2);
fileStore.compact();
fileStore.compact();
@@ -495,7 +496,7 @@ public class CompactionAndCleanupIT {
}
@Test
- @Ignore
+ @Ignore // FIXME OAK-3348 fix failing test propertyRetention
public void propertyRetention() throws IOException, CommitFailedException {
FileStore fileStore =
FileStore.builder(getFileStoreFolder()).withMaxFileSize(1).build();
try {
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraphTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraphTest.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraphTest.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraphTest.java
Wed Apr 20 10:06:06 2016
@@ -52,7 +52,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
-@Ignore
+@Ignore // FIXME OAK-3348 fix SegmentGraphTest
public class SegmentGraphTest {
private final Set<UUID> segments = newHashSet(
UUID.fromString("5be0c2ea-b6ba-4f80-acad-657a20f920b6"),
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java
Wed Apr 20 10:06:06 2016
@@ -92,6 +92,7 @@ public class SegmentIdFactoryTest {
/**
* OAK-2049 - error for data segments
*/
+ // FIXME OAK-3348 fix test
// @Test(expected = IllegalStateException.class)
// public void dataAIOOBE() {
// SegmentId id = factory.newDataSegmentId();
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreServiceTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreServiceTest.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreServiceTest.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreServiceTest.java
Wed Apr 20 10:06:06 2016
@@ -38,7 +38,7 @@ import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.osgi.framework.ServiceRegistration;
-@Ignore
+@Ignore // FIXME OAK-3348 fix failing test SegmentNodeStoreServiceTest
public class SegmentNodeStoreServiceTest {
@Rule
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java
Wed Apr 20 10:06:06 2016
@@ -37,7 +37,7 @@ import org.junit.Test;
/**
* Test case for ensuring that segment size remains within bounds.
*/
-@Ignore
+@Ignore // FIXME OAK-3348 fix failing test SegmentSizeTest
public class SegmentSizeTest {
@Test