Lock models when trying to decrypt events

Trying to deep-copy can result in pickling errors (#50),
write-lock the models instead to avoid "dictionary changed size during
iteration" issues.
This commit is contained in:
miruka 2020-05-28 14:16:43 -04:00
parent c0118c4e28
commit 60fa027c2e

View File

@ -1176,22 +1176,25 @@ class MatrixClient(nio.AsyncClient):
_, room_id, _ = sync_id _, room_id, _ = sync_id
for ev in deepcopy(model).values(): with model.write_lock:
room = self.all_rooms[room_id] for ev in model.values():
room = self.all_rooms[room_id]
if isinstance(ev.source, nio.MegolmEvent): if isinstance(ev.source, nio.MegolmEvent):
try: try:
decrypted = self.decrypt_event(ev.source) decrypted = self.decrypt_event(ev.source)
if not decrypted: if not decrypted:
raise nio.EncryptionError() raise nio.EncryptionError()
except nio.EncryptionError: except nio.EncryptionError:
continue continue
for cb in self.event_callbacks: for callback in self.event_callbacks:
if not cb.filter or isinstance(decrypted, cb.filter): filter_ = callback.filter
await asyncio.coroutine(cb.func)(room, decrypted) if not filter_ or isinstance(decrypted, filter_):
coro = asyncio.coroutine(callback.func)
await coro(room, decrypted)
async def clear_events(self, room_id: str) -> None: async def clear_events(self, room_id: str) -> None: