import com.google.common.base.MoreObjects;
import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
import java.nio.file.Path;
import org.eclipse.jdt.annotation.NonNull;
private final @NonNull JournalSegmentDescriptor descriptor;
private final @NonNull Path path;
- JournalSegmentFile(final Path path, final JournalSegmentDescriptor descriptor) {
+ private JournalSegmentFile(final Path path, final JournalSegmentDescriptor descriptor) {
this.path = requireNonNull(path);
this.descriptor = requireNonNull(descriptor);
}
+ static @NonNull JournalSegmentFile createNew(final String name, final File directory,
+ final JournalSegmentDescriptor descriptor) throws IOException {
+ final var file = createSegmentFile(name, directory, descriptor.id());
+ try (var raf = new RandomAccessFile(file, "rw")) {
+ raf.setLength(descriptor.maxSegmentSize());
+ raf.write(descriptor.toArray());
+ }
+ return new JournalSegmentFile(file.toPath(), descriptor);
+ }
+
+ static @NonNull JournalSegmentFile openExisting(final Path path) throws IOException {
+ // read the descriptor
+ final var descriptor = JournalSegmentDescriptor.readFrom(path);
+ return new JournalSegmentFile(path, descriptor);
+ }
+
/**
* Returns the segment file.
*
import java.io.File;
import java.io.IOException;
-import java.io.RandomAccessFile;
import java.util.Collection;
import java.util.Map;
import java.util.TreeMap;
* Creates a new segment.
*/
JournalSegment createSegment(long id, long index) {
- final var segmentFile = JournalSegmentFile.createSegmentFile(name, directory, id);
- final var descriptor = JournalSegmentDescriptor.builder()
- .withId(id)
- .withIndex(index)
- .withMaxSegmentSize(maxSegmentSize)
- .withMaxEntries(maxEntriesPerSegment)
- .withUpdated(System.currentTimeMillis())
- .build();
-
- try (var raf = new RandomAccessFile(segmentFile, "rw")) {
- raf.setLength(maxSegmentSize);
- raf.write(descriptor.toArray());
+ final JournalSegmentFile file;
+ try {
+ file = JournalSegmentFile.createNew(name, directory, JournalSegmentDescriptor.builder()
+ .withId(id)
+ .withIndex(index)
+ .withMaxSegmentSize(maxSegmentSize)
+ .withMaxEntries(maxEntriesPerSegment)
+ .withUpdated(System.currentTimeMillis())
+ .build());
} catch (IOException e) {
throw new StorageException(e);
}
- final var segment = newSegment(new JournalSegmentFile(segmentFile.toPath(), descriptor));
+ final var segment = new JournalSegment(file, storageLevel, maxEntrySize, indexDensity);
LOG.debug("Created segment: {}", segment);
return segment;
}
- /**
- * Creates a new segment instance.
- *
- * @param segmentFile The segment file.
- * @return The segment instance.
- */
- protected JournalSegment newSegment(JournalSegmentFile segmentFile) {
- return new JournalSegment(segmentFile, storageLevel, maxEntrySize, indexDensity);
- }
-
/**
* Loads all segments from disk.
*
// If the file looks like a segment file, attempt to load the segment.
if (JournalSegmentFile.isSegmentFile(name, file)) {
- final var path = file.toPath();
- // read the descriptor
- final JournalSegmentDescriptor descriptor;
+ final JournalSegmentFile segmentFile;
try {
- descriptor = JournalSegmentDescriptor.readFrom(path);
+ segmentFile = JournalSegmentFile.openExisting(file.toPath());
} catch (IOException e) {
throw new StorageException(e);
}
// Load the segment.
- final var segment = newSegment(new JournalSegmentFile(path, descriptor));
- LOG.debug("Loaded disk segment: {} ({})", descriptor.id(), path);
+ LOG.debug("Loaded disk segment: {} ({})", segmentFile.descriptor().id(), segmentFile.path());
// Add the segment to the segments list.
+ final var segment = new JournalSegment(segmentFile, storageLevel, maxEntrySize, indexDensity);
segments.put(segment.firstIndex(), segment);
}
}