Author: mduerig
Date: Wed Jun 1 10:59:27 2016
New Revision: 1746424
URL: http://svn.apache.org/viewvc?rev=1746424&view=rev
Log:
OAK-4291: FileStore.flush prone to races leading to corruption
Javadoc clarifying thread safety properties of SegmentWriters
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriters.java
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java?rev=1746424&r1=1746423&r2=1746424&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
Wed Jun 1 10:59:27 2016
@@ -64,6 +64,9 @@ import org.slf4j.LoggerFactory;
* </pre>
* The behaviour of this class is undefined should the pre-allocated buffer be
* overrun be calling any of the write methods.
+ * <p>
+ * Instances of this class are <em>not thread safe</em>. See also the class
comment of
+ * {@link SegmentWriter}.
*/
public class SegmentBufferWriter implements WriteOperationHandler {
private static final Logger LOG =
LoggerFactory.getLogger(SegmentBufferWriter.class);
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java?rev=1746424&r1=1746423&r2=1746424&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java
Wed Jun 1 10:59:27 2016
@@ -38,6 +38,9 @@ import com.google.common.base.Supplier;
/**
* This {@link WriteOperationHandler} uses a pool of {@link
SegmentBufferWriter}s,
* which it passes to its {@link #execute(WriteOperation) execute} method.
+ * <p>
+ * Instances of this class are thread safe. See also the class comment of
+ * {@link SegmentWriter}.
*/
public class SegmentBufferWriterPool implements WriteOperationHandler {
private final Map<Object, SegmentBufferWriter> writers = newHashMap();
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java?rev=1746424&r1=1746423&r2=1746424&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
Wed Jun 1 10:59:27 2016
@@ -77,7 +77,7 @@ import org.slf4j.LoggerFactory;
* A {@code SegmentWriter} converts nodes, properties, values, etc. to records
and
* persists them with the help of a {@link WriteOperationHandler}.
* All public methods of this class are thread safe if and only if the
- * {@code WriteOperationHandler} passed to the constructor is thread safe.
+ * {@link WriteOperationHandler} passed to the constructor is thread safe.
*/
public class SegmentWriter {
private static final Logger LOG =
LoggerFactory.getLogger(SegmentWriter.class);
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriters.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriters.java?rev=1746424&r1=1746423&r2=1746424&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriters.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriters.java
Wed Jun 1 10:59:27 2016
@@ -29,6 +29,10 @@ import org.apache.jackrabbit.oak.segment
public final class SegmentWriters {
private SegmentWriters() {}
+ /**
+ * Create a thread safe {@code SegmentWriter} based on a {@link
SegmentBufferWriterPool pool}
+ * of {@link SegmentBufferWriter} instances.
+ */
@Nonnull
public static SegmentWriter pooledSegmentWriter(@Nonnull FileStore store,
@Nonnull SegmentVersion
version,
@@ -38,6 +42,10 @@ public final class SegmentWriters {
new SegmentBufferWriterPool(store, store.getTracker(),
store.getReader(), version, name, generation));
}
+ /**
+ * Create a thread safe {@code SegmentWriter} based on a {@link
SegmentBufferWriterPool pool}
+ * of {@link SegmentBufferWriter} instances.
+ */
@Nonnull
public static SegmentWriter pooledSegmentWriter(@Nonnull MemoryStore store,
@Nonnull SegmentVersion
version,
@@ -47,6 +55,10 @@ public final class SegmentWriters {
new SegmentBufferWriterPool(store, store.getTracker(),
store.getReader(), version, name, generation));
}
+ /**
+ * Create a thread safe {@code SegmentWriter} based on a {@link
SegmentBufferWriterPool pool}
+ * of {@link SegmentBufferWriter} instances.
+ */
@Nonnull
public static SegmentWriter pooledSegmentWriter(@Nonnull HttpStore store,
@Nonnull SegmentVersion
version,
@@ -56,6 +68,10 @@ public final class SegmentWriters {
new SegmentBufferWriterPool(store, store.getTracker(),
store.getReader(), version, name, generation));
}
+ /**
+ * Create a <em>non</em> thread safe {@code SegmentWriter} based on single
+ * {@link SegmentBufferWriter} instance.
+ */
@Nonnull
public static SegmentWriter segmentWriter(@Nonnull FileStore store,
@Nonnull SegmentVersion version,
@@ -65,6 +81,10 @@ public final class SegmentWriters {
new SegmentBufferWriter(store, store.getTracker(),
store.getReader(), version, name, generation));
}
+ /**
+ * Create a <em>non</em> thread safe {@code SegmentWriter} based on single
+ * {@link SegmentBufferWriter} instance.
+ */
@Nonnull
public static SegmentWriter segmentWriter(@Nonnull MemoryStore store,
@Nonnull SegmentVersion version,
@@ -74,6 +94,10 @@ public final class SegmentWriters {
new SegmentBufferWriter(store, store.getTracker(),
store.getReader(), version, name, generation));
}
+ /**
+ * Create a <em>non</em> thread safe {@code SegmentWriter} based on single
+ * {@link SegmentBufferWriter} instance.
+ */
@Nonnull
public static SegmentWriter segmentWriter(@Nonnull HttpStore store,
@Nonnull SegmentVersion version,