]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/helpers/database-utils.js
Server: fix tests
[github/Chocobozzz/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 commitTransaction,
10 retryTransactionWrapper,
11 rollbackTransaction,
12 startSerializableTransaction,
13 transactionRetryer
14 }
15
16 function commitTransaction (t, callback) {
17 return t.commit().asCallback(callback)
18 }
19
20 function rollbackTransaction (err, t, callback) {
21 // Try to rollback transaction
22 if (t) {
23 // Do not catch err, report the original one
24 t.rollback().asCallback(function () {
25 return callback(err)
26 })
27 } else {
28 return callback(err)
29 }
30 }
31
32 // { arguments, errorMessage }
33 function retryTransactionWrapper (functionToRetry, options, finalCallback) {
34 const args = options.arguments ? options.arguments : []
35
36 utils.transactionRetryer(
37 function (callback) {
38 return functionToRetry.apply(this, args.concat([ callback ]))
39 },
40 function (err) {
41 if (err) {
42 logger.error(options.errorMessage, { error: err })
43 }
44
45 // Do not return the error, continue the process
46 return finalCallback(null)
47 }
48 )
49 }
50
51 function transactionRetryer (func, callback) {
52 retry({
53 times: 5,
54
55 errorFilter: function (err) {
56 const willRetry = (err.name === 'SequelizeDatabaseError')
57 logger.debug('Maybe retrying the transaction function.', { willRetry })
58 return willRetry
59 }
60 }, func, callback)
61 }
62
63 function startSerializableTransaction (callback) {
64 db.sequelize.transaction({ isolationLevel: 'SERIALIZABLE' }).asCallback(function (err, t) {
65 // We force to return only two parameters
66 return callback(err, t)
67 })
68 }
69
70 // ---------------------------------------------------------------------------
71
72 module.exports = utils