Skip to content

Commit a0d079c

Browse files
authored
Multipart Upload: Remove the redirect to specific Artifactory node (jfrog#980)
1 parent 21daf59 commit a0d079c

File tree

2 files changed

+12
-24
lines changed

2 files changed

+12
-24
lines changed

artifactory/services/utils/multipartupload.go

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,7 @@ const (
4848
aborted completionStatus = "ABORTED"
4949

5050
// API constants
51-
uploadsApi = "/api/v1/uploads/"
52-
routeToHeader = "X-JFrog-Route-To"
53-
artifactoryNodeId = "X-Artifactory-Node-Id"
51+
uploadsApi = "/api/v1/uploads/"
5452

5553
// Sizes and limits constants
5654
MaxMultipartUploadFileSize = SizeTiB * 5
@@ -305,18 +303,17 @@ type urlPartResponse struct {
305303
}
306304

307305
func (mu *MultipartUpload) completeAndPollForStatus(logMsgPrefix string, completionAttemptsLeft uint, sha1 string, multipartUploadClient *httputils.HttpClientDetails, progressReader ioutils.Progress) (err error) {
308-
nodeId, err := mu.completeMultipartUpload(logMsgPrefix, sha1, multipartUploadClient)
306+
err = mu.completeMultipartUpload(logMsgPrefix, sha1, multipartUploadClient)
309307
if err != nil {
310308
return
311309
}
312310

313-
err = mu.pollCompletionStatus(logMsgPrefix, completionAttemptsLeft, sha1, nodeId, multipartUploadClient, progressReader)
311+
err = mu.pollCompletionStatus(logMsgPrefix, completionAttemptsLeft, sha1, multipartUploadClient, progressReader)
314312
return
315313
}
316314

317-
func (mu *MultipartUpload) pollCompletionStatus(logMsgPrefix string, completionAttemptsLeft uint, sha1, nodeId string, multipartUploadClient *httputils.HttpClientDetails, progressReader ioutils.Progress) error {
315+
func (mu *MultipartUpload) pollCompletionStatus(logMsgPrefix string, completionAttemptsLeft uint, sha1 string, multipartUploadClient *httputils.HttpClientDetails, progressReader ioutils.Progress) error {
318316
multipartUploadClientWithNodeId := multipartUploadClient.Clone()
319-
multipartUploadClientWithNodeId.Headers = map[string]string{routeToHeader: nodeId}
320317

321318
lastMergeLog := time.Now()
322319
pollingExecutor := &utils.RetryExecutor{
@@ -360,22 +357,22 @@ func (mu *MultipartUpload) pollCompletionStatus(logMsgPrefix string, completionA
360357
return pollingExecutor.Execute()
361358
}
362359

363-
func (mu *MultipartUpload) completeMultipartUpload(logMsgPrefix, sha1 string, multipartUploadClient *httputils.HttpClientDetails) (string, error) {
360+
func (mu *MultipartUpload) completeMultipartUpload(logMsgPrefix, sha1 string, multipartUploadClient *httputils.HttpClientDetails) error {
364361
url := fmt.Sprintf("%s%scomplete?sha1=%s", mu.artifactoryUrl, uploadsApi, sha1)
365362
resp, body, err := mu.client.GetHttpClient().SendPost(url, []byte{}, *multipartUploadClient, logMsgPrefix)
366363
if err != nil {
367-
return "", err
364+
return err
368365
}
369366
log.Debug("Artifactory response:", string(body), resp.Status)
370-
return resp.Header.Get(artifactoryNodeId), errorutils.CheckResponseStatusWithBody(resp, body, http.StatusAccepted)
367+
return errorutils.CheckResponseStatusWithBody(resp, body, http.StatusAccepted)
371368
}
372369

373370
func (mu *MultipartUpload) status(logMsgPrefix string, multipartUploadClientWithNodeId *httputils.HttpClientDetails) (status statusResponse, err error) {
374371
url := fmt.Sprintf("%s%sstatus", mu.artifactoryUrl, uploadsApi)
375372
resp, body, err := mu.client.GetHttpClient().SendPost(url, []byte{}, *multipartUploadClientWithNodeId, logMsgPrefix)
376373
// If the Artifactory node returns a "Service unavailable" error (status 503), attempt to retry the upload completion process on a different node.
377374
if resp != nil && resp.StatusCode == http.StatusServiceUnavailable {
378-
unavailableNodeErr := fmt.Sprintf(logMsgPrefix + fmt.Sprintf("The Artifactory node ID '%s' is unavailable.", multipartUploadClientWithNodeId.Headers[routeToHeader]))
375+
unavailableNodeErr := fmt.Sprintf(logMsgPrefix + "Artifactory is unavailable.")
379376
return statusResponse{Status: retryableError, Error: unavailableNodeErr}, nil
380377
}
381378
if err != nil {

artifactory/services/utils/multipartupload_test.go

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -186,9 +186,6 @@ func TestCompleteMultipartUpload(t *testing.T) {
186186
assert.Equal(t, "/api/v1/uploads/complete", r.URL.Path)
187187
assert.Equal(t, fmt.Sprintf("sha1=%s", sha1), r.URL.RawQuery)
188188

189-
// Add the "X-Artifactory-Node-Id" header to the response
190-
w.Header().Add(artifactoryNodeId, nodeId)
191-
192189
// Send response 202 Accepted
193190
w.WriteHeader(http.StatusAccepted)
194191
})
@@ -198,9 +195,8 @@ func TestCompleteMultipartUpload(t *testing.T) {
198195
defer cleanUp()
199196

200197
// Execute completeMultipartUpload
201-
actualNodeId, err := multipartUpload.completeMultipartUpload("", sha1, &httputils.HttpClientDetails{})
198+
err := multipartUpload.completeMultipartUpload("", sha1, &httputils.HttpClientDetails{})
202199
assert.NoError(t, err)
203-
assert.Equal(t, nodeId, actualNodeId)
204200
}
205201

206202
func TestStatus(t *testing.T) {
@@ -211,9 +207,6 @@ func TestStatus(t *testing.T) {
211207
// Check URL
212208
assert.Equal(t, "/api/v1/uploads/status", r.URL.Path)
213209

214-
// Check "X-JFrog-Route-To" header
215-
assert.Equal(t, nodeId, r.Header.Get(routeToHeader))
216-
217210
// Send response 200 OK
218211
w.WriteHeader(http.StatusOK)
219212
response, err := json.Marshal(statusResponse{Status: finished, Progress: utils.Pointer(100)})
@@ -227,8 +220,7 @@ func TestStatus(t *testing.T) {
227220
defer cleanUp()
228221

229222
// Execute status
230-
clientDetails := &httputils.HttpClientDetails{Headers: map[string]string{routeToHeader: nodeId}}
231-
status, err := multipartUpload.status("", clientDetails)
223+
status, err := multipartUpload.status("", &httputils.HttpClientDetails{})
232224
assert.NoError(t, err)
233225
assert.Equal(t, statusResponse{Status: finished, Progress: utils.Pointer(100)}, status)
234226
}
@@ -252,10 +244,9 @@ func TestStatusServiceUnavailable(t *testing.T) {
252244
defer cleanUp()
253245

254246
// Execute status
255-
clientDetails := &httputils.HttpClientDetails{Headers: map[string]string{routeToHeader: nodeId}}
256-
status, err := multipartUpload.status("", clientDetails)
247+
status, err := multipartUpload.status("", &httputils.HttpClientDetails{})
257248
assert.NoError(t, err)
258-
assert.Equal(t, statusResponse{Status: retryableError, Error: "The Artifactory node ID 'nodeId' is unavailable."}, status)
249+
assert.Equal(t, statusResponse{Status: retryableError, Error: "Artifactory is unavailable."}, status)
259250
}
260251

261252
func TestAbort(t *testing.T) {

0 commit comments

Comments
 (0)