Skip to content

Commit c013518

Browse files
committed
lifecycle improvement for not-versionning buckets
Signed-off-by: jackyalbo <[email protected]>
1 parent 2d538bf commit c013518

File tree

4 files changed

+281
-123
lines changed

4 files changed

+281
-123
lines changed

src/server/object_services/md_store.js

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,7 @@ class MDStore {
631631
* @property {1|-1} [order]
632632
* @property {boolean} [pagination]
633633
*
634-
* @returns {nb.ObjectMD[]}
634+
* @returns {Promise<nb.ObjectMD[]>}
635635
*/
636636
async find_objects({
637637
bucket_id,
@@ -695,6 +695,80 @@ class MDStore {
695695
});
696696
}
697697

698+
/**
699+
* TODO add support for versioning or add another function to support versioning.
700+
* @typedef {Object} DeleteObjectsParams
701+
* @property {nb.ID} bucket_id
702+
* @property {RegExp} key
703+
* @property {number} [max_create_time]
704+
* @property {number} [max_size]
705+
* @property {number} [min_size]
706+
* @property {Array<{ key: string; value: string; }>} [tagging]
707+
* @property {number} [limit]
708+
* @property {boolean} [return_results]
709+
*
710+
* @param {DeleteObjectsParams} params
711+
* @returns {Promise<nb.ObjectMD[]>}
712+
*/
713+
async delete_objects_by_query({
714+
bucket_id,
715+
key,
716+
max_create_time,
717+
max_size,
718+
min_size,
719+
tagging,
720+
limit,
721+
return_results = false,
722+
}) {
723+
const params = [new Date()];
724+
const sql_conditions = [];
725+
if (key) {
726+
params.push(key.source);
727+
sql_conditions.push(`data->>'key' ~ $${params.length}`);
728+
}
729+
if (max_size !== undefined) {
730+
params.push(max_size);
731+
sql_conditions.push(`(data->>'size')::BIGINT < $${params.length}`);
732+
}
733+
if (min_size !== undefined) {
734+
params.push(min_size);
735+
sql_conditions.push(`(data->>'size')::BIGINT > $${params.length}`);
736+
}
737+
if (tagging && tagging.length) {
738+
params.push(JSON.stringify(tagging));
739+
sql_conditions.push(`(data->>'tagging')::jsonb @> $${params.length}::jsonb`);
740+
}
741+
if (max_create_time) {
742+
params.push(new Date(moment.unix(max_create_time).toISOString()).toISOString());
743+
sql_conditions.push(`data->>'create_time' < $${params.length}`);
744+
}
745+
746+
const sql_limit = limit === undefined ? "" : `LIMIT ${limit}`;
747+
748+
let query = `
749+
WITH rows AS (
750+
SELECT _id
751+
FROM ${this._objects.name}
752+
WHERE
753+
${sql_and_conditions(
754+
`data->>'bucket' = '${bucket_id}'`,
755+
...sql_conditions,
756+
`data->'deleted' IS NULL`,
757+
`data->'upload_started' IS NULL`,
758+
`data->'version_enabled' IS NULL`,
759+
)}
760+
${sql_limit}
761+
)
762+
UPDATE ${this._objects.name}
763+
SET data = jsonb_set(data, '{deleted}', to_jsonb($1::text), true)
764+
WHERE _id IN (
765+
SELECT rows._id FROM rows
766+
)`;
767+
query += return_results ? ' RETURNING *;' : ';';
768+
const result = await this._objects.executeSQL(query, params);
769+
return return_results ? result.rows : [];
770+
}
771+
698772
async find_unreclaimed_objects(limit) {
699773
const results = await this._objects.find({
700774
deleted: { $exists: true },

src/server/object_services/object_server.js

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -971,7 +971,7 @@ async function delete_multiple_objects_by_filter(req) {
971971
const key = new RegExp('^' + _.escapeRegExp(req.rpc_params.prefix));
972972
const bucket_id = req.bucket._id;
973973
const reply_objects = req.rpc_params.reply_objects;
974-
// TODO: change it to perform changes in batch. Won't scale.
974+
975975
const query = {
976976
bucket_id,
977977
key,
@@ -983,18 +983,26 @@ async function delete_multiple_objects_by_filter(req) {
983983
min_size: req.rpc_params.size_greater,
984984
limit: req.rpc_params.limit,
985985
};
986-
987-
const objects = await MDStore.instance().find_objects(query);
988-
989-
const delete_results = await delete_multiple_objects(_.assign(req, {
990-
rpc_params: {
991-
bucket: req.bucket.name,
992-
objects: _.map(objects, obj => ({
993-
key: obj.key,
994-
version_id: req.rpc_params.delete_version ? MDStore.instance().get_object_version_id(obj) : '',
995-
}))
996-
}
997-
}));
986+
let delete_results;
987+
let objects;
988+
// TODO: Add support to delete_objects_by_query also for versioning or add another function to support versioning.
989+
if (req.bucket.versioning === 'DISABLED' && config.DB_TYPE !== 'mongodb') /* only for postgres */ {
990+
query.return_results = true; // we want to return the objects that were deleted
991+
objects = await MDStore.instance().delete_objects_by_query(query);
992+
} else {
993+
// TODO: change it to perform changes in batch. Won't scale
994+
objects = await MDStore.instance().find_objects(query);
995+
996+
delete_results = await delete_multiple_objects(_.assign(req, {
997+
rpc_params: {
998+
bucket: req.bucket.name,
999+
objects: _.map(objects, obj => ({
1000+
key: obj.key,
1001+
version_id: req.rpc_params.delete_version ? MDStore.instance().get_object_version_id(obj) : '',
1002+
}))
1003+
}
1004+
}));
1005+
}
9981006

9991007
const reply = { num_objects_deleted: objects.length };
10001008
if (reply_objects) {
@@ -1004,7 +1012,7 @@ async function delete_multiple_objects_by_filter(req) {
10041012
//or incude the error if deletion failed
10051013
reply.deleted_objects = [];
10061014
for (let i = 0; i < objects.length; ++i) {
1007-
if (delete_results[i].err_code) {
1015+
if (delete_results && delete_results[i].err_code) {
10081016
reply.deleted_objects[i] = {
10091017
err_code: delete_results[i].err_code,
10101018
err_message: delete_results[i].err_message

0 commit comments

Comments
 (0)