/** Example of copying a blob in chunks. */ // [TARGET copy(CopyRequest)] // [VARIABLE "my_unique_bucket"] // [VARIABLE "my_blob_name"] // [VARIABLE "copy_blob_name"] public Blob copyBlobInChunks(String bucketName, String blobName, String copyBlobName) { // [START copyBlobInChunks] CopyRequest request = CopyRequest.newBuilder() .setSource(BlobId.of(bucketName, blobName)) .setTarget(BlobId.of(bucketName, copyBlobName)) .build(); CopyWriter copyWriter = storage.copy(request); while (!copyWriter.isDone()) { copyWriter.copyChunk(); } Blob blob = copyWriter.getResult(); // [END copyBlobInChunks] return blob; }
@Test public void testSaveAndRestoreWithResult() { EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITH_OBJECT)) .andReturn(RESPONSE_WITH_OBJECT_DONE); EasyMock.replay(storageRpcMock); copyWriter = new CopyWriter(options, RESPONSE_WITH_OBJECT); copyWriter.copyChunk(); assertEquals(result, copyWriter.getResult()); assertTrue(copyWriter.isDone()); assertEquals(42L, copyWriter.getTotalBytesCopied()); assertEquals(42L, copyWriter.getBlobSize()); RestorableState<CopyWriter> rewriterState = copyWriter.capture(); CopyWriter restoredRewriter = rewriterState.restore(); assertEquals(result, restoredRewriter.getResult()); assertTrue(restoredRewriter.isDone()); assertEquals(42L, restoredRewriter.getTotalBytesCopied()); assertEquals(42L, restoredRewriter.getBlobSize()); } }
/** * Returns the updated information for the written blob. Calling this method when {@code isDone()} * is {@code false} will block until all pending chunks are copied. * * <p>This method has the same effect of doing: * * <pre>{@code * while (!copyWriter.isDone()) { * copyWriter.copyChunk(); * } * }</pre> * * @throws StorageException upon failure */ public Blob getResult() { while (!isDone()) { copyChunk(); } return Blob.fromPb(serviceOptions.getService(), rewriteResponse.result); }
@Override public RestorableState<CopyWriter> capture() { return StateImpl.newBuilder( serviceOptions, BlobId.fromPb(rewriteResponse.rewriteRequest.source), rewriteResponse.rewriteRequest.sourceOptions, rewriteResponse.rewriteRequest.overrideInfo, BlobInfo.fromPb(rewriteResponse.rewriteRequest.target), rewriteResponse.rewriteRequest.targetOptions) .setResult(rewriteResponse.result != null ? BlobInfo.fromPb(rewriteResponse.result) : null) .setBlobSize(getBlobSize()) .setIsDone(isDone()) .setMegabytesCopiedPerChunk(rewriteResponse.rewriteRequest.megabytesRewrittenPerCall) .setRewriteToken(rewriteResponse.rewriteToken) .setTotalBytesRewritten(getTotalBytesCopied()) .build(); }
@Test public void testCopyBlobNoContentType() { String sourceBlobName = "test-copy-blob-no-content-type-source"; BlobId source = BlobId.of(BUCKET, sourceBlobName); Blob remoteSourceBlob = storage.create(BlobInfo.newBuilder(source).build(), BLOB_BYTE_CONTENT); assertNotNull(remoteSourceBlob); String targetBlobName = "test-copy-blob-no-content-type-target"; ImmutableMap<String, String> metadata = ImmutableMap.of("k", "v"); BlobInfo target = BlobInfo.newBuilder(BUCKET, targetBlobName).setMetadata(metadata).build(); Storage.CopyRequest req = Storage.CopyRequest.of(source, target); CopyWriter copyWriter = storage.copy(req); assertEquals(BUCKET, copyWriter.getResult().getBucket()); assertEquals(targetBlobName, copyWriter.getResult().getName()); assertNull(copyWriter.getResult().getContentType()); assertEquals(metadata, copyWriter.getResult().getMetadata()); assertTrue(copyWriter.isDone()); assertTrue(remoteSourceBlob.delete()); assertTrue(storage.delete(BUCKET, targetBlobName)); }
BlobInfo.Builder tgtInfoBuilder = BlobInfo.newBuilder(toPath.getBlobId()).setContentType(""); tgtInfoBuilder.setCacheControl(blobInfo.getCacheControl()); tgtInfoBuilder.setContentType(blobInfo.getContentType()); copyWriter.getResult(); break; } catch (StorageException oops) {
@Test public void testCopyMultipleRequests() { CopyRequest request = Storage.CopyRequest.of(BLOB_INFO1.getBlobId(), BLOB_INFO2.getBlobId()); StorageRpc.RewriteRequest rpcRequest = new StorageRpc.RewriteRequest( request.getSource().toPb(), EMPTY_RPC_OPTIONS, false, BLOB_INFO2.toPb(), EMPTY_RPC_OPTIONS, null); StorageRpc.RewriteResponse rpcResponse1 = new StorageRpc.RewriteResponse(rpcRequest, null, 42L, false, "token", 21L); StorageRpc.RewriteResponse rpcResponse2 = new StorageRpc.RewriteResponse(rpcRequest, BLOB_INFO1.toPb(), 42L, true, "token", 42L); EasyMock.expect(storageRpcMock.openRewrite(rpcRequest)).andReturn(rpcResponse1); EasyMock.expect(storageRpcMock.continueRewrite(rpcResponse1)).andReturn(rpcResponse2); EasyMock.replay(storageRpcMock); initializeService(); CopyWriter writer = storage.copy(request); assertEquals(42L, writer.getBlobSize()); assertEquals(21L, writer.getTotalBytesCopied()); assertTrue(!writer.isDone()); assertEquals(expectedBlob1, writer.getResult()); assertTrue(writer.isDone()); assertEquals(42L, writer.getTotalBytesCopied()); assertEquals(42L, writer.getBlobSize()); }
/** Example of copying the blob to a different bucket with a different name. */ // [TARGET copyTo(BlobId, BlobSourceOption...)] // [VARIABLE "my_unique_bucket"] // [VARIABLE "copy_blob_name"] public Blob copyToId(String bucketName, String blobName) { // [START copyToId] CopyWriter copyWriter = blob.copyTo(BlobId.of(bucketName, blobName)); Blob copiedBlob = copyWriter.getResult(); // [END copyToId] return copiedBlob; }
@Test public void testRewriteWithoutObject() { EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITHOUT_OBJECT)) .andReturn(RESPONSE_WITHOUT_OBJECT_DONE); EasyMock.replay(storageRpcMock); copyWriter = new CopyWriter(options, RESPONSE_WITHOUT_OBJECT); assertEquals(result, copyWriter.getResult()); assertTrue(copyWriter.isDone()); assertEquals(42L, copyWriter.getTotalBytesCopied()); assertEquals(42L, copyWriter.getBlobSize()); }
@Override public CopyWriter copy(final CopyRequest copyRequest) { final StorageObject source = copyRequest.getSource().toPb(); final Map<StorageRpc.Option, ?> sourceOptions = optionMap( copyRequest.getSource().getGeneration(), null, copyRequest.getSourceOptions(), true); final StorageObject targetObject = copyRequest.getTarget().toPb(); final Map<StorageRpc.Option, ?> targetOptions = optionMap( copyRequest.getTarget().getGeneration(), copyRequest.getTarget().getMetageneration(), copyRequest.getTargetOptions()); try { EXCEPTION_HANDLER, getOptions().getClock()); return new CopyWriter(getOptions(), rewriteResponse); } catch (RetryHelperException e) { throw StorageException.translateAndThrow(e);
@Override public CopyWriter restore() { RewriteRequest rewriteRequest = new RewriteRequest( source.toPb(), sourceOptions, overrideInfo, target.toPb(), targetOptions, megabytesCopiedPerChunk); RewriteResponse rewriteResponse = new RewriteResponse( rewriteRequest, result != null ? result.toPb() : null, blobSize, isDone, rewriteToken, totalBytesCopied); return new CopyWriter(serviceOptions, rewriteResponse); }
/** Example of copying the blob to a different bucket, keeping the original name. */ // [TARGET copyTo(String, BlobSourceOption...)] // [VARIABLE "my_unique_bucket"] public Blob copyToBucket(String bucketName) { // [START copyToBucket] CopyWriter copyWriter = blob.copyTo(bucketName); Blob copiedBlob = copyWriter.getResult(); // [END copyToBucket] return copiedBlob; }
/** * Copies the next chunk of the blob. An RPC is issued only if copy has not finished yet ({@link * #isDone} returns {@code false}). * * @throws StorageException upon failure */ public void copyChunk() { if (!isDone()) { try { this.rewriteResponse = runWithRetries( new Callable<RewriteResponse>() { @Override public RewriteResponse call() { return storageRpc.continueRewrite(rewriteResponse); } }, serviceOptions.getRetrySettings(), StorageImpl.EXCEPTION_HANDLER, serviceOptions.getClock()); } catch (RetryHelper.RetryHelperException e) { throw StorageException.translateAndThrow(e); } } }
@Test public void testCopyBlob() { String sourceBlobName = "test-copy-blob-source"; BlobId source = BlobId.of(BUCKET, sourceBlobName); ImmutableMap<String, String> metadata = ImmutableMap.of("k", "v"); BlobInfo blob = BlobInfo.newBuilder(source).setContentType(CONTENT_TYPE).setMetadata(metadata).build(); Blob remoteBlob = storage.create(blob, BLOB_BYTE_CONTENT); assertNotNull(remoteBlob); String targetBlobName = "test-copy-blob-target"; Storage.CopyRequest req = Storage.CopyRequest.of(source, BlobId.of(BUCKET, targetBlobName)); CopyWriter copyWriter = storage.copy(req); assertEquals(BUCKET, copyWriter.getResult().getBucket()); assertEquals(targetBlobName, copyWriter.getResult().getName()); assertEquals(CONTENT_TYPE, copyWriter.getResult().getContentType()); assertEquals(metadata, copyWriter.getResult().getMetadata()); assertTrue(copyWriter.isDone()); assertTrue(remoteBlob.delete()); assertTrue(storage.delete(BUCKET, targetBlobName)); }
BlobInfo.Builder tgtInfoBuilder = BlobInfo.newBuilder(toPath.getBlobId()).setContentType(""); tgtInfoBuilder.setCacheControl(blobInfo.getCacheControl()); tgtInfoBuilder.setContentType(blobInfo.getContentType()); copyWriter.getResult(); break; } catch ( StorageException oops ) {
@Test public void testCopy() { CopyRequest request = Storage.CopyRequest.of(BLOB_INFO1.getBlobId(), BLOB_INFO2.getBlobId()); StorageRpc.RewriteRequest rpcRequest = new StorageRpc.RewriteRequest( request.getSource().toPb(), EMPTY_RPC_OPTIONS, false, BLOB_INFO2.toPb(), EMPTY_RPC_OPTIONS, null); StorageRpc.RewriteResponse rpcResponse = new StorageRpc.RewriteResponse(rpcRequest, null, 42L, false, "token", 21L); EasyMock.expect(storageRpcMock.openRewrite(rpcRequest)).andReturn(rpcResponse); EasyMock.replay(storageRpcMock); initializeService(); CopyWriter writer = storage.copy(request); assertEquals(42L, writer.getBlobSize()); assertEquals(21L, writer.getTotalBytesCopied()); assertTrue(!writer.isDone()); }
/** Example of copying a blob. */ // [TARGET copy(CopyRequest)] // [VARIABLE "my_unique_bucket"] // [VARIABLE "my_blob_name"] // [VARIABLE "copy_blob_name"] public Blob copyBlob(String bucketName, String blobName, String copyBlobName) { // [START copyBlob] CopyRequest request = CopyRequest.newBuilder() .setSource(BlobId.of(bucketName, blobName)) .setTarget(BlobId.of(bucketName, copyBlobName)) .build(); Blob blob = storage.copy(request).getResult(); // [END copyBlob] return blob; }
@Test public void testRewriteWithObject() { EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITH_OBJECT)) .andReturn(RESPONSE_WITH_OBJECT_DONE); EasyMock.replay(storageRpcMock); copyWriter = new CopyWriter(options, RESPONSE_WITH_OBJECT); assertEquals(result, copyWriter.getResult()); assertTrue(copyWriter.isDone()); assertEquals(42L, copyWriter.getTotalBytesCopied()); assertEquals(42L, copyWriter.getBlobSize()); }
@Override public CopyWriter copy(final CopyRequest copyRequest) { final StorageObject source = copyRequest.getSource().toPb(); final Map<StorageRpc.Option, ?> sourceOptions = optionMap( copyRequest.getSource().getGeneration(), null, copyRequest.getSourceOptions(), true); final StorageObject targetObject = copyRequest.getTarget().toPb(); final Map<StorageRpc.Option, ?> targetOptions = optionMap( copyRequest.getTarget().getGeneration(), copyRequest.getTarget().getMetageneration(), copyRequest.getTargetOptions()); try { EXCEPTION_HANDLER, getOptions().getClock()); return new CopyWriter(getOptions(), rewriteResponse); } catch (RetryHelperException e) { throw StorageException.translateAndThrow(e);
@Override public RestorableState<CopyWriter> capture() { return StateImpl.newBuilder( serviceOptions, BlobId.fromPb(rewriteResponse.rewriteRequest.source), rewriteResponse.rewriteRequest.sourceOptions, rewriteResponse.rewriteRequest.overrideInfo, BlobInfo.fromPb(rewriteResponse.rewriteRequest.target), rewriteResponse.rewriteRequest.targetOptions) .setResult(rewriteResponse.result != null ? BlobInfo.fromPb(rewriteResponse.result) : null) .setBlobSize(getBlobSize()) .setIsDone(isDone()) .setMegabytesCopiedPerChunk(rewriteResponse.rewriteRequest.megabytesRewrittenPerCall) .setRewriteToken(rewriteResponse.rewriteToken) .setTotalBytesRewritten(getTotalBytesCopied()) .build(); }