Skip to content
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

[NEW] Retention policy precision defined by a cron job expression #18975

Merged
merged 6 commits into from
Sep 21, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 15 additions & 30 deletions app/retention-policy/server/cronPruneMessages.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { Meteor } from 'meteor/meteor';
import { SyncedCron } from 'meteor/littledata:synced-cron';
import { debounce } from 'underscore';

import { settings } from '../../settings';
import { Rooms, Settings } from '../../models';
import { settings } from '../../settings/server';
import { Rooms } from '../../models/server';
import { cleanRoomHistory } from '../../lib';

let types = [];

const oldest = new Date('0001-01-01T00:00:00Z');


const maxTimes = {
c: 0,
p: 0,
Expand Down Expand Up @@ -56,20 +56,20 @@ function job() {
function getSchedule(precision) {
switch (precision) {
case '0':
return '0 */30 * * * *'; // 30 minutes
return '*/30 * * * *'; // 30 minutes
case '1':
return '0 0 * * * *'; // hour
return '0 * * * *'; // hour
case '2':
return '0 0 */6 * * *'; // 6 hours
return '0 */6 * * *'; // 6 hours
case '3':
return '0 0 0 * * *'; // day
return '0 0 * * *'; // day
}
}

const pruneCronName = 'Prune old messages by retention policy';

function deployCron(precision) {
const schedule = (parser) => parser.cron(getSchedule(precision), true);
const schedule = (parser) => parser.cron(precision);

SyncedCron.remove(pruneCronName);
SyncedCron.add({
Expand All @@ -79,7 +79,7 @@ function deployCron(precision) {
});
}

function reloadPolicy() {
const reloadPolicy = debounce(Meteor.bindEnvironment(function reloadPolicy() {
types = [];

if (!settings.get('RetentionPolicy_Enabled')) {
Expand All @@ -101,30 +101,15 @@ function reloadPolicy() {
maxTimes.p = settings.get('RetentionPolicy_MaxAge_Groups');
maxTimes.d = settings.get('RetentionPolicy_MaxAge_DMs');

return deployCron(settings.get('RetentionPolicy_Precision'));
}

const precision = (settings.get('RetentionPolicy_Advanced_Precision') && settings.get('RetentionPolicy_Advanced_Precision_Cron')) || getSchedule(settings.get('RetentionPolicy_Precision'));

return deployCron(precision);
}), 500);

Meteor.startup(function() {
Meteor.defer(function() {
Settings.find({
_id: {
$in: [
'RetentionPolicy_Enabled',
'RetentionPolicy_Precision',
'RetentionPolicy_AppliesToChannels',
'RetentionPolicy_AppliesToGroups',
'RetentionPolicy_AppliesToDMs',
'RetentionPolicy_MaxAge_Channels',
'RetentionPolicy_MaxAge_Groups',
'RetentionPolicy_MaxAge_DMs',
],
},
}).observe({
changed() {
reloadPolicy();
},
});

settings.get(/^RetentionPolicy_/, reloadPolicy);
reloadPolicy();
});
});
37 changes: 28 additions & 9 deletions app/retention-policy/server/startup/settings.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import { settings } from '../../../settings';

settings.addGroup('RetentionPolicy', function() {
const globalQuery = {
_id: 'RetentionPolicy_Enabled',
value: true,
};

this.add('RetentionPolicy_Enabled', false, {
type: 'boolean',
public: true,
Expand Down Expand Up @@ -28,18 +33,30 @@ settings.addGroup('RetentionPolicy', function() {
public: true,
i18nLabel: 'RetentionPolicy_Precision',
i18nDescription: 'RetentionPolicy_Precision_Description',
enableQuery: {
_id: 'RetentionPolicy_Enabled',
value: true,
},
enableQuery: [globalQuery, {
_id: 'RetentionPolicy_Advanced_Precision',
value: false,
}],
});

this.add('RetentionPolicy_Advanced_Precision', false, {
type: 'boolean',
public: true,
i18nLabel: 'RetentionPolicy_Advanced_Precision',
i18nDescription: 'RetentionPolicy_Advanced_Precision_Description',
enableQuery: globalQuery,
});

this.add('RetentionPolicy_Advanced_Precision_Cron', '*/30 * * * *', {
sampaiodiego marked this conversation as resolved.
Show resolved Hide resolved
type: 'string',
public: true,
i18nLabel: 'RetentionPolicy_Advanced_Precision_Cron',
i18nDescription: 'RetentionPolicy_Advanced_Precision_Cron_Description',
enableQuery: [globalQuery, { _id: 'RetentionPolicy_Advanced_Precision', value: true }],
});

this.section('Global Policy', function() {
const globalQuery = {
_id: 'RetentionPolicy_Enabled',
value: true,
};

this.section('Global Policy', function() {
this.add('RetentionPolicy_AppliesToChannels', false, {
type: 'boolean',
public: true,
Expand Down Expand Up @@ -80,6 +97,7 @@ settings.addGroup('RetentionPolicy', function() {
i18nLabel: 'RetentionPolicy_AppliesToDMs',
enableQuery: globalQuery,
});

this.add('RetentionPolicy_MaxAge_DMs', 30, {
type: 'int',
public: true,
Expand All @@ -97,6 +115,7 @@ settings.addGroup('RetentionPolicy', function() {
i18nLabel: 'RetentionPolicy_DoNotPrunePinned',
enableQuery: globalQuery,
});

this.add('RetentionPolicy_FilesOnly', false, {
type: 'boolean',
public: true,
Expand Down
5 changes: 4 additions & 1 deletion packages/rocketchat-i18n/i18n/en.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -2689,7 +2689,6 @@
"Office_Hours": "Office Hours",
"Office_hours_enabled": "Office Hours Enabled",
"Office_hours_updated": "Office hours updated",
"RetentionPolicy_ExcludePinned": "Exclude pinned messages",
"Offline": "Offline",
"Offline_DM_Email": "Direct Message Email Subject",
"Offline_Email_Subject_Description": "You may use the following placeholders:<br/><ul><li>[Site_Name], [Site_URL], [User] & [Room] for the Application Name, URL, Username & Roomname respectively.<li/></ul>",
Expand Down Expand Up @@ -3013,8 +3012,12 @@
"Retail": "Retail",
"Retention_setting_changed_successfully": "Retention policy setting changed successfully",
"RetentionPolicy": "Retention Policy",
"RetentionPolicy_Advanced_Precision": "Use Advanced Retention Policy configuration",
"RetentionPolicy_Advanced_Precision_Cron": "Use Advanced Retention Policy Cron",
"RetentionPolicy_Advanced_Precision_Cron_Description": "How often the prune timer should run defined by cron job expression. Setting this to a more precise value makes channels with fast retention timers work better, but might cost extra processing power on large communities.",
sampaiodiego marked this conversation as resolved.
Show resolved Hide resolved
"RetentionPolicy_DoNotPruneDiscussion": "Do not prune discussion messages",
"RetentionPolicy_DoNotPruneThreads": "Do not prune Threads",
"RetentionPolicy_ExcludePinned": "Exclude pinned messages",
"RetentionPolicy_RoomWarning": "Messages older than __time__ are automatically pruned here",
"RetentionPolicy_RoomWarning_Unpinned": "Unpinned messages older than __time__ are automatically pruned here",
"RetentionPolicy_RoomWarning_FilesOnly": "Files older than __time__ are automatically pruned here (messages stay intact)",
Expand Down