Небольшие доработки remoteSent, оптимизация отправки файлов

This commit is contained in:
Book Pauk
2022-07-17 21:10:52 +07:00
parent e65a8a13ea
commit 4fd9d579e0
5 changed files with 72 additions and 14 deletions

View File

@@ -7,6 +7,8 @@ const FileDownloader = require('../FileDownloader');
const FileDecompressor = require('../FileDecompressor');
const BookConverter = require('./BookConverter');
const RemoteStorage = require('../RemoteStorage');
const JembaConnManager = require('../../db/JembaConnManager');//singleton
const ayncExit = new (require('../AsyncExit'))();
const utils = require('../utils');
const log = new (require('../AppLogger'))().log;//singleton
@@ -33,6 +35,9 @@ class ReaderWorker {
this.decomp = new FileDecompressor(3*config.maxUploadFileSize);
this.bookConverter = new BookConverter(this.config);
this.connManager = new JembaConnManager();
this.appDb = this.connManager.db['app'];
this.remoteStorage = false;
if (config.remoteStorage) {
this.remoteStorage = new RemoteStorage(
@@ -248,12 +253,7 @@ class ReaderWorker {
}
async cleanDir(dir, remoteDir, maxSize, moveToRemote) {
if (!this.remoteSent)
this.remoteSent = {};
if (!this.remoteSent[remoteDir])
this.remoteSent[remoteDir] = {};
const sent = this.remoteSent[remoteDir];
const sent = this.remoteSent;
const list = await fs.readdir(dir);
@@ -267,12 +267,17 @@ class ReaderWorker {
files.push({name: filePath, stat});
}
}
log(`clean dir ${dir}, maxSize=${maxSize}, found ${files.length} files, total size=${size}`);
files.sort((a, b) => a.stat.mtimeMs - b.stat.mtimeMs);
//удаленное хранилище
if (moveToRemote && this.remoteStorage) {
const foundFiles = new Set();
for (const file of files) {
foundFiles.add(file.name);
if (sent[file.name])
continue;
@@ -280,11 +285,23 @@ class ReaderWorker {
try {
log(`remoteStorage.putFile ${remoteDir}/${path.basename(file.name)}`);
await this.remoteStorage.putFile(file.name, remoteDir);
sent[file.name] = true;
await this.appDb.insert({table: 'remote_sent', ignore: true, rows: [{id: file.name, remoteDir}]});
} catch (e) {
log(LM_ERR, e.stack);
}
}
//почистим remoteSent и БД
//несколько неоптимально, таскает все записи из БД
const rows = await this.appDb.select({table: 'remote_sent'});
for (const row of rows) {
if (row.remoteDir === remoteDir && !foundFiles.has(row.id)) {
delete sent[row.id];
await this.appDb.delete({table: 'remote_sent', where: `@@id(${this.appDb.esc(row.id)})`});
}
}
}
let i = 0;
@@ -298,27 +315,44 @@ class ReaderWorker {
|| (moveToRemote && this.remoteStorage && sent[oldFile])
|| size > maxSize*1.5) {
await fs.remove(oldFile);
delete sent[oldFile];
j++;
}
size -= file.stat.size;
i++;
}
log(`removed ${j} files`);
}
async periodicCleanDir(cleanConfig) {
while (1) {// eslint-disable-line no-constant-condition
for (const [remoteDir, config] of Object.entries(cleanConfig)) {
try {
await this.cleanDir(config.dir, remoteDir, config.maxSize, config.moveToRemote);
} catch(e) {
log(LM_ERR, e.stack);
try {
if (!this.remoteSent)
this.remoteSent = {};
//инициализация this.remoteSent
if (this.remoteStorage) {
const rows = await this.appDb.select({table: 'remote_sent'});
for (const row of rows) {
this.remoteSent[row.id] = true;
}
}
await utils.sleep(cleanDirPeriod);
while (1) {// eslint-disable-line no-constant-condition
for (const [remoteDir, config] of Object.entries(cleanConfig)) {
try {
await this.cleanDir(config.dir, remoteDir, config.maxSize, config.moveToRemote);
} catch(e) {
log(LM_ERR, e.stack);
}
}
await utils.sleep(cleanDirPeriod);
}
} catch (e) {
log(LM_FATAL, e.message);
ayncExit.exit(1);
}
}