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) => {
const item = () => {
ongoingRequestCount++;
resolve();
};
if (ongoingRequestCount >= LIMIT) { if (ongoingRequestCount >= LIMIT) {
// Enqueue this request for later execution // Enqueue this request for later execution
backlogQueue.push(item); await new Promise((resolve, reject) => {
} else { backlogQueue.push(resolve);
item(); });
} }
})
.then(fn) ongoingRequestCount++;
.then((result) => { try {
return await fn();
} catch (err) {
// We explicitly do not handle the error here, but let it propogate.
throw err;
} finally {
ongoingRequestCount--; ongoingRequestCount--;
checkBacklog(); checkBacklog();
return result; }
});
} }
/** /**