com.bigdata.ha.althalog.IHALogReader Maven / Gradle / Ivy
/**
Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016. All rights reserved.
Contact:
SYSTAP, LLC DBA Blazegraph
2501 Calvert ST NW #106
Washington, DC 20008
[email protected]
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.bigdata.ha.althalog;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.security.DigestException;
import java.security.MessageDigest;
import com.bigdata.ha.msg.IHAWriteMessage;
import com.bigdata.io.DirectBufferPool;
import com.bigdata.journal.IHABufferStrategy;
import com.bigdata.journal.IRootBlockView;
import com.bigdata.journal.WORMStrategy;
/**
* Interface for reading on an HA Log.
*
* Readers can be requested of any HALogFile.
*/
public interface IHALogReader {
/**
* The filename extension used for the HALog files.
*/
public static final String HA_LOG_EXT = ".ha-log";
/**
* A {@link FileFilter} that visits all files ending with the
* {@link #HA_LOG_EXT} and the names of all direct child directories. This
* {@link FileFilter} may be used to establish recursive scans of the HALog
* directory.
*/
static public final FileFilter HALOG_FILTER = new FileFilter() {
@Override
public boolean accept(final File f) {
if (f.isDirectory()) {
return true;
}
return f.getName().endsWith(HA_LOG_EXT);
}
};
/**
* Closes the Reader.
*
* @throws IOException
*/
void close() throws IOException;
/**
* Return true
if the root blocks in the log file have the same
* commit counter. Such log files are logically empty regardless of their
* length.
*/
boolean isEmpty();
/**
* The {@link IRootBlockView} for the committed state BEFORE the write set
* contained in the HA log file has been applied.
*/
IRootBlockView getOpeningRootBlock();
/**
* The {@link IRootBlockView} for the committed state AFTER the write set
* contained in the HA log file has been applied.
*/
IRootBlockView getClosingRootBlock() throws IOException;
/**
* Checks whether we have reached the end of the file.
*/
boolean hasMoreBuffers() throws IOException;
/**
* Attempts to read the next {@link IHAWriteMessage} and then the expected
* buffer, that is read into the client buffer. The {@link IHAWriteMessage}
* is returned to the caller.
*
* Note: The caller's buffer will be filled in IFF the data is on the HALog.
* For some {@link IHABufferStrategy} implementations, that data is not
* present in the HALog. The caller's buffer will not be modified and the
* caller is responsible for getting the data from the
* {@link IHABufferStrategy} (e.g., for the {@link WORMStrategy}).
*
* Note: IF the buffer is filled, then the limit will be the #of bytes ready
* to be transmitted and the position will be zero.
*
* @param clientBuffer
* A buffer from the {@link DirectBufferPool#INSTANCE}.
*/
IHAWriteMessage processNextBuffer(final ByteBuffer clientBuffer) throws IOException;
void computeDigest(MessageDigest digest) throws DigestException,
IOException;
}