Skip to content

Commit ce5cd58

Browse files
jackyalbodannyzaken
authored andcommitted
[DB-Cleaner] fixing find_deleted_objects to hit index
Signed-off-by: jackyalbo <jacky.albo@gmail.com> (cherry picked from commit a0cc040)
1 parent e256a58 commit ce5cd58

File tree

2 files changed

+42
-20
lines changed

2 files changed

+42
-20
lines changed

src/server/object_services/md_store.js

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -720,7 +720,7 @@ class MDStore {
720720
limit,
721721
return_results = false,
722722
}) {
723-
const params = [new Date()];
723+
const params = [new Date().toISOString()];
724724
const sql_conditions = [];
725725
if (key) {
726726
params.push(key.source);
@@ -1110,20 +1110,21 @@ class MDStore {
11101110
return buckets;
11111111
}
11121112

1113+
/**
1114+
* Find deleted objects that were deleted before max_delete_time and are reclaimed.
1115+
*
1116+
* @param {number} max_delete_time - timestamp in milliseconds
1117+
* @param {number} limit
1118+
* @returns {Promise<nb.ID[]>}
1119+
*/
11131120
async find_deleted_objects(max_delete_time, limit) {
1114-
const objects = await this._objects.find({
1115-
deleted: {
1116-
$lt: new Date(max_delete_time),
1117-
$exists: true // This forces the index to be used
1118-
},
1119-
}, {
1120-
limit: Math.min(limit, 1000),
1121-
projection: {
1122-
_id: 1,
1123-
deleted: 1
1124-
}
1125-
});
1126-
return db_client.instance().uniq_ids(objects, '_id');
1121+
const query_limit = limit || 1000;
1122+
const query = `SELECT _id
1123+
FROM ${this._objects.name}
1124+
WHERE (to_ts(data->>'deleted')<to_ts($1) and data ? 'deleted' and data ? 'reclaimed')
1125+
LIMIT ${query_limit};`;
1126+
const result = await this._objects.executeSQL(query, [new Date(max_delete_time).toISOString()]);
1127+
return db_client.instance().uniq_ids(result.rows, '_id');
11271128
}
11281129

11291130
async db_delete_objects(object_ids) {

src/test/integration_tests/db/test_md_store.js

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/* Copyright (C) 2016 NooBaa */
2+
/* eslint max-lines-per-function: ["error", 2000]*/
23
'use strict';
34

45
// setup coretest first to prepare the env
@@ -50,23 +51,22 @@ mocha.describe('md_store', function() {
5051
assert_equal(res.obj.num_parts, 88);
5152
});
5253

53-
const date_now = Date.now();
54-
const now = new Date(date_now);
54+
const now = new Date();
5555
const info1 = {
5656
_id: md_store.make_md_id(),
5757
system: system_id,
5858
bucket: bucket_id,
59-
key: 'lala_1' + date_now.toString(36),
59+
key: 'lala_1' + now.getTime().toString(36),
6060
create_time: now,
61-
content_type: 'lulu_' + date_now.toString(36),
61+
content_type: 'lulu_' + now.getTime().toString(36),
6262
};
6363
const info2 = {
6464
_id: md_store.make_md_id(),
6565
system: system_id,
6666
bucket: bucket_id,
67-
key: 'lala_2' + date_now.toString(36),
67+
key: 'lala_2' + now.getTime().toString(36),
6868
create_time: now,
69-
content_type: 'lulu_' + date_now.toString(36),
69+
content_type: 'lulu_' + now.getTime().toString(36),
7070
};
7171
const max_create_time = now.getTime() / 1000 - 60; // 1 minute ago
7272

@@ -197,6 +197,27 @@ mocha.describe('md_store', function() {
197197
return md_store.aggregate_objects_by_delete_dates(from_time, till_time);
198198
});
199199

200+
mocha.it('find_deleted_objects returns deleted and reclaimed objects', async function() {
201+
if (config.DB_TYPE !== 'postgres') this.skip(); // eslint-disable-line no-invalid-this
202+
for (let i = 0; i < 50; i++) { // create 50 objects
203+
info1._id = md_store.make_md_id();
204+
info1.key = `lala_${i}_${now.getTime().toString(36)}`;
205+
await md_store.insert_object(info1);
206+
}
207+
// mark all 50 objects as deleted
208+
const deleted_objects = await md_store.delete_objects_by_query({
209+
key: /^lala_/,
210+
bucket_id: bucket_id,
211+
limit: 50,
212+
return_results: true,
213+
});
214+
// mark all 50 deleted objects as reclaimed
215+
await md_store.update_objects_by_ids(deleted_objects.map(obj => obj._id), { reclaimed: new Date() });
216+
// find 25 objects that are deleted and reclaimed
217+
const objects = await md_store.find_deleted_objects(now.getTime() + 60 * 1000, 25);
218+
assert_equal(objects.length, 25);
219+
});
220+
200221
});
201222

202223

0 commit comments

Comments
 (0)