File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import static com.google.cloud.RetryHelper.runWithRetries;
2020
import static java.util.concurrent.Executors.callable;
2121

22+
import com.google.api.services.storage.Storage;
2223
import com.google.api.services.storage.model.StorageObject;
2324
import com.google.cloud.BaseWriteChannel;
2425
import com.google.cloud.RestorableState;
@@ -120,6 +121,12 @@ public void run() {
120121
// For completeness, this case is not possible because it would require retrying
121122
// a 400 status code which is not allowed.
122123
//
124+
// Case 7: remoteNextByteOffset==-1 && last == true
125+
// Upload is complete and retry occurred in the "last" chunk. Data sent was 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 during the last chunk.
129+
//
123130
// Get remote offset from API
124131
long remoteNextByteOffset =
125132
getOptions().getStorageRpcV1().getCurrentUploadOffset(getUploadId());
@@ -154,7 +161,8 @@ && driftOffset < getChunkSize()) {
154161
// Continue to next chunk
155162
retrying = false;
156163
return;
157-
} else {
164+
} else if (localNextByteOffset < remoteNextByteOffset
165+
&& driftOffset > getChunkSize()){
158166
// Case 5
159167
StringBuilder sb = new StringBuilder();
160168
sb.append(
@@ -167,6 +175,13 @@ && driftOffset < getChunkSize()) {
167175
sb.append("remoteNextByteOffset: ").append(remoteNextByteOffset).append('\n');
168176
sb.append("driftOffset: ").append(driftOffset).append("\n\n");
169177
throw new StorageException(0, sb.toString());
178+
} else if (remoteNextByteOffset == -1 && last) {
179+
// Case 7
180+
retrying = false;
181+
return;
182+
} else if (remoteNextByteOffset == -1 && !last) {
183+
// Case 8
184+
throw new StorageException(0, "Resumable upload is already complete.");
170185
}
171186
}
172187
// Request was successful and retrying state is now disabled.
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");

0 commit comments

Comments
 (0)