Merge pull request #1798 from matrix-org/luke/limit-group-requests

Limit group requests to 3 at once
pull/21833/head
David Baker 2018-03-13 11:50:14 +00:00 committed by GitHub
commit 59bb5ce9d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 54 additions and 11 deletions

View File

@ -27,6 +27,48 @@ function parseRoomsResponse(response) {
return response.chunk.map((apiRoom) => groupRoomFromApiObject(apiRoom)); return response.chunk.map((apiRoom) => groupRoomFromApiObject(apiRoom));
} }
// The number of ongoing group requests
let ongoingRequestCount = 0;
// This has arbitrarily been set to a small number to lower the priority
// of doing group-related requests because we care about other important
// requests like hitting /sync.
const LIMIT = 3; // Maximum number of ongoing group requests
// FIFO queue of functions to call in the backlog
const backlogQueue = [
// () => {...}
];
// Pull from the FIFO queue
function checkBacklog() {
const item = backlogQueue.shift();
if (typeof item === 'function') item();
}
// Limit the maximum number of ongoing promises returned by fn to LIMIT and
// use a FIFO queue to handle the backlog.
function limitConcurrency(fn) {
return new Promise((resolve, reject) => {
const item = () => {
ongoingRequestCount++;
resolve();
};
if (ongoingRequestCount >= LIMIT) {
// Enqueue this request for later execution
backlogQueue.push(item);
} else {
item();
}
})
.then(fn)
.then((result) => {
ongoingRequestCount--;
checkBacklog();
return result;
});
}
/** /**
* Stores the group summary for a room and provides an API to change it and * Stores the group summary for a room and provides an API to change it and
* other useful group APIs that may have an effect on the group summary. * other useful group APIs that may have an effect on the group summary.
@ -56,23 +98,24 @@ export default class GroupStore extends EventEmitter {
this._fetchResourcePromise = {}; this._fetchResourcePromise = {};
this._resourceFetcher = { this._resourceFetcher = {
[GroupStore.STATE_KEY.Summary]: () => { [GroupStore.STATE_KEY.Summary]: () => {
return MatrixClientPeg.get() return limitConcurrency(
.getGroupSummary(this.groupId); () => MatrixClientPeg.get().getGroupSummary(this.groupId),
);
}, },
[GroupStore.STATE_KEY.GroupRooms]: () => { [GroupStore.STATE_KEY.GroupRooms]: () => {
return MatrixClientPeg.get() return limitConcurrency(
.getGroupRooms(this.groupId) () => MatrixClientPeg.get().getGroupRooms(this.groupId).then(parseRoomsResponse),
.then(parseRoomsResponse); );
}, },
[GroupStore.STATE_KEY.GroupMembers]: () => { [GroupStore.STATE_KEY.GroupMembers]: () => {
return MatrixClientPeg.get() return limitConcurrency(
.getGroupUsers(this.groupId) () => MatrixClientPeg.get().getGroupUsers(this.groupId).then(parseMembersResponse),
.then(parseMembersResponse); );
}, },
[GroupStore.STATE_KEY.GroupInvitedMembers]: () => { [GroupStore.STATE_KEY.GroupInvitedMembers]: () => {
return MatrixClientPeg.get() return limitConcurrency(
.getGroupInvitedUsers(this.groupId) () => MatrixClientPeg.get().getGroupInvitedUsers(this.groupId).then(parseMembersResponse),
.then(parseMembersResponse); );
}, },
}; };