package com.jivesoftware.os.amza.service.storage.binary;
import com.google.common.collect.Maps;
import com.jivesoftware.os.amza.api.wal.RowIO;
import com.jivesoftware.os.amza.service.filer.ByteBufferFactory;
import com.jivesoftware.os.amza.service.filer.MultiAutoGrowingByteBufferBackedFiler;
import com.jivesoftware.os.amza.service.storage.filer.MemoryBackedWALFiler;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
* @author jonathan.colt
*/
public class MemoryBackedRowIOProvider implements RowIOProvider {
private final long initialBufferSegmentSize;
private final long maxBufferSegmentSize;
private final int defaultUpdatesBetweenLeaps;
private final int defaultMaxLeaps;
private final ByteBufferFactory byteBufferFactory;
private final Map<File, MemoryBackedWALFiler> filers = Maps.newConcurrentMap();
public MemoryBackedRowIOProvider(
long initialBufferSegmentSize,
long maxBufferSegmentSize,
int defaultUpdatesBetweenLeaps,
int defaultMaxLeaps,
ByteBufferFactory byteBufferFactory) {
this.initialBufferSegmentSize = initialBufferSegmentSize;
this.maxBufferSegmentSize = maxBufferSegmentSize;
this.defaultUpdatesBetweenLeaps = defaultUpdatesBetweenLeaps;
this.defaultMaxLeaps = defaultMaxLeaps;
this.byteBufferFactory = byteBufferFactory;
}
private MemoryBackedWALFiler getFiler(File file) {
return filers.computeIfAbsent(file, key1 -> {
try {
return createFiler();
} catch (IOException e) {
throw new RuntimeException(e);
}
});
}
@Override
public RowIO open(File key, String name, boolean createIfAbsent, int updatesBetweenLeaps, int maxLeaps) throws Exception {
File file = new File(key, name);
MemoryBackedWALFiler filer = getFiler(file);
BinaryRowReader rowReader = new BinaryRowReader(filer);
BinaryRowWriter rowWriter = new BinaryRowWriter(filer);
return new BinaryRowIO(key,
name,
rowReader,
rowWriter,
updatesBetweenLeaps > 0 ? updatesBetweenLeaps : defaultUpdatesBetweenLeaps,
maxLeaps > 0 ? maxLeaps : defaultMaxLeaps);
}
@Override
public List<String> listExisting(File key) {
return Collections.emptyList();
}
@Override
public File versionedKey(File baseKey, String latestVersion) throws Exception {
return new File(baseKey, latestVersion);
}
@Override
public File buildKey(File versionedKey, String name) throws Exception {
return new File(versionedKey, name);
}
private MemoryBackedWALFiler createFiler() throws IOException {
return new MemoryBackedWALFiler(new MultiAutoGrowingByteBufferBackedFiler(initialBufferSegmentSize, maxBufferSegmentSize, byteBufferFactory));
}
@Override
public void moveTo(File fromKey, String fromName, File toKey, String toName) throws Exception {
MemoryBackedWALFiler filer = filers.remove(new File(fromKey, fromName));
filers.put(new File(toKey, toName), filer);
}
@Override
public void delete(File key, String name) throws Exception {
filers.remove(new File(key, name));
}
@Override
public boolean ensureKey(File key) {
return true;
}
@Override
public boolean exists(File key, String name) {
return true;
}
@Override
public long sizeInBytes(File key, String name) {
return 0;
}
}