use of io.pravega.segmentstore.storage.chunklayer.ChunkStorageException in project pravega by pravega.
the class ExtendedS3ChunkStorage method doConcat.
@Override
public int doConcat(ConcatArgument[] chunks) throws ChunkStorageException {
int totalBytesConcatenated = 0;
String targetPath = getObjectPath(chunks[0].getName());
String uploadId = null;
boolean isCompleted = false;
try {
int partNumber = 1;
SortedSet<MultipartPartETag> partEtags = new TreeSet<>();
uploadId = client.initiateMultipartUpload(config.getBucket(), targetPath);
// check whether the target exists
if (!checkExists(chunks[0].getName())) {
throw new ChunkNotFoundException(chunks[0].getName(), "doConcat - Target segment does not exist");
}
// Copy the parts
for (int i = 0; i < chunks.length; i++) {
if (0 != chunks[i].getLength()) {
val sourceHandle = chunks[i];
S3ObjectMetadata metadataResult = client.getObjectMetadata(config.getBucket(), getObjectPath(sourceHandle.getName()));
// in bytes
long objectSize = metadataResult.getContentLength();
Preconditions.checkState(objectSize >= chunks[i].getLength());
CopyPartRequest copyRequest = new CopyPartRequest(config.getBucket(), getObjectPath(sourceHandle.getName()), config.getBucket(), targetPath, uploadId, partNumber++).withSourceRange(Range.fromOffsetLength(0, chunks[i].getLength()));
CopyPartResult copyResult = client.copyPart(copyRequest);
partEtags.add(new MultipartPartETag(copyResult.getPartNumber(), copyResult.getETag()));
totalBytesConcatenated += chunks[i].getLength();
}
}
// Close the upload
client.completeMultipartUpload(new CompleteMultipartUploadRequest(config.getBucket(), targetPath, uploadId).withParts(partEtags));
isCompleted = true;
} catch (RuntimeException e) {
// Error message is REC_CATCH_EXCEPTION: Exception is caught when Exception is not thrown
throw convertException(chunks[0].getName(), "doConcat", e);
} catch (Exception e) {
throw convertException(chunks[0].getName(), "doConcat", e);
} finally {
if (!isCompleted && null != uploadId) {
client.abortMultipartUpload(new AbortMultipartUploadRequest(config.getBucket(), targetPath, uploadId));
}
}
return totalBytesConcatenated;
}
use of io.pravega.segmentstore.storage.chunklayer.ChunkStorageException in project pravega by pravega.
the class InMemoryChunkStorage method doCreateWithContent.
@Override
protected ChunkHandle doCreateWithContent(String chunkName, int length, InputStream data) throws ChunkStorageException {
Preconditions.checkNotNull(chunkName);
if (null != chunks.putIfAbsent(chunkName, new InMemoryChunk(chunkName))) {
throw new ChunkAlreadyExistsException(chunkName, "InMemoryChunkStorage::doCreate");
}
ChunkHandle handle = new ChunkHandle(chunkName, false);
int bytesWritten = doWriteInternal(handle, 0, length, data);
if (bytesWritten < length) {
doDelete(ChunkHandle.writeHandle(chunkName));
throw new ChunkStorageException(chunkName, "doCreateWithContent - invalid length returned");
}
return handle;
}
use of io.pravega.segmentstore.storage.chunklayer.ChunkStorageException in project pravega by pravega.
the class InMemoryChunkStorage method doWriteInternal.
private int doWriteInternal(ChunkHandle handle, long offset, int length, InputStream data) throws ChunkStorageException {
InMemoryChunk chunk = getInMemoryChunk(handle);
long oldLength = chunk.getLength();
if (chunk.isReadOnly) {
throw new ChunkStorageException(handle.getChunkName(), "chunk is readonly");
}
if (offset != chunk.getLength()) {
throw new InvalidOffsetException(handle.getChunkName(), chunk.getLength(), offset, "doWrite");
}
if (length == 0) {
return 0;
}
ByteArrayOutputStream out = new ByteArrayOutputStream(length);
byte[] bytes = new byte[length];
int totalBytesRead = 0;
int bytesRead = 0;
try {
while ((bytesRead = data.read(bytes)) != -1) {
out.write(bytes, 0, bytesRead);
totalBytesRead += bytesRead;
}
} catch (IOException e) {
throw new ChunkStorageException(handle.getChunkName(), "Error while reading", e);
}
Preconditions.checkState(length == totalBytesRead);
byte[] writtenBytes = out.toByteArray();
Preconditions.checkState(writtenBytes.length == totalBytesRead);
chunk.append(writtenBytes);
Preconditions.checkState(oldLength + totalBytesRead == chunk.getLength());
return totalBytesRead;
}
Aggregations