Skip to content

Added x-amz-expiration missing HTTP header in the response of object operations #8958

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
1 change: 1 addition & 0 deletions src/endpoint/s3/ops/s3_get_object.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ async function get_object(req, res) {
}
}
http_utils.set_response_headers_from_request(req, res);
if (!version_id) await http_utils.set_expiration_header(req, res, object_md); // setting expiration header for bucket lifecycle
const obj_size = object_md.size;
const params = {
object_md,
Expand Down
1 change: 1 addition & 0 deletions src/endpoint/s3/ops/s3_head_object.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ async function head_object(req, res) {
s3_utils.set_response_object_md(res, object_md);
s3_utils.set_encryption_response_headers(req, res, object_md.encryption);
http_utils.set_response_headers_from_request(req, res);
if (!params.version_id) await http_utils.set_expiration_header(req, res, object_md); // setting expiration header for bucket lifecycle
}

module.exports = {
Expand Down
8 changes: 8 additions & 0 deletions src/endpoint/s3/ops/s3_put_object.js
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,14 @@ async function put_object(req, res) {
}
res.setHeader('ETag', `"${reply.etag}"`);

const object_info = {
key: req.params.key,
create_time: new Date().getTime(),
size: size,
tagging: tagging,
};
await http_utils.set_expiration_header(req, res, object_info); // setting expiration header for bucket lifecycle

if (reply.seq) {
res.seq = reply.seq;
delete reply.seq;
Expand Down
65 changes: 5 additions & 60 deletions src/manage_nsfs/nc_lifecycle.js
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ class NCLifecycle {

if (candidates.delete_candidates?.length > 0) {
const expiration = lifecycle_rule.expiration ? this._get_expiration_time(lifecycle_rule.expiration) : 0;
const filter_func = this._build_lifecycle_filter({filter: lifecycle_rule.filter, expiration});
const filter_func = lifecycle_utils.build_lifecycle_filter({filter: lifecycle_rule.filter, expiration});
dbg.log0('process_rule: calling delete_multiple_objects, num of objects to be deleted', candidates.delete_candidates.length);
const delete_res = await this._call_op_and_update_status({
bucket_name,
Expand Down Expand Up @@ -478,7 +478,7 @@ class NCLifecycle {
if (rule_state.is_finished) return [];
const expiration = this._get_expiration_time(lifecycle_rule.expiration);
if (expiration < 0) return [];
const filter_func = this._build_lifecycle_filter({filter: lifecycle_rule.filter, expiration});
const filter_func = lifecycle_utils.build_lifecycle_filter({filter: lifecycle_rule.filter, expiration});

const filtered_objects = [];
// TODO list_objects does not accept a filter and works in batch sizes of 1000. should handle batching
Expand Down Expand Up @@ -537,7 +537,7 @@ class NCLifecycle {
const versions_list = params.versions_list;
const candidates = [];
const expiration = lifecycle_rule.expiration?.days ? this._get_expiration_time(lifecycle_rule.expiration) : 0;
const filter_func = this._build_lifecycle_filter({filter: lifecycle_rule.filter, expiration});
const filter_func = lifecycle_utils.build_lifecycle_filter({filter: lifecycle_rule.filter, expiration});
for (let i = 0; i < versions_list.objects.length - 1; i++) {
if (this.filter_expired_delete_marker(versions_list.objects[i], versions_list.objects[i + 1], filter_func)) {
candidates.push(versions_list.objects[i]);
Expand Down Expand Up @@ -640,7 +640,7 @@ class NCLifecycle {
}
const versions_list = params.versions_list;

const filter_func = this._build_lifecycle_filter({filter: lifecycle_rule.filter, expiration: 0});
const filter_func = lifecycle_utils.build_lifecycle_filter({filter: lifecycle_rule.filter, expiration: 0});
const num_newer_versions = lifecycle_rule.noncurrent_version_expiration.newer_noncurrent_versions;
const num_non_current_days = lifecycle_rule.noncurrent_version_expiration.noncurrent_days;
const delete_candidates = [];
Expand Down Expand Up @@ -674,7 +674,7 @@ class NCLifecycle {
const expiration = lifecycle_rule.abort_incomplete_multipart_upload.days_after_initiation;
const res = [];

const filter_func = this._build_lifecycle_filter({filter, expiration});
const filter_func = lifecycle_utils.build_lifecycle_filter({filter, expiration});
let dir_handle;
//TODO this is almost identical to list_uploads except for error handling and support for pagination. should modify list-upload and use it in here instead
try {
Expand Down Expand Up @@ -720,29 +720,6 @@ class NCLifecycle {
///////// FILTER HELPERS ////////
////////////////////////////////////

/**
* @typedef {{
* filter: Object
* expiration: Number
* }} filter_params
*
* @param {filter_params} params
* @returns
*/
_build_lifecycle_filter(params) {
/**
* @param {Object} object_info
*/
return function(object_info) {
if (params.filter?.prefix && !object_info.key.startsWith(params.filter.prefix)) return false;
if (params.expiration && object_info.age < params.expiration) return false;
if (params.filter?.tags && !_file_contain_tags(object_info, params.filter.tags)) return false;
if (params.filter?.object_size_greater_than && object_info.size < params.filter.object_size_greater_than) return false;
if (params.filter?.object_size_less_than && object_info.size > params.filter.object_size_less_than) return false;
return true;
};
}

/**
* get the expiration time in days of an object
* if rule is set with date, then rule is applied for all objects after that date
Expand Down Expand Up @@ -1468,38 +1445,6 @@ class NCLifecycle {
}
}

//////////////////
// TAGS HELPERS //
//////////////////

/**
* checks if tag query_tag is in the list tag_set
* @param {Object} query_tag
* @param {Array<Object>} tag_set
*/
function _list_contain_tag(query_tag, tag_set) {
for (const t of tag_set) {
if (t.key === query_tag.key && t.value === query_tag.value) return true;
}
return false;
}

/**
* checks if object has all the tags in filter_tags
* @param {Object} object_info
* @param {Array<Object>} filter_tags
* @returns
*/
function _file_contain_tags(object_info, filter_tags) {
if (object_info.tags === undefined) return false;
for (const tag of filter_tags) {
if (!_list_contain_tag(tag, object_info.tags)) {
return false;
}
}
return true;
}

// EXPORTS
exports.NCLifecycle = NCLifecycle;
exports.ILM_POLICIES_TMP_DIR = ILM_POLICIES_TMP_DIR;
Expand Down
Loading