/* * The Alluxio Open Foundation licenses this work under the Apache License, version 2.0 * (the "License"). You may not use this work except in compliance with the License, which is * available at www.apache.org/licenses/LICENSE-2.0 * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied, as more fully set forth in the License. * * See the NOTICE file distributed with this work for information regarding copyright ownership. */ package alluxio.master.journalv0; import alluxio.proto.journal.Journal.JournalEntry; import java.io.IOException; /** * This class manages all the writes to the journal. Journal writes happen in two phases: * * 1. First the checkpoint is written. The checkpoint contains entries reflecting the * state of the master with all of the completed logs applied. * * 2. Afterwards, entries are appended to log. The checkpoint must be written before the logs. * * The latest state can be reconstructed by reading the checkpoint, and applying all the * completed logs and finally the current log. */ public interface JournalWriter { /** * Marks all logs as completed. */ void completeLogs() throws IOException; /** * Returns an output stream for the journal checkpoint. The returned output stream is a singleton * for this writer. * * @param latestSequenceNumber the sequence number of the latest journal entry. This sequence * number will be used to determine the next sequence numbers for the subsequent journal * entries. * @return the output stream for the journal checkpoint */ JournalOutputStream getCheckpointOutputStream(long latestSequenceNumber) throws IOException; /** * Writes an entry to the current log stream. {@link #flush} should be called * afterward to ensure the entry is persisted. * * @param entry the journal entry to write */ void write(JournalEntry entry) throws IOException; /** * Flushes the current log stream. Otherwise this operation is a no-op. */ void flush() throws IOException; /** * @return the next sequence number */ long getNextSequenceNumber(); /** * Closes the journal. */ void close() throws IOException; /** * Recovers the checkpoint in case the master crashed while updating it previously. */ void recover(); /** * Deletes all of the completed logs. */ void deleteCompletedLogs() throws IOException; /** * Marks the current log as completed. If successful, the current log will no longer exist. The * current log must be closed before this call. */ void completeCurrentLog() throws IOException; }