Merge pull request #151 from vector-im/bwindels/fix-olm-running-out-of-memory

Fix olm running out of memory
This commit is contained in:
Bruno Windels 2020-10-14 10:45:27 +00:00 committed by GitHub
commit d3b8d7818f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 12 additions and 9 deletions

View File

@ -41,7 +41,7 @@ export class RoomEncryption {
this._encryptionParams = encryptionParams; this._encryptionParams = encryptionParams;
this._megolmBackfillCache = this._megolmDecryption.createSessionCache(); this._megolmBackfillCache = this._megolmDecryption.createSessionCache();
this._megolmSyncCache = this._megolmDecryption.createSessionCache(); this._megolmSyncCache = this._megolmDecryption.createSessionCache(1);
// session => event ids of messages we tried to decrypt and the session was missing // session => event ids of messages we tried to decrypt and the session was missing
this._missingSessions = new SessionToEventIdsMap(); this._missingSessions = new SessionToEventIdsMap();
// sessions that may or may not be missing, but that while // sessions that may or may not be missing, but that while

View File

@ -41,8 +41,8 @@ export class Decryption {
this._olmWorker = olmWorker; this._olmWorker = olmWorker;
} }
createSessionCache(fallback) { createSessionCache(size) {
return new SessionCache(fallback); return new SessionCache(size);
} }
/** /**

View File

@ -14,13 +14,14 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
const CACHE_MAX_SIZE = 10; const DEFAULT_CACHE_SIZE = 10;
/** /**
* Cache of unpickled inbound megolm session. * Cache of unpickled inbound megolm session.
*/ */
export class SessionCache { export class SessionCache {
constructor() { constructor(size) {
this._size = typeof size === "number" ? size : DEFAULT_CACHE_SIZE;
this._sessions = []; this._sessions = [];
} }
@ -51,12 +52,12 @@ export class SessionCache {
sessionInfo.retain(); sessionInfo.retain();
// add new at top // add new at top
this._sessions.unshift(sessionInfo); this._sessions.unshift(sessionInfo);
if (this._sessions.length > CACHE_MAX_SIZE) { if (this._sessions.length > this._size) {
// free sessions we're about to remove // free sessions we're about to remove
for (let i = CACHE_MAX_SIZE; i < this._sessions.length; i += 1) { for (let i = this._size; i < this._sessions.length; i += 1) {
this._sessions[i].release(); this._sessions[i].release();
} }
this._sessions = this._sessions.slice(0, CACHE_MAX_SIZE); this._sessions = this._sessions.slice(0, this._size);
} }
} }

View File

@ -31,7 +31,9 @@ function findFirstSessionId(sessionIds) {
const OTK_ALGORITHM = "signed_curve25519"; const OTK_ALGORITHM = "signed_curve25519";
// only encrypt this amount of olm messages at once otherwise we run out of wasm memory // only encrypt this amount of olm messages at once otherwise we run out of wasm memory
// with all the sessions loaded at the same time // with all the sessions loaded at the same time
const MAX_BATCH_SIZE = 50; // See https://github.com/vector-im/hydrogen-web/issues/150 as well, which indicates the limit is 44,
// but let's take a conservative limit as the megolm session cache also takes space
const MAX_BATCH_SIZE = 20;
export class Encryption { export class Encryption {
constructor({account, olm, olmUtil, ownUserId, storage, now, pickleKey, senderKeyLock}) { constructor({account, olm, olmUtil, ownUserId, storage, now, pickleKey, senderKeyLock}) {