diff --git a/ChangeLog.txt b/ChangeLog.txt index 05c6b42a094c..c2a7ce47e8e6 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1,4 +1,7 @@ 2013.02.22 Version 0.4.1 + * BlobOutputStream now commits block list using LATEST instead of UNCOMMITTED + * Added RequestResult to StorageEvents + * Fixed race condition when accessing OperationContext RequestResults * Fixed the return value of BlobInputStream.read * Fixed CloudPageBlob.downloadPageRanges to retrieve the blob length * Fixed MD5 validation in BlobInputStream diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/BlobOutputStream.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/BlobOutputStream.java index dae640999861..93d870b15e1b 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/BlobOutputStream.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/BlobOutputStream.java @@ -356,7 +356,7 @@ private synchronized void dispatchWrite(final int writeLength) throws IOExceptio if (this.streamType == BlobType.BLOCK_BLOB) { final CloudBlockBlob blobRef = (CloudBlockBlob) this.parentBlobRef; final String blockID = Base64.encode(Utility.getBytesFromLong(this.blockIdSequenceNumber++)); - this.blockList.add(new BlockEntry(blockID, BlockSearchMode.UNCOMMITTED)); + this.blockList.add(new BlockEntry(blockID, BlockSearchMode.LATEST)); worker = new Callable() { @Override diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudBlob.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudBlob.java index 0bccdaa85e80..84e345591cc5 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudBlob.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudBlob.java @@ -298,7 +298,7 @@ public String execute(final CloudBlobClient client, final CloudBlob blob, final client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_CREATED) { this.setNonExceptionedRetryableFailure(true); @@ -410,7 +410,7 @@ public Long execute(final CloudBlobClient client, final CloudBlob blob, final Op client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_ACCEPTED) { this.setNonExceptionedRetryableFailure(true); @@ -544,7 +544,7 @@ public Void execute(final CloudBlobClient client, final CloudBlob blob, final Op BlobRequest.addMetadata(request, blob.metadata, opContext); client.getCredentials().signRequest(request, 0); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_ACCEPTED) { this.setNonExceptionedRetryableFailure(true); @@ -623,7 +623,7 @@ public Void execute(final CloudBlobClient client, final CloudBlob blob, final Op client.getCredentials().signRequest(request, 0); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_ACCEPTED) { this.setNonExceptionedRetryableFailure(true); @@ -698,7 +698,7 @@ public CloudBlob execute(final CloudBlobClient client, final CloudBlob blob, client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_CREATED) { this.setNonExceptionedRetryableFailure(true); @@ -787,7 +787,7 @@ public Void execute(final CloudBlobClient client, final CloudBlob blob, final Op client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_ACCEPTED) { this.setNonExceptionedRetryableFailure(true); @@ -878,7 +878,7 @@ public Boolean execute(final CloudBlobClient client, final CloudBlob blob, final client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() == HttpURLConnection.HTTP_ACCEPTED) { return true; @@ -961,8 +961,7 @@ public Void execute(final CloudBlobClient client, final CloudBlob blob, final Op blobOptions.getTimeoutIntervalInMs(), blob.snapshotID, accessCondition, blobOptions, opContext); client.getCredentials().signRequest(request, -1L); - final InputStream streamRef = ExecutionEngine.getInputStream(request, opContext); - this.setResult(opContext.getLastResult()); + final InputStream streamRef = ExecutionEngine.getInputStream(request, opContext, this.getResult()); final String contentMD5 = request.getHeaderField(Constants.HeaderConstants.CONTENT_MD5); final Boolean validateMD5 = !blobOptions.getDisableContentMD5Validation() @@ -1015,8 +1014,8 @@ public Void execute(final CloudBlobClient client, final CloudBlob blob, final Op if ((ex.getHttpStatusCode() == Constants.HeaderConstants.HTTP_UNUSED_306 && !ex.getErrorCode().equals( StorageErrorCodeStrings.OUT_OF_RANGE_INPUT)) || ex.getHttpStatusCode() == HttpURLConnection.HTTP_PRECON_FAILED - || !dummyPolicy.shouldRetry(0, opContext.getLastResult().getStatusCode(), - (Exception) ex.getCause(), opContext).isShouldRetry()) { + || !dummyPolicy.shouldRetry(0, impl.getResult().getStatusCode(), (Exception) ex.getCause(), + opContext).isShouldRetry()) { opContext.setIntermediateMD5(null); throw ex; } @@ -1141,7 +1140,7 @@ public Void execute(final CloudBlobClient client, final CloudBlob blob, final Op client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); @@ -1298,8 +1297,7 @@ public Void execute(final CloudBlobClient client, final CloudBlob blob, final Op client.getCredentials().signRequest(request, -1L); - final InputStream sourceStream = ExecutionEngine.getInputStream(request, opContext); - this.setResult(opContext.getLastResult()); + final InputStream sourceStream = ExecutionEngine.getInputStream(request, opContext, this.getResult()); int totalRead = 0; int nextRead = buffer.length - bufferOffset; @@ -1435,7 +1433,7 @@ public Boolean execute(final CloudBlobClient client, final CloudBlob blob, final client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() == HttpURLConnection.HTTP_OK) { final BlobAttributes retrievedAttributes = BlobResponse.getAttributes(request, blob.getUri(), @@ -1922,7 +1920,7 @@ public Void execute(final CloudBlobClient client, final CloudBlob blob, final Op client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); @@ -2002,7 +2000,7 @@ public Void execute(final CloudBlobClient client, final CloudBlob blob, final Op client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); @@ -2091,7 +2089,7 @@ public Void execute(final CloudBlobClient client, final CloudBlob blob, final Op client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); @@ -2218,7 +2216,7 @@ public Long execute(final CloudBlobClient client, final CloudBlob blob, final Op client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() == HttpURLConnection.HTTP_CONFLICT) { final StorageException potentialConflictException = StorageException.translateException(request, @@ -2368,7 +2366,7 @@ public Void execute(final CloudBlobClient client, final CloudBlob blob, final Op HttpURLConnection.HTTP_FORBIDDEN, null, null); } - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_CREATED) { this.setNonExceptionedRetryableFailure(true); @@ -2442,7 +2440,7 @@ public Void execute(final CloudBlobClient client, final CloudBlob blob, final Op BlobRequest.addMetadata(request, blob.metadata, opContext); client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); @@ -2516,7 +2514,7 @@ public Void execute(final CloudBlobClient client, final CloudBlob blob, final Op BlobRequest.addMetadata(request, blob.metadata, opContext); client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudBlobClient.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudBlobClient.java index 181549a8d575..c000b97c98ed 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudBlobClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudBlobClient.java @@ -388,7 +388,7 @@ ResultSegment listContainersCore(final String prefix, this.getCredentials().signRequest(listContainerRequest, -1L); - taskReference.setResult(ExecutionEngine.processRequest(listContainerRequest, opContext)); + ExecutionEngine.processRequest(listContainerRequest, opContext, taskReference.getResult()); if (taskReference.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { taskReference.setNonExceptionedRetryableFailure(true); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudBlobContainer.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudBlobContainer.java index ff67b888bfe3..b1d1a7a6c8db 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudBlobContainer.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudBlobContainer.java @@ -224,7 +224,7 @@ public Void execute(final CloudBlobClient client, final CloudBlobContainer conta ContainerRequest.addMetadata(request, container.metadata, opContext); client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_CREATED) { this.setNonExceptionedRetryableFailure(true); @@ -298,7 +298,7 @@ public Boolean execute(final CloudBlobClient client, final CloudBlobContainer co ContainerRequest.addMetadata(request, container.metadata, opContext); client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); // Validate response code here if (this.getResult().getStatusCode() == HttpURLConnection.HTTP_CREATED) { @@ -390,7 +390,7 @@ public Void execute(final CloudBlobClient client, final CloudBlobContainer conta client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_ACCEPTED) { this.setNonExceptionedRetryableFailure(true); @@ -460,7 +460,7 @@ public Boolean execute(final CloudBlobClient client, final CloudBlobContainer co client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() == HttpURLConnection.HTTP_ACCEPTED) { container.updatePropertiesFromResponse(request); @@ -533,7 +533,7 @@ public Void execute(final CloudBlobClient client, final CloudBlobContainer conta client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); @@ -610,7 +610,7 @@ public BlobContainerPermissions execute(final CloudBlobClient client, final Clou client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); @@ -689,7 +689,7 @@ public Boolean execute(final CloudBlobClient client, final CloudBlobContainer co client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() == HttpURLConnection.HTTP_OK) { container.updatePropertiesFromResponse(request); @@ -1108,7 +1108,7 @@ ResultSegment listBlobsCore(final String prefix, final boolean use this.blobServiceClient.getCredentials().signRequest(listBlobsRequest, -1L); - taskReference.setResult(ExecutionEngine.processRequest(listBlobsRequest, opContext)); + ExecutionEngine.processRequest(listBlobsRequest, opContext, taskReference.getResult()); if (taskReference.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { taskReference.setNonExceptionedRetryableFailure(true); @@ -1533,7 +1533,7 @@ public Void execute(final CloudBlobClient client, final CloudBlobContainer conta ContainerRequest.addMetadata(request, container.metadata, opContext); client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); @@ -1613,7 +1613,7 @@ public Void execute(final CloudBlobClient client, final CloudBlobContainer conta final OutputStream outStreamRef = request.getOutputStream(); outStreamRef.write(aclBytes); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); @@ -1633,7 +1633,7 @@ public Void execute(final CloudBlobClient client, final CloudBlobContainer conta * * @param leaseTimeInSeconds * Specifies the span of time for which to acquire the lease, in seconds. - * If null, an infinite lease will be acquired. If not null, the value must be greater than + * If null, an infinite lease will be acquired. If not null, the value must be greater than * zero. * * @param proposedLeaseId @@ -1657,7 +1657,7 @@ public final String acquireLease(final Integer leaseTimeInSeconds, final String * * @param leaseTimeInSeconds * Specifies the span of time for which to acquire the lease, in seconds. - * If null, an infinite lease will be acquired. If not null, the value must be greater than + * If null, an infinite lease will be acquired. If not null, the value must be greater than * zero. * * @param proposedLeaseId @@ -1666,12 +1666,12 @@ public final String acquireLease(final Integer leaseTimeInSeconds, final String * * @param accessCondition * An {@link AccessCondition} object that represents the access conditions for the container. - * + * * @param options * A {@link BlobRequestOptions} object that specifies any additional options for the request. Specifying - * null will use the default request options from the associated service client + * null will use the default request options from the associated service client * ({@link CloudBlobClient}). - * + * * @param opContext * An {@link OperationContext} object that represents the context for the current operation. The context * is used to track requests to the storage service, and to provide additional runtime information about @@ -1710,7 +1710,7 @@ public String execute(final CloudBlobClient client, final CloudBlobContainer con client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_CREATED) { this.setNonExceptionedRetryableFailure(true); @@ -1731,8 +1731,8 @@ public String execute(final CloudBlobClient client, final CloudBlobContainer con * Renews an existing lease with the specified access conditions. * * @param accessCondition - * An {@link AccessCondition} object that represents the access conditions for the container. The lease ID is - * required to be set with an access condition. + * An {@link AccessCondition} object that represents the access conditions for the container. The lease + * ID is required to be set with an access condition. * * @throws StorageException * If a storage service error occurred. @@ -1748,12 +1748,12 @@ public final void renewLease(final AccessCondition accessCondition) throws Stora * @param accessCondition * An {@link AccessCondition} object that represents the access conditions for the blob. The lease ID is * required to be set with an access condition. - * + * * @param options * A {@link BlobRequestOptions} object that specifies any additional options for the request. Specifying - * null will use the default request options from the associated service client + * null will use the default request options from the associated service client * ({@link CloudBlobClient}). - * + * * @param opContext * An {@link OperationContext} object that represents the context for the current operation. The context * is used to track requests to the storage service, and to provide additional runtime information about @@ -1792,7 +1792,7 @@ public Void execute(final CloudBlobClient client, final CloudBlobContainer conta client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); @@ -1824,17 +1824,18 @@ public final void releaseLease(final AccessCondition accessCondition) throws Sto } /** - * Releases the lease on the container using the specified access conditions, request options, and operation context. + * Releases the lease on the container using the specified access conditions, request options, and operation + * context. * * @param accessCondition * An {@link AccessCondition} object that represents the access conditions for the blob. The lease ID is * required to be set with an access condition. - * + * * @param options * A {@link BlobRequestOptions} object that specifies any additional options for the request. Specifying - * null will use the default request options from the associated service client + * null will use the default request options from the associated service client * ({@link CloudBlobClient}). - * + * * @param opContext * An {@link OperationContext} object that represents the context for the current operation. The context * is used to track requests to the storage service, and to provide additional runtime information about @@ -1873,7 +1874,7 @@ public Void execute(final CloudBlobClient client, final CloudBlobContainer conta client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); @@ -1890,7 +1891,7 @@ public Void execute(final CloudBlobClient client, final CloudBlobContainer conta } /** - * Breaks the lease and ensures that another client cannot acquire a new lease until the current lease + * Breaks the lease and ensures that another client cannot acquire a new lease until the current lease * period has expired. * * @param breakPeriodInSeconds @@ -1908,7 +1909,7 @@ public final long breakLease(final Integer breakPeriodInSeconds) throws StorageE } /** - * Breaks the existing lease, using the specified request options and operation context, and ensures that + * Breaks the existing lease, using the specified request options and operation context, and ensures that * another client cannot acquire a new lease until the current lease period has expired. * * @param breakPeriodInSeconds @@ -1919,7 +1920,7 @@ public final long breakLease(final Integer breakPeriodInSeconds) throws StorageE * An {@link AccessCondition} object that represents the access conditions for the blob. * @param options * A {@link BlobRequestOptions} object that specifies any additional options for the request. Specifying - * null will use the default request options from the associated service client + * null will use the default request options from the associated service client * ({@link CloudBlobClient}). * @param opContext * An {@link OperationContext} object that represents the context for the current operation. The context @@ -1958,7 +1959,7 @@ public Long execute(final CloudBlobClient client, final CloudBlobContainer conta client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_ACCEPTED) { this.setNonExceptionedRetryableFailure(true); @@ -2006,12 +2007,12 @@ public final void changeLease(final String proposedLeaseId, final AccessConditio * @param accessCondition * An {@link AccessCondition} object that represents the access conditions for the blob. The lease ID is * required to be set with an access condition. - * + * * @param options * A {@link BlobRequestOptions} object that specifies any additional options for the request. Specifying - * null will use the default request options from the associated service client + * null will use the default request options from the associated service client * ({@link CloudBlobClient}). - * + * * @param opContext * An {@link OperationContext} object that represents the context for the current operation. The context * is used to track requests to the storage service, and to provide additional runtime information about @@ -2050,7 +2051,7 @@ public Void execute(final CloudBlobClient client, final CloudBlobContainer conta client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudBlockBlob.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudBlockBlob.java index b28a54a6affd..9ee73d83c1d1 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudBlockBlob.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudBlockBlob.java @@ -204,7 +204,7 @@ public Void execute(final CloudBlobClient client, final CloudBlob blob, final Op Utility.writeToOutputStream(blockListInputStream, request.getOutputStream(), descriptor.getLength(), false, false, null, opContext); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_CREATED) { this.setNonExceptionedRetryableFailure(true); @@ -293,7 +293,7 @@ public ArrayList execute(final CloudBlobClient client, final CloudBl client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); @@ -624,7 +624,7 @@ public Void execute(final CloudBlobClient client, final CloudBlob blob, final Op Utility.writeToOutputStream(sourceStream, request.getOutputStream(), length, true /* rewindSourceStream */, false /* calculateMD5 */, null, opContext); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_CREATED) { this.setNonExceptionedRetryableFailure(true); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudPageBlob.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudPageBlob.java index b9b0ddd1fc15..d81af25c6267 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudPageBlob.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/CloudPageBlob.java @@ -272,7 +272,7 @@ public Void execute(final CloudBlobClient client, final CloudBlob blob, final Op client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_CREATED) { this.setNonExceptionedRetryableFailure(true); @@ -352,7 +352,7 @@ public ArrayList execute(final CloudBlobClient client, final CloudBlo client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); @@ -484,7 +484,7 @@ public Void execute(final CloudBlobClient client, final CloudBlob blob, final Op client.getCredentials().signRequest(request, 0L); } - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_CREATED) { this.setNonExceptionedRetryableFailure(true); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/OperationContext.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/OperationContext.java index 7e6e3a3320da..d19a8eba6b64 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/OperationContext.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/OperationContext.java @@ -51,7 +51,7 @@ public final class OperationContext { * Represents request results, in the form of an ArrayList object that contains the * {@link RequestResult} objects, for each physical request that is made. */ - private ArrayList requestResults; + private final ArrayList requestResults; /** * Represents an event that is triggered before sending a request. @@ -135,7 +135,7 @@ public MessageDigest getIntermediateMD5() { * * @return A {@link RequestResult} object that represents the last request result. */ - public RequestResult getLastResult() { + public synchronized RequestResult getLastResult() { if (this.requestResults == null || this.requestResults.size() == 0) { return null; } @@ -165,6 +165,16 @@ public ArrayList getRequestResults() { return this.requestResults; } + /** + * Reserved for internal use. appends a {@link RequestResult} object to the internal collection in a synchronized + * manner. + * + * @param requestResult + */ + public synchronized void appendRequestResult(RequestResult requestResult) { + this.requestResults.add(requestResult); + } + /** * @return the SendingRequestEvent */ diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/ResponseReceivedEvent.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/ResponseReceivedEvent.java index f0b8419d1ab5..bf1506495a5d 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/ResponseReceivedEvent.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/ResponseReceivedEvent.java @@ -23,13 +23,18 @@ public final class ResponseReceivedEvent { * Represents a connection object. Currently only java.net.HttpURLConnection is supported as a * connection object. */ - private Object connectionObject; + private final Object connectionObject; /** * Represents a context for the current operation. This object is used to track requests to the storage service, and * to provide additional runtime information about the operation. */ - private OperationContext opContext; + private final OperationContext opContext; + + /** + * A {@link RequestResult} object that represents the last request result. + */ + private final RequestResult requestResult; /** * Creates an instance of the ResponseReceivedEvent class. @@ -41,10 +46,14 @@ public final class ResponseReceivedEvent { * @param connectionObject * Represents a connection object. Currently only java.net.HttpURLConnection is supported as * a connection object. + * @param requestResult + * A {@link RequestResult} object that represents the current request result. */ - public ResponseReceivedEvent(final OperationContext opContext, final Object connectionObject) { + public ResponseReceivedEvent(final OperationContext opContext, final Object connectionObject, + final RequestResult requestResult) { this.opContext = opContext; this.connectionObject = connectionObject; + this.requestResult = requestResult; } /** @@ -60,4 +69,11 @@ public Object getConnectionObject() { public OperationContext getOpContext() { return this.opContext; } + + /** + * @return A {@link RequestResult} object that represents the current request result. + */ + public RequestResult getRequestResult() { + return this.requestResult; + } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/SendingRequestEvent.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/SendingRequestEvent.java index 8b61f7e092ff..8d0e6da594d6 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/SendingRequestEvent.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/SendingRequestEvent.java @@ -31,6 +31,11 @@ public final class SendingRequestEvent { */ private final OperationContext opContext; + /** + * A {@link RequestResult} object that represents the last request result. + */ + private final RequestResult requestResult; + /** * Creates an instance of the SendingRequestEvent class. * @@ -41,10 +46,14 @@ public final class SendingRequestEvent { * @param connectionObject * Represents a connection object. Currently only java.net.HttpURLConnection is supported as * a connection object. + * @param requestResult + * A {@link RequestResult} object that represents the current request result. */ - public SendingRequestEvent(final OperationContext opContext, final Object connectionObject) { + public SendingRequestEvent(final OperationContext opContext, final Object connectionObject, + final RequestResult requestResult) { this.opContext = opContext; this.connectionObject = connectionObject; + this.requestResult = requestResult; } /** @@ -60,4 +69,11 @@ public Object getConnectionObject() { public OperationContext getOpContext() { return this.opContext; } + + /** + * @return A {@link RequestResult} object that represents the current request result. + */ + public RequestResult getRequestResult() { + return this.requestResult; + } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/ServiceClient.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/ServiceClient.java index 02f0322b2808..8a6df9f916f3 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/ServiceClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/ServiceClient.java @@ -144,7 +144,7 @@ public ServiceProperties execute(final ServiceClient client, final Void v, final .getRequestOptions().getTimeoutIntervalInMs(), null, opContext); client.getCredentials().signRequest(request, -1); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); @@ -242,13 +242,13 @@ public void setRetryPolicyFactory(final RetryPolicyFactory retryPolicyFactory) { /** * Sets the timeout to use when making requests to the storage service. *

- * The server timeout interval begins at the time that the complete request has been received by the service, and the - * server begins processing the response. If the timeout interval elapses before the response is returned to the + * The server timeout interval begins at the time that the complete request has been received by the service, and + * the server begins processing the response. If the timeout interval elapses before the response is returned to the * client, the operation times out. The timeout interval resets with each retry, if the request is retried. * - * The default timeout interval for a request made via the service client is 90 seconds. You can change this value on - * the service client by setting this property, so that all subsequent requests made via the service client will use - * the new timeout interval. You can also change this value for an individual request, by setting the + * The default timeout interval for a request made via the service client is 90 seconds. You can change this value + * on the service client by setting this property, so that all subsequent requests made via the service client will + * use the new timeout interval. You can also change this value for an individual request, by setting the * {@link RequestOptions#timeoutIntervalInMs} property. * * If you are downloading a large blob, you should increase the value of the timeout beyond the default value. @@ -330,7 +330,7 @@ public Void execute(final ServiceClient client, final Void v, final OperationCon Utility.writeToOutputStream(dataInputStream, request.getOutputStream(), descriptor.getLength(), false /* rewindSourceStream */, false /* calculateMD5 */, null, opContext); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_ACCEPTED) { this.setNonExceptionedRetryableFailure(true); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/utils/implementation/ExecutionEngine.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/utils/implementation/ExecutionEngine.java index ba188fb37692..9d3ad41e569a 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/utils/implementation/ExecutionEngine.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/utils/implementation/ExecutionEngine.java @@ -106,7 +106,7 @@ public static RESULT_TYPE executeWithRet while (true) { try { // reset result flags - task.initialize(); + task.initialize(opContext); final RESULT_TYPE result = task.execute(client, parentObject, opContext); @@ -119,7 +119,7 @@ public static RESULT_TYPE executeWithRet else { // The task may have already parsed an exception. translatedException = task.materializeException(getLastRequestObject(opContext), opContext); - setLastException(opContext, translatedException); + task.getResult().setException(translatedException); // throw on non retryable status codes: 501, 505, blob type // mismatch @@ -134,45 +134,45 @@ public static RESULT_TYPE executeWithRet // Retryable translatedException = StorageException .translateException(getLastRequestObject(opContext), e, opContext); - setLastException(opContext, translatedException); + task.getResult().setException(translatedException); } catch (final SocketTimeoutException e) { // Retryable translatedException = new StorageException(StorageErrorCodeStrings.OPERATION_TIMED_OUT, "The operation did not complete in the specified time.", -1, null, e); - setLastException(opContext, translatedException); + task.getResult().setException(translatedException); } catch (final IOException e) { // Retryable translatedException = StorageException .translateException(getLastRequestObject(opContext), e, opContext); - setLastException(opContext, translatedException); + task.getResult().setException(translatedException); } catch (final XMLStreamException e) { // Non Retryable, just throw translatedException = StorageException .translateException(getLastRequestObject(opContext), e, opContext); - setLastException(opContext, translatedException); + task.getResult().setException(translatedException); throw translatedException; } catch (final InvalidKeyException e) { // Non Retryable, just throw translatedException = StorageException .translateException(getLastRequestObject(opContext), e, opContext); - setLastException(opContext, translatedException); + task.getResult().setException(translatedException); throw translatedException; } catch (final URISyntaxException e) { // Non Retryable, just throw translatedException = StorageException .translateException(getLastRequestObject(opContext), e, opContext); - setLastException(opContext, translatedException); + task.getResult().setException(translatedException); throw translatedException; } catch (final TableServiceException e) { task.getResult().setStatusCode(e.getHttpStatusCode()); task.getResult().setStatusMessage(e.getMessage()); - setLastException(opContext, e); + task.getResult().setException(e); if (!e.isRetryable()) { throw e; } @@ -183,20 +183,20 @@ public static RESULT_TYPE executeWithRet catch (final StorageException e) { // Non Retryable, just throw // do not translate StorageException - setLastException(opContext, e); + task.getResult().setException(e); throw e; } catch (final Exception e) { // Non Retryable, just throw translatedException = StorageException .translateException(getLastRequestObject(opContext), e, opContext); - setLastException(opContext, translatedException); + task.getResult().setException(translatedException); throw translatedException; } // Evaluate Retry Policy - retryRes = policy.shouldRetry(currentRetryCount, task.getResult().getStatusCode(), opContext - .getLastResult().getException(), opContext); + retryRes = policy.shouldRetry(currentRetryCount, task.getResult().getStatusCode(), task.getResult() + .getException(), opContext); if (!retryRes.isShouldRetry()) { throw translatedException; } @@ -214,19 +214,21 @@ public static RESULT_TYPE executeWithRet * the request to process * @param opContext * an object used to track the execution of the operation + * @param currResult + * A {@link RequestResult} object that represents the current request result. * @return the input stream from the request * @throws IOException * if there is an error making the connection */ - public static InputStream getInputStream(final HttpURLConnection request, final OperationContext opContext) - throws IOException { - final RequestResult currResult = new RequestResult(); + public static InputStream getInputStream(final HttpURLConnection request, final OperationContext opContext, + final RequestResult currResult) throws IOException { + opContext.setCurrentRequestObject(request); currResult.setStartDate(new Date()); - opContext.getRequestResults().add(currResult); if (opContext.getSendingRequestEventHandler().hasListeners()) { - opContext.getSendingRequestEventHandler().fireEvent(new SendingRequestEvent(opContext, request)); + opContext.getSendingRequestEventHandler() + .fireEvent(new SendingRequestEvent(opContext, request, currResult)); } try { @@ -278,7 +280,8 @@ public static void getResponseCode(final RequestResult currResult, final HttpURL currResult.setContentMD5(BaseResponse.getContentMD5(request)); if (opContext.getResponseReceivedEventHandler().hasListeners()) { - opContext.getResponseReceivedEventHandler().fireEvent(new ResponseReceivedEvent(opContext, request)); + opContext.getResponseReceivedEventHandler().fireEvent( + new ResponseReceivedEvent(opContext, request, currResult)); } } @@ -290,19 +293,20 @@ public static void getResponseCode(final RequestResult currResult, final HttpURL * the request to process * @param opContext * an object used to track the execution of the operation - * @return a RequestResult object representing the status code/ message of the current request + * @param currResult + * A {@link RequestResult} object that represents the current request result. * @throws IOException * if there is an error making the connection */ - public static RequestResult processRequest(final HttpURLConnection request, final OperationContext opContext) - throws IOException { - final RequestResult currResult = new RequestResult(); - currResult.setStartDate(new Date()); - opContext.getRequestResults().add(currResult); + public static void processRequest(final HttpURLConnection request, final OperationContext opContext, + final RequestResult currResult) throws IOException { + opContext.setCurrentRequestObject(request); + currResult.setStartDate(new Date()); if (opContext.getSendingRequestEventHandler().hasListeners()) { - opContext.getSendingRequestEventHandler().fireEvent(new SendingRequestEvent(opContext, request)); + opContext.getSendingRequestEventHandler() + .fireEvent(new SendingRequestEvent(opContext, request, currResult)); } // Send the request @@ -316,25 +320,9 @@ public static RequestResult processRequest(final HttpURLConnection request, fina currResult.setContentMD5(BaseResponse.getContentMD5(request)); if (opContext.getResponseReceivedEventHandler().hasListeners()) { - opContext.getResponseReceivedEventHandler().fireEvent(new ResponseReceivedEvent(opContext, request)); - } - - return currResult; - } - - /** - * Sets the exception on the last request result in a safe way, if there is no last result one is added. - * - * @param opContext - * an object used to track the execution of the operation - * @param exceptionToSet - * the exception to set on the result. - */ - private static void setLastException(final OperationContext opContext, final Exception exceptionToSet) { - if (opContext.getLastResult() == null) { - opContext.getRequestResults().add(new RequestResult()); + opContext.getResponseReceivedEventHandler().fireEvent( + new ResponseReceivedEvent(opContext, request, currResult)); } - opContext.getLastResult().setException(exceptionToSet); } /** diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/utils/implementation/StorageOperation.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/utils/implementation/StorageOperation.java index 32ff5a00459a..803bbdfa5481 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/utils/implementation/StorageOperation.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/core/storage/utils/implementation/StorageOperation.java @@ -109,8 +109,11 @@ public final RequestResult getResult() { /** * Resets the operation status flags between operations. */ - protected final void initialize() { - this.setResult(new RequestResult()); + protected final void initialize(OperationContext opContext) { + RequestResult currResult = new RequestResult(); + this.setResult(currResult); + opContext.appendRequestResult(currResult); + this.setException(null); this.setNonExceptionedRetryableFailure(false); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/queue/client/CloudQueue.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/queue/client/CloudQueue.java index 93771ce03de9..c29f1067844c 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/queue/client/CloudQueue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/queue/client/CloudQueue.java @@ -220,7 +220,7 @@ public Void execute(final CloudQueueClient client, final CloudQueue queue, final final OutputStream outStreamRef = request.getOutputStream(); outStreamRef.write(messageBytes); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_CREATED) { this.setNonExceptionedRetryableFailure(true); @@ -286,7 +286,7 @@ public Void execute(final CloudQueueClient client, final CloudQueue queue, final client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_NO_CONTENT) { this.setNonExceptionedRetryableFailure(true); @@ -351,7 +351,7 @@ public Void execute(final CloudQueueClient client, final CloudQueue queue, final QueueRequest.addMetadata(request, queue.metadata, opContext); client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_CREATED && this.getResult().getStatusCode() != HttpURLConnection.HTTP_NO_CONTENT) { @@ -424,7 +424,7 @@ public Boolean execute(final CloudQueueClient client, final CloudQueue queue, QueueRequest.addMetadata(request, queue.metadata, opContext); client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() == HttpURLConnection.HTTP_CREATED) { return true; @@ -509,7 +509,7 @@ public Void execute(final CloudQueueClient client, final CloudQueue queue, final client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_NO_CONTENT) { this.setNonExceptionedRetryableFailure(true); @@ -580,7 +580,7 @@ public Boolean execute(final CloudQueueClient client, final CloudQueue queue, client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() == HttpURLConnection.HTTP_NO_CONTENT) { return true; @@ -667,7 +667,7 @@ public Void execute(final CloudQueueClient client, final CloudQueue queue, final client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_NO_CONTENT) { this.setNonExceptionedRetryableFailure(true); @@ -733,7 +733,7 @@ public Void execute(final CloudQueueClient client, final CloudQueue queue, final client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); @@ -806,7 +806,7 @@ public Boolean execute(final CloudQueueClient client, final CloudQueue queue, client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() == HttpURLConnection.HTTP_OK) { return Boolean.valueOf(true); @@ -1021,7 +1021,7 @@ public ArrayList execute(final CloudQueueClient client, final client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); @@ -1155,7 +1155,7 @@ public ArrayList execute(final CloudQueueClient client, final client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); @@ -1293,7 +1293,7 @@ public Void execute(final CloudQueueClient client, final CloudQueue queue, final client.getCredentials().signRequest(request, 0L); } - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_NO_CONTENT) { this.setNonExceptionedRetryableFailure(true); @@ -1366,7 +1366,7 @@ public Void execute(final CloudQueueClient client, final CloudQueue queue, final QueueRequest.addMetadata(request, queue.metadata, opContext); client.getCredentials().signRequest(request, 0L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_NO_CONTENT) { this.setNonExceptionedRetryableFailure(true); @@ -1445,7 +1445,7 @@ public Void execute(final CloudQueueClient client, final CloudQueue queue, final final OutputStream outStreamRef = request.getOutputStream(); outStreamRef.write(aclBytes); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_NO_CONTENT) { this.setNonExceptionedRetryableFailure(true); @@ -1515,7 +1515,7 @@ public QueuePermissions execute(final CloudQueueClient client, final CloudQueue client.getCredentials().signRequest(request, -1L); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); @@ -1545,11 +1545,11 @@ public QueuePermissions execute(final CloudQueueClient client, final CloudQueue * A queue-level access policy. * @return A shared access signature for the queue. * @throws InvalidKeyException - * If an invalid key was passed. + * If an invalid key was passed. * @throws StorageException - * If a storage service error occurred. + * If a storage service error occurred. * @throws IllegalArgumentException - * If an unexpected value is passed. + * If an unexpected value is passed. */ public String generateSharedAccessSignature(final SharedAccessQueuePolicy policy, final String groupPolicyIdentifier) throws InvalidKeyException, StorageException { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/queue/client/CloudQueueClient.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/queue/client/CloudQueueClient.java index 0ca46aaf25bc..addec40b3b9c 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/queue/client/CloudQueueClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/queue/client/CloudQueueClient.java @@ -227,7 +227,7 @@ ResultSegment listQueuesCore(final String prefix, final QueueListing this.getCredentials().signRequest(listQueueRequest, -1L); - taskReference.setResult(ExecutionEngine.processRequest(listQueueRequest, opContext)); + ExecutionEngine.processRequest(listQueueRequest, opContext, taskReference.getResult()); if (taskReference.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { taskReference.setNonExceptionedRetryableFailure(true); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/CloudTable.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/CloudTable.java index 536b3adfb582..f13eac657acf 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/CloudTable.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/CloudTable.java @@ -493,7 +493,7 @@ public Void execute(final CloudTableClient client, final CloudTable table, final final OutputStream outStreamRef = request.getOutputStream(); outStreamRef.write(aclBytes); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_NO_CONTENT) { this.setNonExceptionedRetryableFailure(true); @@ -564,7 +564,7 @@ public TablePermissions execute(final CloudTableClient client, final CloudTable client.getCredentials().signRequestLite(request, -1L, opContext); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { this.setNonExceptionedRetryableFailure(true); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/CloudTableClient.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/CloudTableClient.java index e49f6e3fdfca..26a506cc39a6 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/CloudTableClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/CloudTableClient.java @@ -800,7 +800,7 @@ protected ResultSegment executeQuerySegmentedCore( this.getCredentials().signRequestLite(queryRequest, -1L, opContext); - taskReference.setResult(ExecutionEngine.processRequest(queryRequest, opContext)); + ExecutionEngine.processRequest(queryRequest, opContext, taskReference.getResult()); if (taskReference.getResult().getStatusCode() != HttpURLConnection.HTTP_OK) { throw TableServiceException.generateTableServiceException(true, taskReference.getResult(), null, diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/QueryTableOperation.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/QueryTableOperation.java index bc5c112c3187..14c130540b18 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/QueryTableOperation.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/QueryTableOperation.java @@ -189,7 +189,7 @@ tableName, generateRequestIdentity(isTableEntry, operation.getPartitionKey(), fa client.getCredentials().signRequestLite(request, -1L, opContext); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() == HttpURLConnection.HTTP_OK) { // Parse response for updates diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/TableBatchOperation.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/TableBatchOperation.java index 4f81296856b6..a2e814a92e00 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/TableBatchOperation.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/TableBatchOperation.java @@ -399,10 +399,9 @@ public ArrayList execute(final CloudTableClient client, final Table MimeHelper.writeBatchToStream(request.getOutputStream(), tableName, batch, batchID, changeSet, opContext); - final InputStream streamRef = ExecutionEngine.getInputStream(request, opContext); + final InputStream streamRef = ExecutionEngine.getInputStream(request, opContext, this.getResult()); ArrayList responseParts = null; try { - this.setResult(opContext.getLastResult()); final String contentType = request.getHeaderField(Constants.HeaderConstants.CONTENT_TYPE); final String[] headerVals = contentType.split("multipart/mixed; boundary="); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/TableOperation.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/TableOperation.java index da9f51a55f56..65987567691c 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/TableOperation.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/client/TableOperation.java @@ -262,7 +262,7 @@ tableName, generateRequestIdentity(isTableEntry, tableIdentity, false), operatio client.getCredentials().signRequestLite(request, -1L, opContext); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() == HttpURLConnection.HTTP_NOT_FOUND || this.getResult().getStatusCode() == HttpURLConnection.HTTP_CONFLICT) { @@ -333,7 +333,7 @@ tableName, generateRequestIdentity(isTableEntry, tableIdentity, false), AtomPubParser.writeSingleEntityToStream(operation.getEntity(), isTableEntry, request.getOutputStream(), opContext); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (operation.opType == TableOperationType.INSERT) { if (this.getResult().getStatusCode() == HttpURLConnection.HTTP_CONFLICT) { throw TableServiceException.generateTableServiceException(false, this.getResult(), operation, @@ -419,7 +419,7 @@ tableName, generateRequestIdentity(false, null, false), operation.getEntity().ge AtomPubParser.writeSingleEntityToStream(operation.getEntity(), false, request.getOutputStream(), opContext); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() == HttpURLConnection.HTTP_NOT_FOUND || this.getResult().getStatusCode() == HttpURLConnection.HTTP_CONFLICT) { @@ -485,7 +485,7 @@ tableName, generateRequestIdentity(false, null, false), operation.getEntity().ge AtomPubParser.writeSingleEntityToStream(operation.getEntity(), false, request.getOutputStream(), opContext); - this.setResult(ExecutionEngine.processRequest(request, opContext)); + ExecutionEngine.processRequest(request, opContext, this.getResult()); if (this.getResult().getStatusCode() == HttpURLConnection.HTTP_NOT_FOUND || this.getResult().getStatusCode() == HttpURLConnection.HTTP_CONFLICT) { diff --git a/microsoft-azure-api/src/test/java/com/microsoft/windowsazure/services/blob/client/CloudBlobContainerTests.java b/microsoft-azure-api/src/test/java/com/microsoft/windowsazure/services/blob/client/CloudBlobContainerTests.java index afee6de0907d..e007c4151140 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/windowsazure/services/blob/client/CloudBlobContainerTests.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/windowsazure/services/blob/client/CloudBlobContainerTests.java @@ -688,6 +688,7 @@ public void testSendingRequestEventBlob() throws StorageException, URISyntaxExce @Override public void eventOccurred(SendingRequestEvent eventArg) { + Assert.assertEquals(eventArg.getRequestResult(), eventArg.getOpContext().getLastResult()); callList.add(true); } });