Skip to content

Commit 453d60d

Browse files
author
Frank Natividad
committed
fix: last chunk is retriable
1 parent ebb5fb2 commit 453d60d

File tree

3 files changed

+28
-8
lines changed

3 files changed

+28
-8
lines changed

google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteChannel.java

+17-1
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,14 @@ public void run() {
120120
// For completeness, this case is not possible because it would require retrying
121121
// a 400 status code which is not allowed.
122122
//
123+
// Case 7: remoteNextByteOffset==-1 && last == true
124+
// Upload is complete and retry occurred in the "last" chunk. Data sent was
125+
// received by the service.
126+
//
127+
// Case 8: remoteNextByteOffset==-1 && last == false
128+
// Upload was completed by another client because this retry did not occur
129+
// during the last chunk.
130+
//
123131
// Get remote offset from API
124132
long remoteNextByteOffset =
125133
getOptions().getStorageRpcV1().getCurrentUploadOffset(getUploadId());
@@ -154,7 +162,8 @@ && driftOffset < getChunkSize()) {
154162
// Continue to next chunk
155163
retrying = false;
156164
return;
157-
} else {
165+
} else if (localNextByteOffset < remoteNextByteOffset
166+
&& driftOffset > getChunkSize()) {
158167
// Case 5
159168
StringBuilder sb = new StringBuilder();
160169
sb.append(
@@ -167,6 +176,13 @@ && driftOffset < getChunkSize()) {
167176
sb.append("remoteNextByteOffset: ").append(remoteNextByteOffset).append('\n');
168177
sb.append("driftOffset: ").append(driftOffset).append("\n\n");
169178
throw new StorageException(0, sb.toString());
179+
} else if (remoteNextByteOffset == -1 && last) {
180+
// Case 7
181+
retrying = false;
182+
return;
183+
} else if (remoteNextByteOffset == -1 && !last) {
184+
// Case 8
185+
throw new StorageException(0, "Resumable upload is already complete.");
170186
}
171187
}
172188
// Request was successful and retrying state is now disabled.

google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpc.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -766,7 +766,7 @@ public long getCurrentUploadOffset(String uploadId) {
766766
response = httpRequest.execute();
767767
int code = response.getStatusCode();
768768
if (code == 201 || code == 200) {
769-
throw new StorageException(0, "Resumable upload is already complete.");
769+
return -1;
770770
}
771771
StringBuilder sb = new StringBuilder();
772772
sb.append("Not sure what occurred. Here's debugging information:\n");

google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java

+10-6
Original file line numberDiff line numberDiff line change
@@ -3611,17 +3611,21 @@ public void testWriterWithKmsKeyName() throws IOException {
36113611
// Write an empty object with a kmsKeyName.
36123612
String blobName = "test-empty-blob";
36133613
BlobInfo blobInfo = BlobInfo.newBuilder(BUCKET, blobName).build();
3614+
Storage storage =
3615+
StorageOptions.newBuilder().setHost("http://localhost:8080").build().getService();
3616+
storage.create(BucketInfo.of(BUCKET));
36143617
Blob blob =
3615-
storage.create(blobInfo, Storage.BlobTargetOption.kmsKeyName(kmsKeyOneResourcePath));
3618+
storage.create(blobInfo); // , Storage.BlobTargetOption.kmsKeyName(kmsKeyOneResourcePath));
36163619

36173620
// Create a writer using blob that already has metadata received from Storage API.
3618-
int numberOfBytes;
3621+
int numberOfBytes = 0;
36193622
try (WriteChannel writer = blob.writer()) {
3620-
byte[] content = BLOB_STRING_CONTENT.getBytes(UTF_8);
3621-
numberOfBytes = writer.write(ByteBuffer.wrap(content, 0, content.length));
3623+
for (int i = 0; i < 1024 * 1024; i++) {
3624+
byte[] content = BLOB_STRING_CONTENT.getBytes(UTF_8);
3625+
numberOfBytes += writer.write(ByteBuffer.wrap(content, 0, content.length));
3626+
}
36223627
}
3623-
assertThat(numberOfBytes).isEqualTo(27);
3624-
assertThat(blob.getKmsKeyName()).isNotNull();
3628+
assertThat(numberOfBytes).isEqualTo(27 * 1024 * 1024);
36253629
assertThat(storage.delete(BUCKET, blobName)).isTrue();
36263630
}
36273631
}

0 commit comments

Comments
 (0)