|
19 | 19 | import static com.google.cloud.RetryHelper.runWithRetries;
|
20 | 20 | import static java.util.concurrent.Executors.callable;
|
21 | 21 |
|
| 22 | +import com.google.api.services.storage.Storage; |
22 | 23 | import com.google.api.services.storage.model.StorageObject;
|
23 | 24 | import com.google.cloud.BaseWriteChannel;
|
24 | 25 | import com.google.cloud.RestorableState;
|
@@ -120,6 +121,12 @@ public void run() {
|
120 | 121 | // For completeness, this case is not possible because it would require retrying
|
121 | 122 | // a 400 status code which is not allowed.
|
122 | 123 | //
|
| 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 | +// |
123 | 130 | // Get remote offset from API
|
124 | 131 | long remoteNextByteOffset =
|
125 | 132 | getOptions().getStorageRpcV1().getCurrentUploadOffset(getUploadId());
|
@@ -154,7 +161,8 @@ && driftOffset < getChunkSize()) {
|
154 | 161 | // Continue to next chunk
|
155 | 162 | retrying = false;
|
156 | 163 | return;
|
157 |
| -} else { |
| 164 | +} else if (localNextByteOffset < remoteNextByteOffset |
| 165 | +&& driftOffset > getChunkSize()){ |
158 | 166 | // Case 5
|
159 | 167 | StringBuilder sb = new StringBuilder();
|
160 | 168 | sb.append(
|
@@ -167,6 +175,13 @@ && driftOffset < getChunkSize()) {
|
167 | 175 | sb.append("remoteNextByteOffset: ").append(remoteNextByteOffset).append('\n');
|
168 | 176 | sb.append("driftOffset: ").append(driftOffset).append("\n\n");
|
169 | 177 | 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."); |
170 | 185 | }
|
171 | 186 | }
|
172 | 187 | // Request was successful and retrying state is now disabled.
|
|
0 commit comments