Clear logger txn_id after making requests

Otherwise, transaction IDs start bleeding over to messages where they
don't make sense.

Change-Id: I7cf1b0ee7f928fcaa89a799a734e0d028d705383
This commit is contained in:
Tim Burke
2017-09-26 22:26:56 +00:00
parent 27478f07c3
commit d13eeabdb5
3 changed files with 58 additions and 30 deletions

View File

@@ -13,7 +13,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from eventlet import sleep, Timeout from eventlet import sleep, Timeout, spawn
from eventlet.green import httplib, socket from eventlet.green import httplib, socket
import json import json
import six import six
@@ -202,7 +202,8 @@ class InternalClient(object):
if params: if params:
req.params = params req.params = params
try: try:
resp = req.get_response(self.app) # execute in a separate greenthread to not polute corolocals
resp = spawn(req.get_response, self.app).wait()
except (Exception, Timeout): except (Exception, Timeout):
exc_type, exc_value, exc_traceback = exc_info() exc_type, exc_value, exc_traceback = exc_info()
else: else:

View File

@@ -913,7 +913,6 @@ class ContainerSharder(ContainerSharderConf, ContainerReplicator):
'X-Backend-Include-Deleted': str(include_deleted)} 'X-Backend-Include-Deleted': str(include_deleted)}
if newest: if newest:
headers['X-Newest'] = 'true' headers['X-Newest'] = 'true'
try:
try: try:
resp = self.int_client.make_request( resp = self.int_client.make_request(
'GET', path, headers, acceptable_statuses=(2,), 'GET', path, headers, acceptable_statuses=(2,),
@@ -940,8 +939,6 @@ class ContainerSharder(ContainerSharderConf, ContainerReplicator):
"Failed to get shard ranges from %s: invalid data: %r", "Failed to get shard ranges from %s: invalid data: %r",
quote(broker.root_path), err) quote(broker.root_path), err)
return None return None
finally:
self.logger.txn_id = None
def _put_container(self, node, part, account, container, headers, body): def _put_container(self, node, part, account, container, headers, body):
try: try:

View File

@@ -25,7 +25,8 @@ from textwrap import dedent
import six import six
from six.moves import range, zip_longest from six.moves import range, zip_longest
from six.moves.urllib.parse import quote, parse_qsl from six.moves.urllib.parse import quote, parse_qsl
from swift.common import exceptions, internal_client, request_helpers, swob from swift.common import exceptions, internal_client, request_helpers, swob, \
utils
from swift.common.header_key_dict import HeaderKeyDict from swift.common.header_key_dict import HeaderKeyDict
from swift.common.storage_policy import StoragePolicy from swift.common.storage_policy import StoragePolicy
from swift.common.middleware.proxy_logging import ProxyLoggingMiddleware from swift.common.middleware.proxy_logging import ProxyLoggingMiddleware
@@ -347,6 +348,35 @@ class TestInternalClient(unittest.TestCase):
client = InternalClient(self) client = InternalClient(self)
client.make_request('GET', '/', {}, (200,)) client.make_request('GET', '/', {}, (200,))
def test_make_request_clears_txn_id_after_calling_app(self):
class InternalClient(internal_client.InternalClient):
def __init__(self, test, logger):
def fake_app(env, start_response):
self.app.logger.txn_id = 'foo'
self.app.logger.debug('Inside of request')
start_response('200 Ok', [('Content-Length', '0')])
return []
self.test = test
self.user_agent = 'some_agent'
self.app = fake_app
self.app.logger = logger
self.request_tries = 1
self.use_replication_network = False
fake_logger = debug_logger()
logger = utils.LogAdapter(fake_logger, 'test-server')
logger.debug('Before request')
client = InternalClient(self, logger)
client.make_request('GET', '/', {}, (200,))
logger.debug('After request')
self.assertEqual([(args[0], kwargs['extra'].get('txn_id'))
for args, kwargs in fake_logger.log_dict['debug']], [
('Before request', None),
('Inside of request', 'foo'),
('After request', None),
])
def test_make_request_defaults_replication_network_header(self): def test_make_request_defaults_replication_network_header(self):
class InternalClient(internal_client.InternalClient): class InternalClient(internal_client.InternalClient):
def __init__(self, test): def __init__(self, test):