Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Change the way we do logging contexts so that they survive divergences
Browse files Browse the repository at this point in the history
  • Loading branch information
erikjohnston committed May 8, 2015
1 parent db0dca2 commit 4768992
Show file tree
Hide file tree
Showing 13 changed files with 131 additions and 100 deletions.
1 change: 1 addition & 0 deletions demo/start.sh
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ for port in 8080 8081 8082; do
#rm $DIR/etc/$port.config
python -m synapse.app.homeserver \
--generate-config \
--enable_registration \
-H "localhost:$https_port" \
--config-path "$DIR/etc/$port.config" \

Expand Down
17 changes: 11 additions & 6 deletions synapse/crypto/keyclient.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@
from twisted.internet.protocol import Factory
from twisted.internet import defer, reactor
from synapse.http.endpoint import matrix_federation_endpoint
from synapse.util.logcontext import PreserveLoggingContext
from synapse.util.logcontext import (
preserve_context_over_fn, preserve_context_over_deferred
)
import simplejson as json
import logging

Expand All @@ -40,11 +42,14 @@ def fetch_server_key(server_name, ssl_context_factory, path=KEY_API_V1):

for i in range(5):
try:
with PreserveLoggingContext():
protocol = yield endpoint.connect(factory)
server_response, server_certificate = yield protocol.remote_key
defer.returnValue((server_response, server_certificate))
return
protocol = yield preserve_context_over_fn(
endpoint.connect, factory
)
server_response, server_certificate = yield preserve_context_over_deferred(
protocol.remote_key
)
defer.returnValue((server_response, server_certificate))
return
except SynapseKeyClientError as e:
logger.exception("Error getting key for %r" % (server_name,))
if e.status.startswith("4"):
Expand Down
46 changes: 22 additions & 24 deletions synapse/federation/federation_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
from .units import Transaction, Edu

from synapse.util.logutils import log_function
from synapse.util.logcontext import PreserveLoggingContext
from synapse.events import FrozenEvent
import synapse.metrics

Expand Down Expand Up @@ -123,29 +122,28 @@ def on_incoming_transaction(self, transaction_data):

logger.debug("[%s] Transaction is new", transaction.transaction_id)

with PreserveLoggingContext():
results = []

for pdu in pdu_list:
d = self._handle_new_pdu(transaction.origin, pdu)

try:
yield d
results.append({})
except FederationError as e:
self.send_failure(e, transaction.origin)
results.append({"error": str(e)})
except Exception as e:
results.append({"error": str(e)})
logger.exception("Failed to handle PDU")

if hasattr(transaction, "edus"):
for edu in [Edu(**x) for x in transaction.edus]:
self.received_edu(
transaction.origin,
edu.edu_type,
edu.content
)
results = []

for pdu in pdu_list:
d = self._handle_new_pdu(transaction.origin, pdu)

try:
yield d
results.append({})
except FederationError as e:
self.send_failure(e, transaction.origin)
results.append({"error": str(e)})
except Exception as e:
results.append({"error": str(e)})
logger.exception("Failed to handle PDU")

if hasattr(transaction, "edus"):
for edu in [Edu(**x) for x in transaction.edus]:
self.received_edu(
transaction.origin,
edu.edu_type,
edu.content
)

for failure in getattr(transaction, "pdu_failures", []):
logger.info("Got failure %r", failure)
Expand Down
8 changes: 3 additions & 5 deletions synapse/handlers/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@

from twisted.internet import defer

from synapse.util.logcontext import PreserveLoggingContext
from synapse.util.logutils import log_function
from synapse.types import UserID
from synapse.events.utils import serialize_event
Expand Down Expand Up @@ -81,10 +80,9 @@ def get_stream(self, auth_user_id, pagin_config, timeout=0,
# thundering herds on restart.
timeout = random.randint(int(timeout*0.9), int(timeout*1.1))

with PreserveLoggingContext():
events, tokens = yield self.notifier.get_events_for(
auth_user, room_ids, pagin_config, timeout
)
events, tokens = yield self.notifier.get_events_for(
auth_user, room_ids, pagin_config, timeout
)

time_now = self.clock.time_msec()

Expand Down
34 changes: 15 additions & 19 deletions synapse/handlers/presence.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
from synapse.api.constants import PresenceState

from synapse.util.logutils import log_function
from synapse.util.logcontext import PreserveLoggingContext
from synapse.types import UserID
import synapse.metrics

Expand Down Expand Up @@ -278,15 +277,14 @@ def set_state(self, target_user, auth_user, state):
now_online = state["presence"] != PresenceState.OFFLINE
was_polling = target_user in self._user_cachemap

with PreserveLoggingContext():
if now_online and not was_polling:
self.start_polling_presence(target_user, state=state)
elif not now_online and was_polling:
self.stop_polling_presence(target_user)
if now_online and not was_polling:
self.start_polling_presence(target_user, state=state)
elif not now_online and was_polling:
self.stop_polling_presence(target_user)

# TODO(paul): perform a presence push as part of start/stop poll so
# we don't have to do this all the time
self.changed_presencelike_data(target_user, state)
# TODO(paul): perform a presence push as part of start/stop poll so
# we don't have to do this all the time
self.changed_presencelike_data(target_user, state)

def bump_presence_active_time(self, user, now=None):
if now is None:
Expand Down Expand Up @@ -408,10 +406,10 @@ def accept_presence(self, observed_user, observer_user):
yield self.store.set_presence_list_accepted(
observer_user.localpart, observed_user.to_string()
)
with PreserveLoggingContext():
self.start_polling_presence(
observer_user, target_user=observed_user
)

self.start_polling_presence(
observer_user, target_user=observed_user
)

@defer.inlineCallbacks
def deny_presence(self, observed_user, observer_user):
Expand All @@ -430,10 +428,9 @@ def drop(self, observed_user, observer_user):
observer_user.localpart, observed_user.to_string()
)

with PreserveLoggingContext():
self.stop_polling_presence(
observer_user, target_user=observed_user
)
self.stop_polling_presence(
observer_user, target_user=observed_user
)

@defer.inlineCallbacks
def get_presence_list(self, observer_user, accepted=None):
Expand Down Expand Up @@ -766,8 +763,7 @@ def incoming_presence(self, origin, content):
if not self._remote_sendmap[user]:
del self._remote_sendmap[user]

with PreserveLoggingContext():
yield defer.DeferredList(deferreds, consumeErrors=True)
yield defer.DeferredList(deferreds, consumeErrors=True)

@defer.inlineCallbacks
def push_update_to_local_and_remote(self, observed_user, statuscache,
Expand Down
15 changes: 7 additions & 8 deletions synapse/handlers/profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,14 +154,13 @@ def collect_presencelike_data(self, user, state):
if not self.hs.is_mine(user):
defer.returnValue(None)

with PreserveLoggingContext():
(displayname, avatar_url) = yield defer.gatherResults(
[
self.store.get_profile_displayname(user.localpart),
self.store.get_profile_avatar_url(user.localpart),
],
consumeErrors=True
)
(displayname, avatar_url) = yield defer.gatherResults(
[
self.store.get_profile_displayname(user.localpart),
self.store.get_profile_avatar_url(user.localpart),
],
consumeErrors=True
)

state["displayname"] = displayname
state["avatar_url"] = avatar_url
Expand Down
6 changes: 5 additions & 1 deletion synapse/http/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
# limitations under the License.

from synapse.api.errors import CodeMessageException
from synapse.util.logcontext import preserve_context_over_fn
from syutil.jsonutil import encode_canonical_json
import synapse.metrics

Expand Down Expand Up @@ -61,7 +62,10 @@ def request(self, method, *args, **kwargs):
# A small wrapper around self.agent.request() so we can easily attach
# counters to it
outgoing_requests_counter.inc(method)
d = self.agent.request(method, *args, **kwargs)
d = preserve_context_over_fn(
self.agent.request,
method, *args, **kwargs
)

def _cb(response):
incoming_responses_counter.inc(method, response.code)
Expand Down
32 changes: 16 additions & 16 deletions synapse/http/matrixfederationclient.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@

from synapse.http.endpoint import matrix_federation_endpoint
from synapse.util.async import sleep
from synapse.util.logcontext import PreserveLoggingContext
from synapse.util.logcontext import preserve_context_over_fn
import synapse.metrics

from syutil.jsonutil import encode_canonical_json
Expand Down Expand Up @@ -144,22 +144,22 @@ def _create_request(self, destination, method, path_bytes,
producer = body_callback(method, url_bytes, headers_dict)

try:
with PreserveLoggingContext():
request_deferred = self.agent.request(
destination,
endpoint,
method,
path_bytes,
param_bytes,
query_bytes,
Headers(headers_dict),
producer
)
request_deferred = preserve_context_over_fn(
self.agent.request,
destination,
endpoint,
method,
path_bytes,
param_bytes,
query_bytes,
Headers(headers_dict),
producer
)

response = yield self.clock.time_bound_deferred(
request_deferred,
time_out=60,
)
response = yield self.clock.time_bound_deferred(
request_deferred,
time_out=60,
)

logger.debug("Got response to %s", method)
break
Expand Down
16 changes: 7 additions & 9 deletions synapse/notifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from twisted.internet import defer

from synapse.util.logutils import log_function
from synapse.util.logcontext import PreserveLoggingContext
from synapse.util.logcontext import preserve_context_over_deferred
from synapse.types import StreamToken
import synapse.metrics

Expand Down Expand Up @@ -223,11 +223,10 @@ def notify(listener):
def eb(failure):
logger.exception("Failed to notify listener", failure)

with PreserveLoggingContext():
yield defer.DeferredList(
yield defer.DeferredList(
[notify(l).addErrback(eb) for l in listeners],
consumeErrors=True,
)
)

@defer.inlineCallbacks
@log_function
Expand Down Expand Up @@ -298,11 +297,10 @@ def eb(failure):
failure.getTracebackObject())
)

with PreserveLoggingContext():
yield defer.DeferredList(
[notify(l).addErrback(eb) for l in listeners],
consumeErrors=True,
)
yield defer.DeferredList(
[notify(l).addErrback(eb) for l in listeners],
consumeErrors=True,
)

@defer.inlineCallbacks
def wait_for_events(self, user, rooms, filter, timeout, callback):
Expand Down
11 changes: 6 additions & 5 deletions synapse/storage/_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from synapse.events import FrozenEvent
from synapse.events.utils import prune_event
from synapse.util.logutils import log_function
from synapse.util.logcontext import PreserveLoggingContext, LoggingContext
from synapse.util.logcontext import preserve_context_over_fn, LoggingContext
from synapse.util.lrucache import LruCache
import synapse.metrics

Expand Down Expand Up @@ -419,10 +419,11 @@ def inner_func(conn, *args, **kwargs):
self._txn_perf_counters.update(desc, start, end)
sql_txn_timer.inc_by(duration, desc)

with PreserveLoggingContext():
result = yield self._db_pool.runWithConnection(
inner_func, *args, **kwargs
)
result = yield preserve_context_over_fn(
self._db_pool.runWithConnection,
inner_func, *args, **kwargs
)

for after_callback, after_args in after_callbacks:
after_callback(*after_args)
defer.returnValue(result)
Expand Down
8 changes: 5 additions & 3 deletions synapse/util/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.

from synapse.util.logcontext import LoggingContext
from synapse.util.logcontext import LoggingContext, PreserveLoggingContext

from twisted.internet import defer, reactor, task

Expand Down Expand Up @@ -50,8 +50,10 @@ def call_later(self, delay, callback):
current_context = LoggingContext.current_context()

def wrapped_callback():
LoggingContext.thread_local.current_context = current_context
callback()
with PreserveLoggingContext():
LoggingContext.thread_local.current_context = current_context
callback()

return reactor.callLater(delay, wrapped_callback)

def cancel_call_later(self, timer):
Expand Down
6 changes: 2 additions & 4 deletions synapse/util/async.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,13 @@

from twisted.internet import defer, reactor

from .logcontext import PreserveLoggingContext
from .logcontext import preserve_context_over_deferred


@defer.inlineCallbacks
def sleep(seconds):
d = defer.Deferred()
reactor.callLater(seconds, d.callback, seconds)
with PreserveLoggingContext():
yield d
return preserve_context_over_deferred(d)


def run_on_reactor():
Expand Down
Loading

0 comments on commit 4768992

Please sign in to comment.