Skip to content

Commit bc22c27

Browse files
Merge remote-tracking branch 'origin/improvement/CLDSRV-741-test-abortmpu' into w/9.0/improvement/CLDSRV-741-test-abortmpu
2 parents 450c931 + 18a6353 commit bc22c27

4 files changed

Lines changed: 486 additions & 53 deletions

File tree

lib/api/apiUtils/object/abortMultipartUpload.js

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ const metadataUtils = require('../../../metadata/metadataUtils');
77
const { validateQuotas } = require('../quotas/quotaUtils');
88
const services = require('../../../services');
99
const metadata = require('../../../metadata/wrapper');
10+
const { preprocessingVersioningDelete } = require('./versioning');
11+
const { config } = require('../../../Config');
1012

1113
function abortMultipartUpload(authInfo, bucketName, objectKey, uploadId, log,
1214
callback, request) {
@@ -129,7 +131,23 @@ function abortMultipartUpload(authInfo, bucketName, objectKey, uploadId, log,
129131
// On error, continue the abort without an objectMD to clean up.
130132
return next(null, mpuBucket, storedParts, destBucket, null, skipDataDelete);
131133
}
132-
return next(null, mpuBucket, storedParts, destBucket, foundVersion, skipDataDelete);
134+
if (!foundVersion) {
135+
return next(null, mpuBucket, storedParts, destBucket, null, skipDataDelete);
136+
}
137+
// foundVersion is not in objectMD format, see MetadataWrapper _parseListEntries
138+
// multiple fields are missing or differ in list entry versus objectMD
139+
return metadataUtils.metadataGetObject(bucketName, objectKey, foundVersion.VersionId, null, log,
140+
(err, objectMD) => {
141+
if (err) {
142+
log.warn('error getting object version metadata, proceeding without cleanup', {
143+
error: err,
144+
method: 'abortMultipartUpload.findObjectToCleanup',
145+
});
146+
// On error, continue the abort without an objectMD to clean up.
147+
return next(null, mpuBucket, storedParts, destBucket, null, skipDataDelete);
148+
}
149+
return next(null, mpuBucket, storedParts, destBucket, objectMD, skipDataDelete);
150+
});
133151
});
134152
},
135153
function deleteObjectMetadata(mpuBucket, storedParts, destBucket, objectMD,
@@ -145,9 +163,14 @@ function abortMultipartUpload(authInfo, bucketName, objectKey, uploadId, log,
145163
uploadId,
146164
versionId: objectMD.versionId,
147165
});
148-
return metadata.deleteObjectMD(bucketName, objectKey, {
149-
versionId: objectMD.versionId,
150-
}, log, err => {
166+
167+
const options = preprocessingVersioningDelete(
168+
bucketName, destBucket, objectMD, objectMD.versionId, config.nullVersionCompatMode);
169+
options.replayId = uploadId;
170+
// This is a ghost metadata, without data loss, so skip oplog
171+
options.doesNotNeedOpogUpdate = true;
172+
173+
return metadata.deleteObjectMD(bucketName, objectKey, options, log, err => {
151174
if (err) {
152175
// Handle concurrent deletion of this object metadata
153176
if (err.is?.NoSuchKey) {

0 commit comments

Comments
 (0)