Server: fix update remote video infohash
authorChocobozzz <florian.bigard@gmail.com>
Thu, 12 Jan 2017 08:47:21 +0000 (09:47 +0100)
committerChocobozzz <florian.bigard@gmail.com>
Thu, 12 Jan 2017 08:47:21 +0000 (09:47 +0100)
server/controllers/api/videos.js
server/models/video.js
server/tests/api/multiple-pods.js
server/tests/api/single-pod.js
server/tests/real-world/real-world.js

index 55d671f5b1a16fa932faf682fa0a5410ee368918..2c4af520e65f62ae2f1c98f4e90b131bbf18e45e 100644 (file)
@@ -259,6 +259,7 @@ function updateVideoRetryWrapper (req, res, next) {
 
 function updateVideo (req, res, finalCallback) {
   const videoInstance = res.locals.video
+  const videoFieldsSave = videoInstance.toJSON()
   const videoInfosToUpdate = req.body
 
   waterfall([
@@ -280,12 +281,13 @@ function updateVideo (req, res, finalCallback) {
     },
 
     function updateVideoIntoDB (t, tagInstances, callback) {
-      const options = { transaction: t }
+      const options = {
+        transaction: t
+      }
 
       if (videoInfosToUpdate.name) videoInstance.set('name', videoInfosToUpdate.name)
       if (videoInfosToUpdate.description) videoInstance.set('description', videoInfosToUpdate.description)
 
-      // Add tags association
       videoInstance.save(options).asCallback(function (err) {
         return callback(err, t, tagInstances)
       })
@@ -321,6 +323,14 @@ function updateVideo (req, res, finalCallback) {
       // Abort transaction?
       if (t) t.rollback()
 
+      // Force fields we want to update
+      // If the transaction is retried, sequelize will think the object has not changed
+      // So it will skip the SQL request, even if the last one was ROLLBACKed!
+      Object.keys(videoFieldsSave).forEach(function (key) {
+        const value = videoFieldsSave[key]
+        videoInstance.set(key, value)
+      })
+
       return finalCallback(err)
     }
 
index b3060705d9cd981dfd6c4ecd4bf74caa77b6516a..ceed976b090e79abfca283e77c0c0e783e53f45a 100644 (file)
@@ -141,7 +141,8 @@ module.exports = function (sequelize, DataTypes) {
 }
 
 function beforeValidate (video, options, next) {
-  if (video.isOwned()) {
+  // Put a fake infoHash if it does not exists yet
+  if (video.isOwned() && !video.infoHash) {
     // 40 hexa length
     video.infoHash = '0123456789abcdef0123456789abcdef01234567'
   }
index 4442a7ff7613cfe8a0376b8dcf27ddefc2b31770..169a9f2e0d01c0e514e1200288e269468b52aa94 100644 (file)
@@ -4,7 +4,8 @@ const chai = require('chai')
 const each = require('async/each')
 const expect = chai.expect
 const series = require('async/series')
-const webtorrent = new (require('webtorrent'))()
+const WebTorrent = require('webtorrent')
+const webtorrent = new WebTorrent()
 
 const loginUtils = require('../utils/login')
 const miscsUtils = require('../utils/miscs')
@@ -311,7 +312,7 @@ describe('Test multiple pods', function () {
           expect(torrent.files.length).to.equal(1)
           expect(torrent.files[0].path).to.exist.and.to.not.equal('')
 
-          done()
+          webtorrent.remove(video.magnetUri, done)
         })
       })
     })
@@ -330,7 +331,7 @@ describe('Test multiple pods', function () {
           expect(torrent.files.length).to.equal(1)
           expect(torrent.files[0].path).to.exist.and.to.not.equal('')
 
-          done()
+          webtorrent.remove(video.magnetUri, done)
         })
       })
     })
@@ -349,7 +350,7 @@ describe('Test multiple pods', function () {
           expect(torrent.files.length).to.equal(1)
           expect(torrent.files[0].path).to.exist.and.to.not.equal('')
 
-          done()
+          webtorrent.remove(video.magnetUri, done)
         })
       })
     })
@@ -368,7 +369,7 @@ describe('Test multiple pods', function () {
           expect(torrent.files.length).to.equal(1)
           expect(torrent.files[0].path).to.exist.and.to.not.equal('')
 
-          done()
+          webtorrent.remove(video.magnetUri, done)
         })
       })
     })
@@ -390,7 +391,12 @@ describe('Test multiple pods', function () {
     })
 
     it('Should have the video 3 updated on each pod', function (done) {
+      this.timeout(200000)
+
       each(servers, function (server, callback) {
+        // Avoid "duplicate torrent" errors
+        const webtorrent = new WebTorrent()
+
         videosUtils.getVideosList(server.url, function (err, res) {
           if (err) throw err
 
@@ -404,7 +410,18 @@ describe('Test multiple pods', function () {
           expect(videoUpdated.tags).to.deep.equal([ 'tagup1', 'tagup2' ])
           expect(miscsUtils.dateIsValid(videoUpdated.updatedAt, 20000)).to.be.true
 
-          callback()
+          videosUtils.testVideoImage(server.url, 'video_short3.webm', videoUpdated.thumbnailPath, function (err, test) {
+            if (err) throw err
+            expect(test).to.equal(true)
+
+            webtorrent.add(videoUpdated.magnetUri, function (torrent) {
+              expect(torrent.files).to.exist
+              expect(torrent.files.length).to.equal(1)
+              expect(torrent.files[0].path).to.exist.and.to.not.equal('')
+
+              webtorrent.remove(videoUpdated.magnetUri, callback)
+            })
+          })
         })
       }, done)
     })
index 29512dfc6a47ad7d573c7d05db801a105419965c..04b93fac7dce526f9aa0f0c81bdcfda79f0db085 100644 (file)
@@ -96,7 +96,7 @@ describe('Test a single pod', function () {
           expect(torrent.files.length).to.equal(1)
           expect(torrent.files[0].path).to.exist.and.to.not.equal('')
 
-          done()
+          webtorrent.remove(video.magnetUri, done)
         })
       })
     })
@@ -515,6 +515,8 @@ describe('Test a single pod', function () {
   })
 
   it('Should have the video updated', function (done) {
+    this.timeout(60000)
+
     videosUtils.getVideo(server.url, videoId, function (err, res) {
       if (err) throw err
 
@@ -529,7 +531,20 @@ describe('Test a single pod', function () {
       expect(miscsUtils.dateIsValid(video.createdAt)).to.be.true
       expect(miscsUtils.dateIsValid(video.updatedAt)).to.be.true
 
-      done()
+      videosUtils.testVideoImage(server.url, 'video_short3.webm', video.thumbnailPath, function (err, test) {
+        if (err) throw err
+        expect(test).to.equal(true)
+
+        videoId = video.id
+
+        webtorrent.add(video.magnetUri, function (torrent) {
+          expect(torrent.files).to.exist
+          expect(torrent.files.length).to.equal(1)
+          expect(torrent.files[0].path).to.exist.and.to.not.equal('')
+
+          done()
+        })
+      })
     })
   })
 
index 896ba6cce43c9fdd7e83d2d5778a10a37544b9d0..941e43a2e72b18f69732802c8e612ce5a3944c86 100644 (file)
@@ -38,7 +38,7 @@ const numberOfPods = 6
 // Wait requests between pods
 const baseRequestInterval = integrityInterval < constants.REQUESTS_INTERVAL ? integrityInterval : constants.REQUESTS_INTERVAL
 const requestsMaxPerInterval = baseRequestInterval / actionInterval
-const intervalsToMakeAllRequests = Math.ceil(requestsMaxPerInterval / (constants.REQUESTS_LIMIT_PER_POD * numberOfPods))
+const intervalsToMakeAllRequests = Math.ceil(requestsMaxPerInterval / constants.REQUESTS_LIMIT_PER_POD)
 const waitForBeforeIntegrityCheck = (intervalsToMakeAllRequests * constants.REQUESTS_INTERVAL) + 1000
 
 console.log('Create weight: %d, update weight: %d, remove weight: %d.', createWeight, updateWeight, removeWeight)