Server: create transaction refractoring
[oweals/peertube.git] / server / helpers / database-utils.js
1 'use strict'
2
3 const retry = require('async/retry')
4
5 const db = require('../initializers/database')
6 const logger = require('./logger')
7
8 const utils = {
9   retryTransactionWrapper,
10   transactionRetryer,
11   startSerializableTransaction
12 }
13
14 // { arguments, errorMessage }
15 function retryTransactionWrapper (functionToRetry, options, finalCallback) {
16   const args = options.arguments ? options.arguments : []
17
18   utils.transactionRetryer(
19     function (callback) {
20       return functionToRetry.apply(this, args.concat([ callback ]))
21     },
22     function (err) {
23       if (err) {
24         logger.error(options.errorMessage, { error: err })
25       }
26
27       // Do not return the error, continue the process
28       return finalCallback(null)
29     }
30   )
31 }
32
33 function transactionRetryer (func, callback) {
34   retry({
35     times: 5,
36
37     errorFilter: function (err) {
38       const willRetry = (err.name === 'SequelizeDatabaseError')
39       logger.debug('Maybe retrying the transaction function.', { willRetry })
40       return willRetry
41     }
42   }, func, callback)
43 }
44
45 function startSerializableTransaction (callback) {
46   console.log(db)
47   db.sequelize.transaction({ isolationLevel: 'SERIALIZABLE' }).asCallback(function (err, t) {
48     // We force to return only two parameters
49     return callback(err, t)
50   })
51 }
52
53 // ---------------------------------------------------------------------------
54
55 module.exports = utils