package com.netflix.aegisthus.input.splits;
import com.netflix.aegisthus.io.sstable.compression.CompressionInputStream;
import com.netflix.aegisthus.io.sstable.compression.CompressionMetadata;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.WritableUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Nonnull;
import java.io.BufferedInputStream;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.io.InputStream;
public class AegCompressedSplit extends AegSplit {
private static final Logger LOG = LoggerFactory.getLogger(AegCompressedSplit.class);
private Path compressionMetadataPath;
private long compressedLength;
public static AegCompressedSplit createAegCompressedSplit(@Nonnull Path path, long start, long length,
@Nonnull String[] hosts, @Nonnull Path compressionMetadataPath, @Nonnull Configuration conf)
throws IOException {
AegCompressedSplit split = new AegCompressedSplit();
split.path = path;
split.start = start;
split.compressedLength = length;
split.hosts = hosts;
split.compressionMetadataPath = compressionMetadataPath;
CompressionMetadata compressionMetadata = getCompressionMetadata(conf, compressionMetadataPath, length);
split.end = compressionMetadata.getDataLength();
LOG.info("start: {}, end: {}", start, split.end);
return split;
}
private static CompressionMetadata getCompressionMetadata(Configuration conf, Path compressionMetadataPath,
long compressedLength) throws IOException {
FileSystem fs = compressionMetadataPath.getFileSystem(conf);
FSDataInputStream cmIn = fs.open(compressionMetadataPath);
BufferedInputStream inputStream = new BufferedInputStream(cmIn);
CompressionMetadata compressionMetadata = new CompressionMetadata(inputStream, compressedLength);
return compressionMetadata;
}
@Nonnull
@Override
public InputStream getInput(@Nonnull Configuration conf) throws IOException {
CompressionMetadata compressionMetadata = getCompressionMetadata(conf, compressionMetadataPath,
compressedLength);
return new CompressionInputStream(super.getInput(conf), compressionMetadata);
}
@Override
public void readFields(@Nonnull DataInput in) throws IOException {
super.readFields(in);
compressionMetadataPath = new Path(WritableUtils.readString(in));
compressedLength = WritableUtils.readVLong(in);
}
@Override
public void write(@Nonnull DataOutput out) throws IOException {
super.write(out);
WritableUtils.writeString(out, compressionMetadataPath.toUri().toString());
WritableUtils.writeVLong(out, compressedLength);
}
}