Fix "argument of type 'ObservableDeferred' is not iterable" error (#7708)

This commit is contained in:
Patrick Cloke 2020-06-16 12:01:18 -04:00 committed by GitHub
parent 5c5516f80e
commit 231252516c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 7 additions and 5 deletions

1
changelog.d/7708.bugfix Normal file
View file

@ -0,0 +1 @@
Fixs a long standing bug which resulted in an exception: "TypeError: argument of type 'ObservableDeferred' is not iterable".

View file

@ -24,6 +24,7 @@ from twisted.internet import defer
from synapse.storage._base import SQLBaseStore, make_in_list_sql_clause
from synapse.storage.database import Database
from synapse.storage.util.id_generators import StreamIdGenerator
from synapse.util.async_helpers import ObservableDeferred
from synapse.util.caches.descriptors import cached, cachedInlineCallbacks, cachedList
from synapse.util.caches.stream_change_cache import StreamChangeCache
@ -300,10 +301,10 @@ class ReceiptsWorkerStore(SQLBaseStore):
room_id, None, update_metrics=False
)
# first handle the Deferred case
if isinstance(res, defer.Deferred):
if res.called:
res = res.result
# first handle the ObservableDeferred case
if isinstance(res, ObservableDeferred):
if res.has_called():
res = res.get_result()
else:
res = None

View file

@ -93,7 +93,7 @@ class ObservableDeferred(object):
This returns a brand new deferred that is resolved when the underlying
deferred is resolved. Interacting with the returned deferred does not
effect the underdlying deferred.
effect the underlying deferred.
"""
if not self._result:
d = defer.Deferred()