Server: retryer transaction wrapper refractoring
authorChocobozzz <florian.bigard@gmail.com>
Sun, 15 Jan 2017 18:13:16 +0000 (19:13 +0100)
committerChocobozzz <florian.bigard@gmail.com>
Sun, 15 Jan 2017 18:13:16 +0000 (19:13 +0100)
.codeclimate.yml
server/controllers/api/remote/videos.js
server/controllers/api/videos.js
server/helpers/utils.js

index ddff519bf38e5ab174232697156f41836acffc50..2318cfa4b5a9fb58dec46a93ede19483370721e1 100644 (file)
@@ -19,5 +19,6 @@ exclude_paths:
 - config/
 - node_modules/
 - client
+- scripts/
 - server/tests/
 - .tmp/
index c45a86dbbff33d8f7e56cd51c77e6d6d64c8e0ee..9d007246fd775ced2c3e4827be7917e5a9e5d885 100644 (file)
@@ -66,19 +66,12 @@ function remoteVideos (req, res, next) {
 
 // Handle retries on fail
 function addRemoteVideoRetryWrapper (videoToCreateData, fromPod, finalCallback) {
-  utils.transactionRetryer(
-    function (callback) {
-      return addRemoteVideo(videoToCreateData, fromPod, callback)
-    },
-    function (err) {
-      if (err) {
-        logger.error('Cannot insert the remote video with many retries.', { error: err })
-      }
+  const options = {
+    arguments: [ videoToCreateData, fromPod ],
+    errorMessage: 'Cannot insert the remote video with many retries.'
+  }
 
-      // Do not return the error, continue the process
-      return finalCallback(null)
-    }
-  )
+  utils.retryWrapper(addRemoteVideo, options, finalCallback)
 }
 
 function addRemoteVideo (videoToCreateData, fromPod, finalCallback) {
@@ -182,19 +175,12 @@ function addRemoteVideo (videoToCreateData, fromPod, finalCallback) {
 
 // Handle retries on fail
 function updateRemoteVideoRetryWrapper (videoAttributesToUpdate, fromPod, finalCallback) {
-  utils.transactionRetryer(
-    function (callback) {
-      return updateRemoteVideo(videoAttributesToUpdate, fromPod, callback)
-    },
-    function (err) {
-      if (err) {
-        logger.error('Cannot update the remote video with many retries.', { error: err })
-      }
+  const options = {
+    arguments: [ fromPod, videoAttributesToUpdate ],
+    errorMessage: 'Cannot update the remote video with many retries'
+  }
 
-      // Do not return the error, continue the process
-      return finalCallback(null)
-    }
-  )
+  utils.retryWrapper(updateRemoteVideo, options, finalCallback)
 }
 
 function updateRemoteVideo (videoAttributesToUpdate, fromPod, finalCallback) {
index 2c4af520e65f62ae2f1c98f4e90b131bbf18e45e..9a50a29bef5065e04fc39b12cc7aa20ca48b04c7 100644 (file)
@@ -106,20 +106,17 @@ module.exports = router
 // Wrapper to video add that retry the function if there is a database error
 // We need this because we run the transaction in SERIALIZABLE isolation that can fail
 function addVideoRetryWrapper (req, res, next) {
-  utils.transactionRetryer(
-    function (callback) {
-      return addVideo(req, res, req.files.videofile[0], callback)
-    },
-    function (err) {
-      if (err) {
-        logger.error('Cannot insert the video with many retries.', { error: err })
-        return next(err)
-      }
+  const options = {
+    arguments: [ req, res, req.files.videofile[0] ],
+    errorMessage: 'Cannot insert the video with many retries.'
+  }
 
-      // TODO : include Location of the new video -> 201
-      return res.type('json').status(204).end()
-    }
-  )
+  utils.retryWrapper(addVideo, options, function (err) {
+    if (err) return next(err)
+
+    // TODO : include Location of the new video -> 201
+    return res.type('json').status(204).end()
+  })
 }
 
 function addVideo (req, res, videoFile, callback) {
@@ -241,20 +238,17 @@ function addVideo (req, res, videoFile, callback) {
 }
 
 function updateVideoRetryWrapper (req, res, next) {
-  utils.transactionRetryer(
-    function (callback) {
-      return updateVideo(req, res, callback)
-    },
-    function (err) {
-      if (err) {
-        logger.error('Cannot update the video with many retries.', { error: err })
-        return next(err)
-      }
+  const options = {
+    arguments: [ req, res ],
+    errorMessage: 'Cannot update the video with many retries.'
+  }
 
-      // TODO : include Location of the new video -> 201
-      return res.type('json').status(204).end()
-    }
-  )
+  utils.retryWrapper(updateVideo, options, function (err) {
+    if (err) return next(err)
+
+    // TODO : include Location of the new video -> 201
+    return res.type('json').status(204).end()
+  })
 }
 
 function updateVideo (req, res, finalCallback) {
index a902850cdd044026247350d479b8de07dd45e51b..fb4dd08cc6df36e2f97676fbb5c04723fdb78741 100644 (file)
@@ -11,6 +11,7 @@ const utils = {
   generateRandomString,
   isTestInstance,
   getFormatedObjects,
+  retryWrapper,
   transactionRetryer
 }
 
@@ -48,6 +49,25 @@ function getFormatedObjects (objects, objectsTotal) {
   }
 }
 
+// { arguments, errorMessage }
+function retryWrapper (functionToRetry, options, finalCallback) {
+  const args = options.arguments ? options.arguments : []
+
+  utils.transactionRetryer(
+    function (callback) {
+      return functionToRetry.apply(this, args.concat([ callback ]))
+    },
+    function (err) {
+      if (err) {
+        logger.error(options.errorMessage, { error: err })
+      }
+
+      // Do not return the error, continue the process
+      return finalCallback(null)
+    }
+  )
+}
+
 function transactionRetryer (func, callback) {
   retry({
     times: 5,