@@ -7,6 +7,8 @@ const metadataUtils = require('../../../metadata/metadataUtils');
77const { validateQuotas } = require ( '../quotas/quotaUtils' ) ;
88const services = require ( '../../../services' ) ;
99const metadata = require ( '../../../metadata/wrapper' ) ;
10+ const { preprocessingVersioningDelete } = require ( './versioning' ) ;
11+ const { config } = require ( '../../../Config' ) ;
1012
1113function 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