Skip to content

Commit 0a1b5f0

Browse files
Rework log level, and simplify cleanup checks
- Also, some test implementation was improved to reduce duplication. Issue: CLDSRV-669
1 parent 27ec6b3 commit 0a1b5f0

File tree

3 files changed

+45
-69
lines changed

3 files changed

+45
-69
lines changed

lib/api/apiUtils/object/abortMultipartUpload.js

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,10 @@ function abortMultipartUpload(authInfo, bucketName, objectKey, uploadId, log,
7878
}
7979
// for Azure and GCP we do not need to delete data
8080
// for all other backends, skipDataDelete will be set to false
81-
return next(null, mpuBucket, mpuOverviewObj, destBucket, objectMD, skipDataDelete);
81+
return next(null, mpuBucket, destBucket, objectMD, skipDataDelete);
8282
});
8383
},
84-
function getPartLocations(mpuBucket, mpuOverviewObj, destBucket, objectMD, skipDataDelete,
84+
function getPartLocations(mpuBucket, destBucket, objectMD, skipDataDelete,
8585
next) {
8686
services.getMPUparts(mpuBucket.getName(), uploadId, log,
8787
(err, result) => {
@@ -90,7 +90,7 @@ function abortMultipartUpload(authInfo, bucketName, objectKey, uploadId, log,
9090
return next(err, destBucket);
9191
}
9292
const storedParts = result.Contents;
93-
return next(null, mpuBucket, mpuOverviewObj, storedParts, destBucket, objectMD,
93+
return next(null, mpuBucket, storedParts, destBucket, objectMD,
9494
skipDataDelete);
9595
});
9696
},
@@ -103,13 +103,8 @@ function abortMultipartUpload(authInfo, bucketName, objectKey, uploadId, log,
103103
// to honor the uploadId filter in standardMetadataValidateBucketAndObj
104104
// ensuring the objMD returned has the right uploadId. But this is not
105105
// supported by Metadata.
106-
function ensureCleanupIsRequired(mpuBucket, mpuOverviewObj, storedParts, destBucket,
106+
function ensureCleanupIsRequired(mpuBucket, storedParts, destBucket,
107107
objectMD, skipDataDelete, next) {
108-
// If no overview object, skip - this wasn't a failed completeMPU
109-
if (!mpuOverviewObj) {
110-
return next(null, mpuBucket, storedParts, destBucket, null, skipDataDelete);
111-
}
112-
113108
// If objectMD exists and has matching uploadId, use it directly
114109
// This handles all non-versioned cases, and some versioned cases.
115110
if (objectMD && objectMD.uploadId === uploadId) {
@@ -235,7 +230,7 @@ function abortMultipartUpload(authInfo, bucketName, objectKey, uploadId, log,
235230
return async.eachLimit(locations, 5, (loc, cb) => {
236231
data.delete(loc, log, err => {
237232
if (err) {
238-
log.fatal('delete ObjectPart failed', { err });
233+
log.warn('delete ObjectPart failed', { err });
239234
}
240235
cb();
241236
});

tests/functional/aws-node-sdk/test/object/abortMPU.js

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ describe('Abort MPU', () => {
2626
s3 = bucketUtil.s3;
2727
return s3.createBucket({ Bucket: bucket }).promise()
2828
.then(() => s3.createMultipartUpload({
29-
Bucket: bucket, Key: key
29+
Bucket: bucket,
30+
Key: key,
3031
}).promise())
3132
.then(res => {
3233
uploadId = res.UploadId;
@@ -322,28 +323,25 @@ describe('Abort MPU - Versioned Bucket Cleanup', function testSuite() {
322323
Key: upload.Key,
323324
UploadId: upload.UploadId,
324325
}).promise().catch(err => {
325-
if (err.code !== 'NoSuchUpload') throw err;
326-
})
326+
if (err.code !== 'NoSuchUpload') {
327+
throw err;
328+
}
329+
}),
327330
));
328331

329332
// Clean up all object versions
330333
const listVersionsResponse = await s3.listObjectVersions({ Bucket: bucketName }).promise();
331-
await Promise.all([
332-
...listVersionsResponse.Versions.map(version =>
333-
s3.deleteObject({
334-
Bucket: bucketName,
335-
Key: version.Key,
336-
VersionId: version.VersionId,
337-
}).promise()
338-
),
339-
...listVersionsResponse.DeleteMarkers.map(marker =>
340-
s3.deleteObject({
341-
Bucket: bucketName,
342-
Key: marker.Key,
343-
VersionId: marker.VersionId,
344-
}).promise()
345-
),
346-
]);
334+
const allObjects = [
335+
...listVersionsResponse.Versions,
336+
...listVersionsResponse.DeleteMarkers,
337+
];
338+
await Promise.all(allObjects.map(obj =>
339+
s3.deleteObject({
340+
Bucket: bucketName,
341+
Key: obj.Key,
342+
VersionId: obj.VersionId,
343+
}).promise()
344+
));
347345

348346
await bucketUtil.deleteOne(bucketName);
349347
});

tests/unit/api/apiUtils/object/abortMultipartUpload.spec.js

Lines changed: 23 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const assert = require('assert');
22
const sinon = require('sinon');
33
const { parseString } = require('xml2js');
44
const { errors } = require('arsenal');
5+
const async = require('async');
56
const crypto = require('crypto');
67

78
const abortMultipartUpload = require('../../../../../lib/api/apiUtils/object/abortMultipartUpload');
@@ -75,48 +76,24 @@ describe('abortMultipartUpload', () => {
7576

7677
// Helper to create bucket and MPU, returns uploadId
7778
function createBucketAndMPU(versioned, callback) {
79+
const tasks = [
80+
next => bucketPut(authInfo, bucketRequest, log, err => next(err)),
81+
];
82+
7883
if (versioned) {
79-
bucketPut(authInfo, bucketRequest, log, err => {
80-
if (err) {
81-
return callback(err);
82-
}
83-
return bucketPutVersioning(authInfo, enableVersioningRequest, log, err => {
84-
if (err) {
85-
return callback(err);
86-
}
87-
return initiateMultipartUpload(authInfo, initiateRequest, log, (err, result) => {
88-
if (err) {
89-
return callback(err);
90-
}
91-
return parseString(result, (err, json) => {
92-
if (err) {
93-
return callback(err);
94-
}
95-
const uploadId = json.InitiateMultipartUploadResult.UploadId[0];
96-
return callback(null, uploadId);
97-
});
98-
});
99-
});
100-
});
101-
} else {
102-
bucketPut(authInfo, bucketRequest, log, err => {
103-
if (err) {
104-
return callback(err);
105-
}
106-
return initiateMultipartUpload(authInfo, initiateRequest, log, (err, result) => {
107-
if (err) {
108-
return callback(err);
109-
}
110-
return parseString(result, (err, json) => {
111-
if (err) {
112-
return callback(err);
113-
}
114-
const uploadId = json.InitiateMultipartUploadResult.UploadId[0];
115-
return callback(null, uploadId);
116-
});
117-
});
118-
});
84+
tasks.push(next => bucketPutVersioning(authInfo, enableVersioningRequest, log, err => next(err)));
11985
}
86+
87+
tasks.push(
88+
next => initiateMultipartUpload(authInfo, initiateRequest, log, (err, result) => next(err, result)),
89+
(result, next) => parseString(result, (err, json) => next(err, json)),
90+
(json, next) => {
91+
const uploadId = json.InitiateMultipartUploadResult.UploadId[0];
92+
next(null, uploadId);
93+
}
94+
);
95+
96+
async.waterfall(tasks, callback);
12097
}
12198

12299
describe('basic functionality', () => {
@@ -202,6 +179,12 @@ describe('abortMultipartUpload', () => {
202179
assert.strictEqual(err, null);
203180
sinon.assert.calledOnce(dataAbortMPUStub);
204181
sinon.assert.called(dataDeleteStub); // Should delete part data
182+
// ensure the right part was deleted - data.delete is called with location object
183+
const firstCall = dataDeleteStub.getCalls()[0];
184+
const locationArg = firstCall.args[0];
185+
assert(typeof locationArg === 'object', 'First argument should be location object');
186+
assert(locationArg.dataStoreName, 'Location should have dataStoreName');
187+
assert(locationArg.key, 'Location should have key');
205188
done();
206189
}, abortRequest);
207190
});

0 commit comments

Comments
 (0)