| @@ -59,21 +59,55 @@ func ObsHasObject(path string) (bool, error) { | |||||
| return hasObject, nil | return hasObject, nil | ||||
| } | } | ||||
| func listAllParts(uuid, uploadID, key string) (output *obs.ListPartsOutput, err error) { | |||||
| output = nil | |||||
| partNumberMarker := 0 | |||||
| for { | |||||
| temp, err := ObsCli.ListParts(&obs.ListPartsInput{ | |||||
| Bucket: setting.Bucket, | |||||
| Key: key, | |||||
| UploadId: uploadID, | |||||
| MaxParts: MAX_LIST_PARTS, | |||||
| PartNumberMarker: partNumberMarker, | |||||
| }) | |||||
| if err != nil { | |||||
| log.Error("ListParts failed:", err.Error()) | |||||
| return output, err | |||||
| } | |||||
| partNumberMarker = temp.NextPartNumberMarker | |||||
| log.Info("uuid:%s, MaxParts:%d, PartNumberMarker:%d, NextPartNumberMarker:%d, len:%d", uuid, temp.MaxParts, temp.PartNumberMarker, temp.NextPartNumberMarker, len(temp.Parts)) | |||||
| for _, partInfo := range temp.Parts { | |||||
| output.Parts = append(output.Parts, obs.Part{ | |||||
| PartNumber: partInfo.PartNumber, | |||||
| ETag: partInfo.ETag, | |||||
| }) | |||||
| } | |||||
| if len(temp.Parts) < temp.MaxParts { | |||||
| break | |||||
| } else { | |||||
| continue | |||||
| } | |||||
| break | |||||
| } | |||||
| return output, nil | |||||
| } | |||||
| func GetObsPartInfos(uuid, uploadID, fileName string) (string, error) { | func GetObsPartInfos(uuid, uploadID, fileName string) (string, error) { | ||||
| key := strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid, fileName)), "/") | key := strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid, fileName)), "/") | ||||
| output, err := ObsCli.ListParts(&obs.ListPartsInput{ | |||||
| Bucket: setting.Bucket, | |||||
| Key: key, | |||||
| UploadId: uploadID, | |||||
| }) | |||||
| allParts, err := listAllParts(uuid, uploadID, key) | |||||
| if err != nil { | if err != nil { | ||||
| log.Error("ListParts failed:", err.Error()) | |||||
| log.Error("listAllParts failed: %v", err) | |||||
| return "", err | return "", err | ||||
| } | } | ||||
| var chunks string | var chunks string | ||||
| for _, partInfo := range output.Parts { | |||||
| for _, partInfo := range allParts.Parts { | |||||
| chunks += strconv.Itoa(partInfo.PartNumber) + "-" + partInfo.ETag + "," | chunks += strconv.Itoa(partInfo.PartNumber) + "-" + partInfo.ETag + "," | ||||
| } | } | ||||
| @@ -100,39 +134,14 @@ func CompleteObsMultiPartUpload(uuid, uploadID, fileName string) error { | |||||
| input.Key = strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid, fileName)), "/") | input.Key = strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid, fileName)), "/") | ||||
| input.UploadId = uploadID | input.UploadId = uploadID | ||||
| partNumberMarker := 0 | |||||
| for { | |||||
| output, err := ObsCli.ListParts(&obs.ListPartsInput{ | |||||
| Bucket: setting.Bucket, | |||||
| Key: input.Key, | |||||
| UploadId: uploadID, | |||||
| MaxParts: MAX_LIST_PARTS, | |||||
| PartNumberMarker: partNumberMarker, | |||||
| }) | |||||
| if err != nil { | |||||
| log.Error("ListParts failed:", err.Error()) | |||||
| return err | |||||
| } | |||||
| partNumberMarker = output.NextPartNumberMarker | |||||
| log.Info("uuid:%s, MaxParts:%d, PartNumberMarker:%d, NextPartNumberMarker:%d, len:%d", uuid, output.MaxParts, output.PartNumberMarker, output.NextPartNumberMarker, len(output.Parts)) | |||||
| for _, partInfo := range output.Parts { | |||||
| input.Parts = append(input.Parts, obs.Part{ | |||||
| PartNumber: partInfo.PartNumber, | |||||
| ETag: partInfo.ETag, | |||||
| }) | |||||
| } | |||||
| if len(output.Parts) < output.MaxParts { | |||||
| break | |||||
| } else { | |||||
| continue | |||||
| } | |||||
| break | |||||
| allParts, err := listAllParts(uuid, uploadID, input.Key) | |||||
| if err != nil { | |||||
| log.Error("listAllParts failed: %v", err) | |||||
| return err | |||||
| } | } | ||||
| input.Parts = allParts.Parts | |||||
| output, err := ObsCli.CompleteMultipartUpload(input) | output, err := ObsCli.CompleteMultipartUpload(input) | ||||
| if err != nil { | if err != nil { | ||||
| log.Error("CompleteMultipartUpload failed:", err.Error()) | log.Error("CompleteMultipartUpload failed:", err.Error()) | ||||