Небольшие доработки remoteSent, оптимизация отправки файлов
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user