Rework JournalSegment writer access 90/110590/4
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 11 Mar 2024 10:45:51 +0000 (11:45 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 11 Mar 2024 12:51:31 +0000 (13:51 +0100)
The only user of JournalSegment.writer() is SegmentedJournalWriter,
which is using acquire/release to guard access to the writer.

Rework these methods so that acquire/release are internal and exposed
functionality is acquireWriter() and releaseWriter().

JIRA: CONTROLLER-2098
Change-Id: I345cec145fd82ee59c525d183584d69a9e599bf9
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
atomix-storage/src/main/java/io/atomix/storage/journal/JournalSegment.java
atomix-storage/src/main/java/io/atomix/storage/journal/SegmentedJournalWriter.java

index f5e1b83bbf3473a12a9a32d6422bb7c6da6ffcac..992c56ddfced1cfcbfd13af262d0b9151bde11ee 100644 (file)
@@ -156,7 +156,7 @@ final class JournalSegment<E> implements AutoCloseable {
   /**
    * Acquires a reference to the log segment.
    */
-  void acquire() {
+  private void acquire() {
     if (references.getAndIncrement() == 0 && storageLevel == StorageLevel.MAPPED) {
       writer.map();
     }
@@ -165,7 +165,7 @@ final class JournalSegment<E> implements AutoCloseable {
   /**
    * Releases a reference to the log segment.
    */
-  void release() {
+  private void release() {
     if (references.decrementAndGet() == 0) {
       if (storageLevel == StorageLevel.MAPPED) {
         writer.unmap();
@@ -177,15 +177,24 @@ final class JournalSegment<E> implements AutoCloseable {
   }
 
   /**
-   * Returns the segment writer.
+   * Acquires a reference to the segment writer.
    *
    * @return The segment writer.
    */
-  public MappableJournalSegmentWriter<E> writer() {
+  MappableJournalSegmentWriter<E> acquireWriter() {
     checkOpen();
+    acquire();
+
     return writer;
   }
 
+  /**
+   * Releases the reference to the segment writer.
+   */
+  void releaseWriter() {
+      release();
+  }
+
   /**
    * Creates a new segment reader.
    *
index 64a4c70c7a00937df1ba61511d7618c9e85c2ad0..4d13b2e5cc0b691d6f0fd8e42cb7c293211bd18a 100644 (file)
@@ -28,8 +28,7 @@ public final class SegmentedJournalWriter<E> implements JournalWriter<E> {
   SegmentedJournalWriter(SegmentedJournal<E> journal) {
     this.journal = journal;
     this.currentSegment = journal.getLastSegment();
-    currentSegment.acquire();
-    this.currentWriter = currentSegment.writer();
+    this.currentWriter = currentSegment.acquireWriter();
   }
 
   @Override
@@ -50,10 +49,9 @@ public final class SegmentedJournalWriter<E> implements JournalWriter<E> {
   @Override
   public void reset(long index) {
     if (index > currentSegment.index()) {
-      currentSegment.release();
+      currentSegment.releaseWriter();
       currentSegment = journal.resetSegments(index);
-      currentSegment.acquire();
-      currentWriter = currentSegment.writer();
+      currentWriter = currentSegment.acquireWriter();
     } else {
       truncate(index - 1);
     }
@@ -101,10 +99,9 @@ public final class SegmentedJournalWriter<E> implements JournalWriter<E> {
 
   private void moveToNextSegment() {
     currentWriter.flush();
-    currentSegment.release();
+    currentSegment.releaseWriter();
     currentSegment = journal.getNextSegment();
-    currentSegment.acquire();
-    currentWriter = currentSegment.writer();
+    currentWriter = currentSegment.acquireWriter();
   }
 
   @Override
@@ -115,11 +112,10 @@ public final class SegmentedJournalWriter<E> implements JournalWriter<E> {
 
     // Delete all segments with first indexes greater than the given index.
     while (index < currentSegment.index() && currentSegment != journal.getFirstSegment()) {
-      currentSegment.release();
+      currentSegment.releaseWriter();
       journal.removeSegment(currentSegment);
       currentSegment = journal.getLastSegment();
-      currentSegment.acquire();
-      currentWriter = currentSegment.writer();
+      currentWriter = currentSegment.acquireWriter();
     }
 
     // Truncate the current index.