pad.js: fix freeze on pad deletion when it has many revisions

pull/3941/head
Chocobozzz 2019-12-19 17:14:00 +01:00 committed by muxator
parent 09ddfb9e20
commit 53003d4471
2 changed files with 39 additions and 6 deletions

View File

@ -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 => {

View File

@ -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
}