Merge pull request #1867 from matrix-org/luke/fix-group-request-concurrency

Prevent error responses wedging group request concurrency limit
This commit is contained in:
David Baker 2018-05-02 10:45:12 +01:00 committed by GitHub
commit 3d478c3c3a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -48,25 +48,24 @@ function checkBacklog() {
// Limit the maximum number of ongoing promises returned by fn to LIMIT and // Limit the maximum number of ongoing promises returned by fn to LIMIT and
// use a FIFO queue to handle the backlog. // use a FIFO queue to handle the backlog.
function limitConcurrency(fn) { async function limitConcurrency(fn) {
return new Promise((resolve, reject) => { if (ongoingRequestCount >= LIMIT) {
const item = () => { // Enqueue this request for later execution
ongoingRequestCount++; await new Promise((resolve, reject) => {
resolve(); backlogQueue.push(resolve);
}; });
if (ongoingRequestCount >= LIMIT) { }
// Enqueue this request for later execution
backlogQueue.push(item); ongoingRequestCount++;
} else { try {
item(); return await fn();
} } catch (err) {
}) // We explicitly do not handle the error here, but let it propogate.
.then(fn) throw err;
.then((result) => { } finally {
ongoingRequestCount--; ongoingRequestCount--;
checkBacklog(); checkBacklog();
return result; }
});
} }
/** /**