package org.infinispan.persistence.sifs; import java.io.IOException; import org.infinispan.commons.io.ByteBuffer; import org.infinispan.marshall.core.MarshalledEntry; /** * Request to persist entry in log file or request executed by the log appender thread. * * @author Radim Vansa <rvansa@redhat.com> */ class LogRequest { enum Type { STORE, DELETE, CLEAR_ALL, STOP, PAUSE } private final Type type; private final Object key; private final long expirationTime; private final ByteBuffer serializedKey; private final ByteBuffer serializedMetadata; private final ByteBuffer serializedValue; private boolean canContinue = false; private volatile IndexRequest indexRequest; private LogRequest(Type type, Object key, long expirationTime, ByteBuffer serializedKey, ByteBuffer serializedMetadata, ByteBuffer serializedValue) { this.key = key; this.expirationTime = expirationTime; this.serializedKey = serializedKey; this.serializedMetadata = serializedMetadata; this.serializedValue = serializedValue; this.type = type; } private LogRequest(Type type) { this(type, null, 0, null, null, null); } public static LogRequest storeRequest(MarshalledEntry entry) throws IOException, InterruptedException { return new LogRequest(Type.STORE, entry.getKey(), entry.getMetadata() == null ? -1 : entry.getMetadata().expiryTime(), entry.getKeyBytes(), entry.getMetadataBytes(), entry.getValueBytes()); } public static LogRequest deleteRequest(Object key, ByteBuffer serializedKey) throws IOException, InterruptedException { return new LogRequest(Type.DELETE, key, -1, serializedKey, null, null); } public static LogRequest clearRequest() { return new LogRequest(Type.CLEAR_ALL); } public static LogRequest stopRequest() { return new LogRequest(Type.STOP); } public static LogRequest pauseRequest() { return new LogRequest(Type.PAUSE); } public int length() { return EntryHeader.HEADER_SIZE + serializedKey.getLength() + (serializedValue != null ? serializedValue.getLength() : 0) + (serializedMetadata != null ? serializedMetadata.getLength() : 0); } public Object getKey() { return key; } public ByteBuffer getSerializedKey() { return serializedKey; } public ByteBuffer getSerializedMetadata() { return serializedMetadata; } public ByteBuffer getSerializedValue() { return serializedValue; } public long getExpiration() { return expirationTime; } public boolean isClear() { return type == Type.CLEAR_ALL; } public boolean isStop() { return type == Type.STOP; } public boolean isPause() { return type == Type.PAUSE; } public void setIndexRequest(IndexRequest indexRequest) { this.indexRequest = indexRequest; } public IndexRequest getIndexRequest() { return indexRequest; } public synchronized void pause() throws InterruptedException { while (!canContinue) wait(); } public synchronized void resume() { canContinue = true; notify(); } }