Skip to content

Commit 07d6569

Browse files
committed
lifecycle | Versioned object doesn't leave a delete marker
Signed-off-by: naveenpaul1 <napaul@redhat.com>
1 parent 28bf98f commit 07d6569

File tree

5 files changed

+52
-4
lines changed

5 files changed

+52
-4
lines changed

src/api/object_api.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,6 +1140,9 @@ module.exports = {
11401140
filter_delete_markers: {
11411141
type: 'boolean',
11421142
},
1143+
latest_versions: {
1144+
type: 'boolean',
1145+
},
11431146
size_less: {
11441147
type: 'integer'
11451148
},
@@ -1152,6 +1155,9 @@ module.exports = {
11521155
limit: {
11531156
type: 'integer'
11541157
},
1158+
delete_version: {
1159+
type: 'boolean'
1160+
},
11551161
reply_objects: {
11561162
type: 'boolean'
11571163
}

src/server/bg_services/lifecycle.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ async function delete_expired_objects(system, bucket, rule, reply_objects) {
3838
size_greater: rule.filter.object_size_greater_than,
3939
tags: rule.filter.tags,
4040
limit: config.LIFECYCLE_BATCH_SIZE,
41+
filter_delete_markers: true,
42+
latest_versions: true,
43+
// deleting only the latest verion and creating delete marker for expired objects
44+
delete_version: false,
4145
reply_objects,
4246
}, {
4347
auth_token: auth_server.make_auth_token({

src/server/object_services/object_server.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -978,6 +978,7 @@ async function delete_multiple_objects_by_filter(req) {
978978
key,
979979
max_create_time: req.rpc_params.create_time,
980980
tagging: req.rpc_params.tags,
981+
latest_versions: req.rpc_params.latest_versions,
981982
filter_delete_markers: req.rpc_params.filter_delete_markers,
982983
max_size: req.rpc_params.size_less,
983984
min_size: req.rpc_params.size_greater,
@@ -991,7 +992,7 @@ async function delete_multiple_objects_by_filter(req) {
991992
bucket: req.bucket.name,
992993
objects: _.map(objects, obj => ({
993994
key: obj.key,
994-
version_id: MDStore.instance().get_object_version_id(obj),
995+
version_id: req.rpc_params.delete_version ? MDStore.instance().get_object_version_id(obj) : '',
995996
}))
996997
}
997998
}));

src/test/lifecycle/common.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ function days_lifecycle_configuration(Bucket, Key) {
188188
},
189189
};
190190
}
191+
exports.days_lifecycle_configuration = days_lifecycle_configuration;
191192

192193
function tags_lifecycle_configuration(Bucket, Key, Value) {
193194
return {

src/test/unit_tests/test_lifecycle.js

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -535,15 +535,16 @@ mocha.describe('lifecycle', () => {
535535
assert.strictEqual(versions_list.objects.length, 2);
536536
});
537537

538-
async function create_mock_version(version_key, bucket, age, version_count) {
538+
async function create_mock_version(version_key, bucket, age, version_count, expire_all = false) {
539539
const obj_upload_ids = [];
540540
for (let i = 0; i < version_count; ++i) {
541541
const content_type = 'application/octet_stream';
542542
const { obj_id } = await rpc_client.object.create_object_upload({ bucket, key: version_key, content_type });
543543
await rpc_client.object.complete_object_upload({ obj_id, bucket, key: version_key });
544544

545-
// everything but last will be aged
546-
if (i < version_count - 1) {
545+
// everything but last will be aged,
546+
// For simple Expiration rule all version should be expired
547+
if (expire_all || i < version_count - 1) {
547548
obj_upload_ids.push(new mongodb.ObjectId(obj_id));
548549
}
549550
}
@@ -557,6 +558,41 @@ mocha.describe('lifecycle', () => {
557558
console.log('blow_version_objects: update_objects_by_ids', update_result);
558559
}
559560
}
561+
562+
mocha.it('lifecyle - version object expired', async () => {
563+
const age = 30;
564+
const version_count = 10;
565+
const version_bucket_key = 'test-lifecycle-version1';
566+
await create_mock_version(version_bucket_key, version_bucket, age, version_count, true);
567+
const putLifecycleParams = commonTests.days_lifecycle_configuration(version_bucket, version_bucket_key);
568+
await s3.putBucketLifecycleConfiguration(putLifecycleParams);
569+
await lifecycle.background_worker();
570+
// version_count count only, not deleted
571+
await verify_version_deleted(version_count + 1, version_bucket_key);
572+
});
573+
574+
mocha.it('lifecyle - version object not expired', async () => {
575+
const age = 5;
576+
const version_count = 10;
577+
const version_bucket_key = 'test-lifecycle-version2';
578+
await create_mock_version(version_bucket_key, version_bucket, age, version_count, true);
579+
const putLifecycleParams = commonTests.days_lifecycle_configuration(version_bucket, version_bucket_key);
580+
await s3.putBucketLifecycleConfiguration(putLifecycleParams);
581+
await lifecycle.background_worker();
582+
// version_count count plus delete marker
583+
await verify_version_deleted(version_count, version_bucket_key);
584+
});
585+
586+
async function verify_version_deleted(expected_length, key) {
587+
const obj_params = {
588+
bucket: version_bucket,
589+
prefix: key,
590+
};
591+
const list_obj = await rpc_client.object.list_object_versions(obj_params);
592+
console.log('list_objects_admin objects: ', util.inspect(list_obj.objects));
593+
const actual_length = list_obj.objects.length;
594+
assert.strictEqual(actual_length, expected_length, `listObjectResult actual ${actual_length} !== ${expected_length}`);
595+
}
560596
});
561597

562598
function readable_buffer(data, split = 1, finish = 'end') {

0 commit comments

Comments
 (0)