Przeglądaj źródła

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

Book Pauk 3 lat temu
rodzic
commit
4fd9d579e0

+ 5 - 0
server/config/base.js

@@ -39,6 +39,11 @@ module.exports = {
     ],
 
     jembaDb: [
+        {
+            dbName: 'app',
+            thread: true,
+            openAll: true,
+        },
         {
             dbName: 'reader-storage',
             thread: true,

+ 48 - 14
server/core/Reader/ReaderWorker.js

@@ -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);
         }
     }
 

+ 12 - 0
server/db/jembaMigrations/app/001-create.js

@@ -0,0 +1,12 @@
+module.exports = {
+    up: [
+        ['create', {
+            table: 'remote_sent'
+        }],
+    ],    
+    down: [
+        ['drop', {
+            table: 'remote_sent'
+        }],
+    ]
+};

+ 6 - 0
server/db/jembaMigrations/app/index.js

@@ -0,0 +1,6 @@
+module.exports = {
+    table: 'migration1',
+    data: [
+        {id: 1, name: 'create', data: require('./001-create')}
+    ]
+}

+ 1 - 0
server/db/jembaMigrations/index.js

@@ -1,4 +1,5 @@
 module.exports = {
+    'app': require('./app'),
     'reader-storage': require('./reader-storage'),
     'book-update-server': require('./book-update-server'),
 };