Compare commits

...

1 Commits

4 changed files with 19 additions and 22 deletions

View File

@ -12,6 +12,12 @@ const versionIdUtils = versioning.VersionID;
const nonVersionedObjId =
versionIdUtils.getInfVid(config.replicationGroupId);
let uidCounter = 0;
function generateVersionId() {
// generate a unique number for each member of the nodejs cluster
return versioning.VersionID.generateVersionId(`${process.pid}.${uidCounter++}`, config.replicationGroupId);
}
/** decodeVID - decode the version id
* @param {string} versionId - version ID
* @return {(Error|string|undefined)} - return Invalid Argument if decryption
@ -556,6 +562,7 @@ function overwritingVersioning(objMD, metadataStoreParams) {
}
module.exports = {
generateVersionId,
decodeVersionId,
getVersionIdResHeader,
checkQueryVersionId,

View File

@ -93,19 +93,8 @@ function completeMultipartUpload(authInfo, request, log, callback) {
let oldByteLength = null;
const responseHeaders = {};
let versionId;
const putVersionId = request.headers['x-scal-s3-version-id'];
const isPutVersion = putVersionId || putVersionId === '';
if (putVersionId) {
const decodedVidResult = decodeVID(putVersionId);
if (decodedVidResult instanceof Error) {
log.trace('invalid x-scal-s3-version-id header', {
versionId: putVersionId,
error: decodedVidResult,
});
return process.nextTick(() => callback(decodedVidResult));
}
versionId = decodedVidResult;
if (request.headers['x-scal-s3-version-id']) {
return callback(new Error('x-scal-s3-version-id is not supported in completeMultipartUpload'));
}
const queryContainsVersionId = checkQueryVersionId(request.query);
@ -133,7 +122,6 @@ function completeMultipartUpload(authInfo, request, log, callback) {
// Required permissions for this action
// at the destinationBucket level are same as objectPut
requestType: request.apiMethods || 'completeMultipartUpload',
versionId,
request,
};
standardMetadataValidateBucketAndObj(metadataValParams, request.actionImplicitDenies, log, next);
@ -143,13 +131,6 @@ function completeMultipartUpload(authInfo, request, log, callback) {
oldByteLength = objMD['content-length'];
}
if (isPutVersion) {
const error = validatePutVersionId(objMD, putVersionId, log);
if (error) {
return next(error, destBucket);
}
}
return services.metadataValidateMultipart(metadataValParams,
(err, mpuBucket, mpuOverview, storedMetadata) => {
if (err) {
@ -416,8 +397,9 @@ function completeMultipartUpload(authInfo, request, log, callback) {
extraPartLocations, pseudoCipherBundle,
completeObjData, options, droppedMPUSize, next) {
const dataToDelete = options.dataToDelete;
// take versionId from where initiateMultipartUpload saves it originally
/* eslint-disable no-param-reassign */
metaStoreParams.versionId = options.versionId;
metaStoreParams.versionId = storedMetadata.versionId;
metaStoreParams.versioning = options.versioning;
metaStoreParams.isNull = options.isNull;
metaStoreParams.deleteNullKey = options.deleteNullKey;

View File

@ -22,6 +22,7 @@ const { validateHeaders, compareObjectLockInformation } =
require('./apiUtils/object/objectLockHelpers');
const { getObjectSSEConfiguration } = require('./apiUtils/bucket/bucketEncryption');
const { setExpirationHeaders } = require('./apiUtils/object/expirationHeaders');
const { generateVersionId } = require('./apiUtils/object/versioning');
/*
Sample xml response:
@ -163,6 +164,11 @@ function initiateMultipartUpload(authInfo, request, log, callback) {
if (MPUbucket.getMdBucketModelVersion() < 2) {
metadataStoreParams.splitter = constants.oldSplitter;
}
// Generate version id before creating multipart upload so uploadPart
// can store data with a reference to the correct object version
const vcfg = destinationBucket.getVersioningConfiguration();
const isVersionedObj = vcfg && vcfg.Status === 'Enabled';
metadataStoreParams.versionId = isVersionedObj ? generateVersionId() : '';
return services.metadataStoreMPObject(MPUbucket.getName(),
cipherBundle, metadataStoreParams,
log, (err, mpuMD) => {

View File

@ -175,6 +175,7 @@ const services = {
options.versioning = versioning;
}
if (versionId || versionId === '') {
// FIXME Move to md.versionId
options.versionId = versionId;
}
if (needOplogUpdate) {
@ -471,6 +472,7 @@ const services = {
};
multipartObjectMD.key = params.objectKey;
multipartObjectMD.uploadId = params.uploadId;
multipartObjectMD.versionId = params.versionId;
multipartObjectMD['cache-control'] = params.headers['cache-control'];
multipartObjectMD['content-disposition'] =
params.headers['content-disposition'];