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,


Reply via email to