MCPcopy
hub / github.com/cubefs/cubefs / uploadPartCopyHandler

Method uploadPartCopyHandler

objectnode/api_handler_multipart.go:279–425  ·  view source on GitHub ↗

Upload part copy Uploads a part in a multipart upload by copying a existed object. API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html .

(w http.ResponseWriter, r *http.Request)

Source from the content-addressed store, hash-verified

277// Uploads a part in a multipart upload by copying a existed object.
278// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html .
279func (o *ObjectNode) uploadPartCopyHandler(w http.ResponseWriter, r *http.Request) {
280 var (
281 err error
282 errorCode *ErrorCode
283 )
284
285 span := trace.SpanFromContextSafe(r.Context())
286 defer func() {
287 o.errorResponse(w, r, err, errorCode)
288 }()
289
290 // step1: check args
291 param := ParseRequestParam(r)
292 uploadId := param.GetVar(ParamUploadId)
293 partNumber := param.GetVar(ParamPartNumber)
294 if uploadId == "" || partNumber == "" {
295 log.LogErrorf("uploadPartCopyHandler: illegal uploadID or partNumber, requestID(%v)", GetRequestID(r))
296 errorCode = InvalidArgument
297 return
298 }
299 var partNumberInt uint16
300 if partNumberInt, err = safeConvertStrToUint16(partNumber); err != nil {
301 log.LogErrorf("uploadPartCopyHandler: parse part number fail, requestID(%v) raw(%v) err(%v)",
302 GetRequestID(r), partNumber, err)
303 errorCode = InvalidPartNumber
304 return
305 }
306 if partNumberInt < uint16(MinPartNumberValid) || partNumberInt > uint16(MaxPartNumberValid) {
307 errorCode = InvalidPartNumber
308 return
309 }
310
311 if param.Bucket() == "" {
312 errorCode = InvalidBucketName
313 return
314 }
315 if param.Object() == "" {
316 errorCode = InvalidKey
317 return
318 }
319 var vol *Volume
320 if vol, err = o.getVol(param.Bucket()); err != nil {
321 log.LogErrorf("uploadPartCopyHandler: load volume fail: requestID(%v) volume(%v) err(%v)",
322 GetRequestID(r), param.Bucket(), err)
323 return
324 }
325
326 // QPS and Concurrency Limit
327 rateLimit := o.AcquireRateLimiter()
328 if err = rateLimit.AcquireLimitResource(vol.owner, param.apiName); err != nil {
329 return
330 }
331 defer rateLimit.ReleaseLimitResource(vol.owner, param.apiName)
332
333 // step2: extract params from req
334 srcBucket, srcObject, _, err := extractSrcBucketKey(r)
335 if err != nil {
336 log.LogDebugf("uploadPartCopyHandler: copySource(%v) argument invalid: requestID(%v)",

Callers

nothing calls this directly

Calls 15

errorResponseMethod · 0.95
getVolMethod · 0.95
AcquireRateLimiterMethod · 0.95
ObjectMetaMethod · 0.95
readFileMethod · 0.95
WritePartMethod · 0.95
NameMethod · 0.95
SpanFromContextSafeFunction · 0.92
LogErrorfFunction · 0.92
LogDebugfFunction · 0.92
ParseRequestParamFunction · 0.85
GetRequestIDFunction · 0.85

Tested by

no test coverage detected