reddit plugin configuration from file, not from options now. Scheduling, refactoring of sync mutex

This commit is contained in:
azivner 2018-01-13 22:51:39 -05:00
parent fbfaff6ab8
commit 9839ea019e
5 changed files with 63 additions and 49 deletions

View file

@ -7,7 +7,8 @@ const log = require('../services/log');
const utils = require('../services/utils');
const unescape = require('unescape');
const attributes = require('../services/attributes');
const options = require('../services/options');
const sync_mutex = require('../services/sync_mutex');
const config = require('../services/config');
const REDDIT_ROOT = 'reddit_root';
@ -106,7 +107,7 @@ async function getDateNoteIdForReddit(dateTimeStr, rootNoteId) {
return redditDateNoteId;
}
async function importReddit(accountName, afterId = null) {
async function importComments(accountName, afterId = null) {
let rootNoteId = await sql.getFirstValue(`SELECT notes.note_id FROM notes JOIN attributes USING(note_id)
WHERE attributes.name = '${REDDIT_ROOT}' AND notes.is_deleted = 0`);
@ -173,38 +174,47 @@ async function importReddit(accountName, afterId = null) {
if (listing.data.after && importedComments > 0) {
log.info("Reddit: Importing from next page of comments ...");
importedComments += await importReddit(accountName, listing.data.after);
importedComments += await importComments(accountName, listing.data.after);
}
return importedComments;
}
let redditAccounts = [];
async function runImport() {
// technically mutex shouldn't be necessary but we want to avoid doing potentially expensive import
// concurrently with sync
await sync_mutex.doExclusively(async () => {
let importedComments = 0;
for (const account of redditAccounts) {
log.info("Reddit: Importing account " + account);
importedComments += await importComments(account);
}
log.info(`Reddit: Imported ${importedComments} comments.`);
});
}
sql.dbReady.then(async () => {
const enabledOption = await options.getOptionOrNull("reddit_enabled");
const accountsOption = await options.getOptionOrNull("reddit_accounts");
console.log(config);
if (!enabledOption) {
await options.createOption("reddit_enabled", "false", true);
await options.createOption("reddit_accounts", "[]", true);
if (!config['Reddit'] || !config['Reddit']['enabled'] !== true) {
return;
}
if (enabledOption.opt_value !== "true") {
return;
}
const redditAccountsStr = config['Reddit']['accounts'];
if (!accountsOption) {
if (!redditAccountsStr) {
log.info("Reddit: No reddit accounts defined in option 'reddit_accounts'");
}
const redditAccounts = JSON.parse(accountsOption.opt_value);
let importedComments = 0;
redditAccounts = redditAccountsStr.split(",").map(s => s.trim());
for (const account of redditAccounts) {
log.info("Reddit: Importing account " + account);
const pollingIntervalInSeconds = config['Reddit']['pollingIntervalInSeconds'] || 3600;
importedComments += await importReddit(account);
}
log.info(`Reddit: Imported ${importedComments} comments.`);
setInterval(runImport, pollingIntervalInSeconds * 1000);
setTimeout(runImport, 1000);
});

View file

@ -23,9 +23,8 @@ async function regularBackup() {
async function backupNow() {
// we don't want to backup DB in the middle of sync with potentially inconsistent DB state
const releaseMutex = await sync_mutex.acquire();
try {
await sync_mutex.doExclusively(async () => {
const now = utils.nowDate();
const backupFile = dataDir.BACKUP_DIR + "/" + "backup-" + utils.getDateTimeForFile() + ".db";
@ -37,10 +36,7 @@ async function backupNow() {
await sql.doInTransaction(async () => {
await options.setOption('last_backup_date', now);
});
}
finally {
releaseMutex();
}
});
}
async function cleanupOldBackups() {

View file

@ -217,18 +217,14 @@ async function runAllChecks() {
async function runChecks() {
let errorList;
let elapsedTimeMs;
const releaseMutex = await sync_mutex.acquire();
try {
await sync_mutex.doExclusively(async () => {
const startTime = new Date();
errorList = await runAllChecks();
elapsedTimeMs = new Date().getTime() - startTime.getTime();
}
finally {
releaseMutex();
}
});
if (errorList.length > 0) {
log.info(`Consistency checks failed (took ${elapsedTimeMs}ms) with these errors: ` + JSON.stringify(errorList));

View file

@ -20,25 +20,25 @@ let proxyToggle = true;
let syncServerCertificate = null;
async function sync() {
const releaseMutex = await sync_mutex.acquire();
try {
if (!await sql.isDbUpToDate()) {
return {
success: false,
message: "DB not up to date"
};
}
await sync_mutex.doExclusively(async () => {
if (!await sql.isDbUpToDate()) {
return {
success: false,
message: "DB not up to date"
};
}
const syncContext = await login();
const syncContext = await login();
await pushSync(syncContext);
await pushSync(syncContext);
await pullSync(syncContext);
await pullSync(syncContext);
await pushSync(syncContext);
await pushSync(syncContext);
await checkContentHash(syncContext);
await checkContentHash(syncContext);
});
return {
success: true
@ -64,9 +64,6 @@ async function sync() {
}
}
}
finally {
releaseMutex();
}
}
async function login() {

View file

@ -4,5 +4,20 @@
*/
const Mutex = require('async-mutex').Mutex;
const instance = new Mutex();
module.exports = new Mutex();
async function doExclusively(func) {
const releaseMutex = await instance.acquire();
try {
await func();
}
finally {
releaseMutex();
}
}
module.exports = {
doExclusively
};