-
Notifications
You must be signed in to change notification settings - Fork 195
Expand file tree
/
Copy pathsqlite-bree.js
More file actions
142 lines (124 loc) · 3.64 KB
/
sqlite-bree.js
File metadata and controls
142 lines (124 loc) · 3.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/**
* Copyright (c) Forward Email LLC
* SPDX-License-Identifier: BUSL-1.1
*/
// eslint-disable-next-line import/no-unassigned-import
require('#helpers/polyfill-towellformed');
// eslint-disable-next-line import/no-unassigned-import
require('#config/env');
// eslint-disable-next-line import/no-unassigned-import
require('#config/mongoose');
const process = require('node:process');
const Bree = require('bree');
const Graceful = require('@ladjs/graceful');
const mongoose = require('mongoose');
const logger = require('#helpers/logger');
const setupMongoose = require('#helpers/setup-mongoose');
// SQLite Bree job configuration
const sqliteJobs = [
{
//
// this job cleans up any backup artifacts from 4 hr+ ago for 'rekey' and 'backup' sqlite-server cases
// (e.g. the server stopped mid-backup or an error occurred, e.g. ran out of memory)
// and in an attempt to save on disk stoarge, we will run `fs.unlink` on each of these files
// and it also updates the storage size across all aliases found
//
name: 'cleanup-sqlite',
interval: '1h',
timeout: 0
},
{
name: 'cleanup-r2-backups',
timeout: 0,
interval: '1d'
}
];
const bree = new Bree({
logger,
jobs: sqliteJobs
});
// Track job start times for duration calculation
const jobStartTimes = new Map();
// Get job configuration by name
function getJobConfig(name) {
const job = sqliteJobs.find((j) => j.name === name);
return job || { name };
}
// Log job lifecycle events with ignore_hook: false to store in Logs collection
bree.on('worker created', async (name) => {
const startTime = Date.now();
jobStartTimes.set(name, startTime);
const jobConfig = getJobConfig(name);
await logger.info('job:start', {
ignore_hook: false,
job: {
name,
breeInstance: 'sqlite-bree',
startedAt: new Date(startTime).toISOString(),
interval: jobConfig.interval,
cron: jobConfig.cron,
timeout: jobConfig.timeout
}
});
});
bree.on('worker deleted', async (name) => {
const startTime = jobStartTimes.get(name);
const endTime = Date.now();
const duration = startTime ? endTime - startTime : null;
const jobConfig = getJobConfig(name);
// Get worker to check for errors
const worker = bree.workers.get(name);
const hasError = worker && worker.exitCode && worker.exitCode !== 0;
if (hasError) {
await logger.error('job:error', {
ignore_hook: false,
job: {
name,
breeInstance: 'sqlite-bree',
startedAt: startTime ? new Date(startTime).toISOString() : null,
finishedAt: new Date(endTime).toISOString(),
duration,
exitCode: worker.exitCode,
interval: jobConfig.interval,
cron: jobConfig.cron,
timeout: jobConfig.timeout
},
err: {
message: `Job exited with code ${worker.exitCode}`,
code: worker.exitCode
}
});
} else {
await logger.info('job:complete', {
ignore_hook: false,
job: {
name,
breeInstance: 'sqlite-bree',
startedAt: startTime ? new Date(startTime).toISOString() : null,
finishedAt: new Date(endTime).toISOString(),
duration,
exitCode: worker ? worker.exitCode : 0,
interval: jobConfig.interval,
cron: jobConfig.cron,
timeout: jobConfig.timeout
}
});
}
jobStartTimes.delete(name);
});
const graceful = new Graceful({
brees: [bree],
mongooses: [mongoose],
logger
});
graceful.listen();
(async () => {
try {
await bree.start();
await setupMongoose(logger);
} catch (err) {
await logger.fatal(err);
process.exit(1);
}
})();
logger.info('SQLite bree started', { hide_meta: true });