# Buggy code
def _handle_state_delta(self, deltas):
    """Process current state deltas to find new joins that need to be
    handled.
    """
    for delta in deltas:
        typ = delta["type"]
        state_key = delta["state_key"]
        room_id = delta["room_id"]
        event_id = delta["event_id"]
        prev_event_id = delta["prev_event_id"]

        logger.debug("Handling: %r %r, %s", typ, state_key, event_id)

        if typ != EventTypes.Member:
            continue

        event = yield self.store.get_event(event_id)
        if event.content.get("membership") != Membership.JOIN:
            # We only care about joins
            continue

        if prev_event_id:
            prev_event = yield self.store.get_event(prev_event_id)
            if prev_event.content.get("membership") == Membership.JOIN:
                # Ignore changes to join events.
                continue

        yield self._on_user_joined_room(room_id, state_key)


# Traceback (synapse.api.errors.NotFoundError)
2019-04-26 06:18:26,267 - synapse.metrics.background_process_metrics - 203 - ERROR - presence.notify_new_event-13001- Background process 'presence.notify_new_event' threw an exception
Capture point (most recent call last):
File "/usr/lib/python3.5/runpy.py", line 184, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.5/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/opt/synapse/synapse/synapse/app/homeserver.py", line 661, in <module>
main()
File "/opt/synapse/synapse/synapse/app/homeserver.py", line 657, in main
run(hs)
File "/opt/synapse/synapse/synapse/app/homeserver.py", line 648, in run
logger=logger,
File "/opt/synapse/synapse/synapse/app/_base.py", line 143, in start_reactor
run()
File "/opt/synapse/synapse/synapse/app/_base.py", line 127, in run
reactor.run()
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/base.py", line 1267, in run
self.mainLoop()
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/base.py", line 1276, in mainLoop
self.runUntilCurrent()
File "/opt/synapse/synapse/synapse/metrics/__init__.py", line 347, in f
ret = func(*args, **kwargs)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/base.py", line 875, in runUntilCurrent
f(*a, **kw)
File "/opt/synapse/synapse/synapse/storage/events_worker.py", line 349, in fire
d.callback([res[i] for i in ids if i in res])
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 460, in callback
self._startRunCallbacks(result)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 568, in _startRunCallbacks
self._runCallbacks()
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 654, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1475, in gotResult
_inlineCallbacks(r, g, status)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1461, in _inlineCallbacks
status.deferred.callback(e.value)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 460, in callback
self._startRunCallbacks(result)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 568, in _startRunCallbacks
self._runCallbacks()
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 654, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1475, in gotResult
_inlineCallbacks(r, g, status)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1461, in _inlineCallbacks
status.deferred.callback(e.value)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 460, in callback
self._startRunCallbacks(result)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 568, in _startRunCallbacks
self._runCallbacks()
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 654, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1475, in gotResult
_inlineCallbacks(r, g, status)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1464, in _inlineCallbacks
status.deferred.errback()
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 501, in errback
self._startRunCallbacks(fail)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 568, in _startRunCallbacks
self._runCallbacks()
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 654, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1475, in gotResult
_inlineCallbacks(r, g, status)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1464, in _inlineCallbacks
status.deferred.errback()
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 501, in errback
self._startRunCallbacks(fail)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 568, in _startRunCallbacks
self._runCallbacks()
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 654, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1475, in gotResult
_inlineCallbacks(r, g, status)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1464, in _inlineCallbacks
status.deferred.errback()
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 501, in errback
self._startRunCallbacks(fail)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 568, in _startRunCallbacks
self._runCallbacks()
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 654, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1475, in gotResult
_inlineCallbacks(r, g, status)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1464, in _inlineCallbacks
status.deferred.errback()
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 501, in errback
self._startRunCallbacks(fail)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 568, in _startRunCallbacks
self._runCallbacks()
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 654, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1475, in gotResult
_inlineCallbacks(r, g, status)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1416, in _inlineCallbacks
result = result.throwExceptionIntoGenerator(g)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/python/failure.py", line 491, in throwExceptionIntoGenerator
return g.throw(self.type, self.value, self.tb)
return g.throw(self.type, self.value, self.tb)
Traceback (most recent call last):
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
result = g.send(result)
File "/opt/synapse/synapse/synapse/storage/events_worker.py", line 419, in _enqueue_events
defer.returnValue({e.event.event_id: e for e in res if e})
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1362, in returnValue
raise _DefGen_Return(val)
twisted.internet.defer._DefGen_Return: {}

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
result = g.send(result)
File "/opt/synapse/synapse/synapse/storage/events_worker.py", line 263, in _get_events
defer.returnValue(events)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1362, in returnValue
raise _DefGen_Return(val)
twisted.internet.defer._DefGen_Return: []

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/opt/synapse/synapse/synapse/metrics/background_process_metrics.py", line 201, in run
yield func(*args, **kwargs)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1416, in _inlineCallbacks
result = result.throwExceptionIntoGenerator(g)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/python/failure.py", line 491, in throwExceptionIntoGenerator
return g.throw(self.type, self.value, self.tb)
File "/opt/synapse/synapse/synapse/handlers/presence.py", line 790, in _process_presence
yield self._unsafe_process()
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1416, in _inlineCallbacks
result = result.throwExceptionIntoGenerator(g)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/python/failure.py", line 491, in throwExceptionIntoGenerator
return g.throw(self.type, self.value, self.tb)
File "/opt/synapse/synapse/synapse/handlers/presence.py", line 805, in _unsafe_process
yield self._handle_state_delta(deltas)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1416, in _inlineCallbacks
result = result.throwExceptionIntoGenerator(g)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/python/failure.py", line 491, in throwExceptionIntoGenerator
return g.throw(self.type, self.value, self.tb)
File "/opt/synapse/synapse/synapse/handlers/presence.py", line 831, in _handle_state_delta
event = yield self.store.get_event(event_id)
File "/opt/synapse/env3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
result = g.send(result)
File "/opt/synapse/synapse/synapse/storage/events_worker.py", line 120, in get_event
raise NotFoundError("Could not find event %s" % (event_id,))
synapse.api.errors.NotFoundError: 404: Could not find event None

# Fixed code
def _handle_state_delta(self, deltas):
    """Process current state deltas to find new joins that need to be
    handled.
    """
    for delta in deltas:
        typ = delta["type"]
        state_key = delta["state_key"]
        room_id = delta["room_id"]
        event_id = delta["event_id"]
        prev_event_id = delta["prev_event_id"]

        logger.debug("Handling: %r %r, %s", typ, state_key, event_id)

        if typ != EventTypes.Member:
            continue

        if event_id is None:
            # state has been deleted, so this is not a join. We only care about
            # joins.
            continue

        event = yield self.store.get_event(event_id)
        if event.content.get("membership") != Membership.JOIN:
            # We only care about joins
            continue

        if prev_event_id:
            prev_event = yield self.store.get_event(prev_event_id)
            if prev_event.content.get("membership") == Membership.JOIN:
                # Ignore changes to join events.
                continue

        yield self._on_user_joined_room(room_id, state_key)