Skip to content

Commit

Permalink
Force WAL checkpoints if necessary
Browse files Browse the repository at this point in the history
  • Loading branch information
SimplyBoo6 committed Apr 30, 2024
1 parent db0e568 commit bf3f22a
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 4 deletions.
9 changes: 9 additions & 0 deletions server/src/database/sqlite/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,24 @@ export class SqliteController {
private queue: QueueItem[] = [];
private workers: WorkerWrapper[] = [];
private filename: string;
private interval: NodeJS.Timeout;

public constructor(filename: string) {
this.filename = filename;
for (let i = 0; i < OS.cpus().length; i++) {
this.spawnWorker();
}

this.interval = setInterval(() => {
const wrapper = this.workers[0];
if (wrapper) {
wrapper.worker.postMessage({ type: 'flush' });
}
}, 30000);
}

public close(): void {
clearInterval(this.interval);
for (const wrapper of this.workers) {
wrapper.worker.postMessage({ type: 'exit' });
}
Expand Down
23 changes: 19 additions & 4 deletions server/src/database/sqlite/worker.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import FS from 'fs';
import { parentPort, workerData } from 'worker_threads';
import Sqlite from 'better-sqlite3';

Expand Down Expand Up @@ -58,7 +59,7 @@ function runRequest(request: SqliteWorkerRequest): SqliteWorkerResult {
}
}

parentPort.on('message', (request: SqliteWorkerRequest[] | SqliteWorkerRequest | { type: 'exit' }) => {
parentPort.on('message', (request: SqliteWorkerRequest[] | SqliteWorkerRequest | { type: 'exit' | 'flush' }) => {
try {
if (Array.isArray(request)) {
const results: SqliteWorkerResult[] = [];
Expand All @@ -69,10 +70,24 @@ parentPort.on('message', (request: SqliteWorkerRequest[] | SqliteWorkerRequest |
})();
postResult(results);
} else {
if (request.type === 'exit') {
process.exit(0);
switch (request.type) {
case 'exit':
process.exit(0);
break;
case 'flush':
// Attempt to flush the WAL cache forcefully if the size is too big.
FS.stat(filename, (err, stat) => {
if (err) {
console.error(err);
} else if (stat.size > 10 * 1024 * 1024) {
db.pragma('wal_checkpoint(RESTART)');
}
});
break;
default:
postResult([runRequest(request)]);
break;
}
postResult([runRequest(request)]);
}
} catch (err) {
if (err instanceof Error) {
Expand Down

0 comments on commit bf3f22a

Please sign in to comment.