Browse Source

Fix redundancy exceeding the limit

Chocobozzz 4 years ago
parent
commit
0b353d1d8a

+ 4 - 0
client/proxy.config.json

@@ -15,6 +15,10 @@
     "target": "http://localhost:9000",
     "secure": false
   },
+  "/lazy-static": {
+    "target": "http://localhost:9000",
+    "secure": false
+  },
   "/socket.io": {
     "target": "ws://localhost:9000",
     "secure": false,

+ 4 - 1
server/lib/schedulers/videos-redundancy-scheduler.ts

@@ -105,7 +105,10 @@ export class VideosRedundancyScheduler extends AbstractScheduler {
   private async extendsRedundancy (redundancyModel: VideoRedundancyModel) {
     const redundancy = CONFIG.REDUNDANCY.VIDEOS.STRATEGIES.find(s => s.strategy === redundancyModel.strategy)
     // Redundancy strategy disabled, remove our redundancy instead of extending expiration
-    if (!redundancy) await removeVideoRedundancy(redundancyModel)
+    if (!redundancy) {
+      await removeVideoRedundancy(redundancyModel)
+      return
+    }
 
     await this.extendsExpirationOf(redundancyModel, redundancy.minLifetime)
   }

+ 30 - 8
server/models/redundancy/video-redundancy.ts

@@ -325,23 +325,45 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
 
   static async getTotalDuplicated (strategy: VideoRedundancyStrategy) {
     const actor = await getServerActor()
+    const redundancyInclude = {
+      attributes: [],
+      model: VideoRedundancyModel,
+      required: true,
+      where: {
+        actorId: actor.id,
+        strategy
+      }
+    }
 
-    const query: FindOptions = {
+    const queryFiles: FindOptions = {
+      include: [ redundancyInclude ]
+    }
+
+    const queryStreamingPlaylists: FindOptions = {
       include: [
         {
           attributes: [],
-          model: VideoRedundancyModel,
+          model: VideoModel.unscoped(),
           required: true,
-          where: {
-            actorId: actor.id,
-            strategy
-          }
+          include: [
+            {
+              attributes: [],
+              model: VideoStreamingPlaylistModel.unscoped(),
+              include: [
+                redundancyInclude
+              ]
+            }
+          ]
         }
       ]
     }
 
-    return VideoFileModel.aggregate('size', 'SUM', query)
-      .then(result => parseAggregateResult(result))
+    return Promise.all([
+      VideoFileModel.aggregate('size', 'SUM', queryFiles),
+      VideoFileModel.aggregate('size', 'SUM', queryStreamingPlaylists)
+    ]).then(([ r1, r2 ]) => {
+      return parseAggregateResult(r1) + parseAggregateResult(r2)
+    })
   }
 
   static async listLocalExpired () {

+ 2 - 4
server/tests/api/videos/multiple-servers.ts

@@ -508,10 +508,8 @@ describe('Test multiple servers', function () {
 
       await wait(1000)
 
-      await Promise.all([
-        viewVideo(servers[2].url, localVideosServer3[0]),
-        viewVideo(servers[2].url, localVideosServer3[0])
-      ])
+      await viewVideo(servers[2].url, localVideosServer3[0])
+      await viewVideo(servers[2].url, localVideosServer3[0])
 
       await waitJobs(servers)