package com.jivesoftware.os.amza.service.storage.binary;
import com.google.common.collect.Lists;
import com.google.common.io.Files;
import com.jivesoftware.os.amza.api.wal.RowIO;
import com.jivesoftware.os.amza.api.IoStats;
import com.jivesoftware.os.amza.service.storage.filer.DiskBackedWALFiler;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.apache.commons.io.FileUtils;
/**
* @author jonathan.colt
*/
public class BinaryRowIOProvider implements RowIOProvider {
private final int defaultUpdatesBetweenLeaps;
private final int defaultMaxLeaps;
private final boolean useMemMap;
public BinaryRowIOProvider(
int defaultUpdatesBetweenLeaps,
int defaultMaxLeaps,
boolean useMemMap) {
this.defaultUpdatesBetweenLeaps = defaultUpdatesBetweenLeaps;
this.defaultMaxLeaps = defaultMaxLeaps;
this.useMemMap = useMemMap;
}
@Override
public RowIO open(File dir, String name, boolean createIfAbsent, int updatesBetweenLeaps, int maxLeaps) throws Exception {
if (!dir.exists() && !dir.mkdirs()) {
throw new IOException("Failed trying to mkdirs for " + dir);
}
File file = new File(dir, name);
if (!createIfAbsent && !file.exists()) {
return null;
}
DiskBackedWALFiler filer = new DiskBackedWALFiler(file.getAbsolutePath(), "rw", useMemMap, 0);
BinaryRowReader rowReader = new BinaryRowReader(filer);
BinaryRowWriter rowWriter = new BinaryRowWriter(filer);
return new BinaryRowIO(dir,
name,
rowReader,
rowWriter,
updatesBetweenLeaps > 0 ? updatesBetweenLeaps : defaultUpdatesBetweenLeaps,
maxLeaps > 0 ? maxLeaps : defaultMaxLeaps);
}
@Override
public List<String> listExisting(File dir) {
File[] existing = dir.listFiles();
return existing != null ? Lists.transform(Arrays.asList(existing), File::getName) : Collections.<String>emptyList();
}
@Override
public File versionedKey(File baseKey, String latestVersion) throws Exception {
File directory = new File(baseKey, latestVersion);
FileUtils.forceMkdir(directory);
return directory;
}
@Override
public boolean ensureKey(File key) {
return key.exists() || key.mkdirs();
}
@Override
public boolean exists(File dir, String name) {
return new File(dir, name).exists();
}
@Override
public long sizeInBytes(File dir, String name) {
return new File(dir, name).length();
}
@Override
public File buildKey(File versionedKey, String name) {
return new File(versionedKey, name);
}
@Override
public void moveTo(File fromDir, String fromName, File toDir, String toName) throws Exception {
File from = new File(fromDir, fromName);
File to = new File(toDir, toName);
Files.move(from, to);
}
@Override
public void delete(File dir, String name) throws Exception {
FileUtils.deleteQuietly(new File(dir, name));
}
}