pad.js: fix freeze on pad deletion when it has many revisions
parent
09ddfb9e20
commit
53003d4471
|
@ -16,6 +16,7 @@ var readOnlyManager = require("./ReadOnlyManager");
|
|||
var crypto = require("crypto");
|
||||
var randomString = require("../utils/randomstring");
|
||||
var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks');
|
||||
var promises = require('../utils/promises')
|
||||
|
||||
// serialization/deserialization attributes
|
||||
var attributeBlackList = ["id"];
|
||||
|
@ -482,14 +483,14 @@ Pad.prototype.remove = async function remove() {
|
|||
db.remove("readonly2pad:" + readonlyID);
|
||||
|
||||
// delete all chat messages
|
||||
for (let i = 0, n = this.chatHead; i <= n; ++i) {
|
||||
db.remove("pad:" + padID + ":chat:" + i);
|
||||
}
|
||||
promises.timesLimit(this.chatHead + 1, 500, function (i) {
|
||||
return db.remove("pad:" + padID + ":chat:" + i);
|
||||
})
|
||||
|
||||
// delete all revisions
|
||||
for (let i = 0, n = this.head; i <= n; ++i) {
|
||||
db.remove("pad:" + padID + ":revs:" + i);
|
||||
}
|
||||
promises.timesLimit(this.head + 1, 500, function (i) {
|
||||
return db.remove("pad:" + padID + ":revs:" + i);
|
||||
})
|
||||
|
||||
// remove pad from all authors who contributed
|
||||
this.getAllAuthors().forEach(authorID => {
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
/**
|
||||
* Helpers to manipulate promises (like async but for promises).
|
||||
*/
|
||||
|
||||
var timesLimit = function (ltMax, concurrency, promiseCreator) {
|
||||
var done = 0
|
||||
var current = 0
|
||||
|
||||
function addAnother () {
|
||||
function _internalRun () {
|
||||
done++
|
||||
|
||||
if (done < ltMax) {
|
||||
addAnother()
|
||||
}
|
||||
}
|
||||
|
||||
promiseCreator(current)
|
||||
.then(_internalRun)
|
||||
.catch(_internalRun)
|
||||
|
||||
current++
|
||||
}
|
||||
|
||||
for (var i = 0; i < concurrency && i < ltMax; i++) {
|
||||
addAnother()
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
timesLimit: timesLimit
|
||||
}
|
Loading…
Reference in New Issue