package org.infinispan.persistence.sifs;
import java.util.concurrent.atomic.AtomicInteger;
import org.infinispan.commons.util.Util;
/**
* Request for some change to be persisted in the Index or operation executed by index updater thread.
*
* @author Radim Vansa <rvansa@redhat.com>
*/
class IndexRequest {
public enum Type {
UPDATE,
MOVED,
DROPPED,
FOUND_OLD,
CLEAR,
DELETE_FILE,
STOP,
GET_SIZE
}
private final Type type;
private final Object key;
// the file and offset are duplicate to those in TemporaryTable because we have to match the CAS requests
private final int file;
private final int offset;
private final int prevFile;
private final int prevOffset;
private final byte[] serializedKey;
private final int size;
private volatile Object result;
private AtomicInteger countDown;
private IndexRequest(Type type, Object key, byte[] serializedKey, int file, int offset, int size, int prevFile, int prevOffset) {
this.type = type;
this.key = key;
this.file = file;
this.offset = offset;
this.prevFile = prevFile;
this.prevOffset = prevOffset;
this.serializedKey = serializedKey;
this.size = size;
}
public static IndexRequest update(Object key, byte[] serializedKey, int file, int offset, int size) {
return new IndexRequest(Type.UPDATE, key, serializedKey, file, offset, size, -1, -1);
}
public static IndexRequest moved(Object key, byte[] serializedKey, int file, int offset, int size, int prevFile, int prevOffset) {
return new IndexRequest(Type.MOVED, key, serializedKey, file, offset, size, prevFile, prevOffset);
}
public static IndexRequest dropped(Object key, byte[] serializedKey, int prevFile, int prevOffset) {
return new IndexRequest(Type.DROPPED, key, serializedKey, -1, -1, -1, prevFile, prevOffset);
}
public static IndexRequest foundOld(Object key, byte[] serializedKey, int prevFile, int prevOffset) {
return new IndexRequest(Type.FOUND_OLD, key, serializedKey, -1, -1, -1, prevFile, prevOffset);
}
public static IndexRequest clearRequest() {
return new IndexRequest(Type.CLEAR, null, null, -1, -1, -1, -1, -1);
}
public static IndexRequest deleteFileRequest(int deletedFile) {
return new IndexRequest(Type.DELETE_FILE, null, null, deletedFile, -1, -1, -1, -1);
}
public static IndexRequest stopRequest() {
return new IndexRequest(Type.STOP, null, null, -1, -1, -1, -1, -1);
}
public static IndexRequest sizeRequest() {
return new IndexRequest(Type.GET_SIZE, null, null, -1, -1, -1, -1, -1);
}
public Type getType() {
return type;
}
public Object getKey() {
return key;
}
public long getPrevFile() {
return prevFile;
}
public int getPrevOffset() {
return prevOffset;
}
public byte[] getSerializedKey() {
return serializedKey;
}
public synchronized void setResult(Object result) {
if (this.result == null) {
this.result = result;
}
notifyAll();
}
public synchronized Object getResult() throws InterruptedException {
while (result == null) {
wait();
}
return result;
}
public void setCountDown(int countDown) {
this.countDown = new AtomicInteger(countDown);
}
public boolean countDown() {
return countDown.decrementAndGet() == 0;
}
public int getFile() {
return file;
}
public int getOffset() {
return offset;
}
public int getSize() {
return size;
}
@Override
public String toString() {
return "IndexRequest{" +
"key=" + key +
", serializedKey=" + Util.printArray(serializedKey) +
", file=" + file +
", offset=" + offset +
", prevFile=" + prevFile +
", prevOffset=" + prevOffset +
", size=" + size +
", type=" + type +
'}';
}
}