Skip to content

Commit b893c9b

Browse files
authored
Merge pull request #464 from wangzlei/master
fix log stack overflow if metadata contains circular reference
2 parents 859901c + d80f137 commit b893c9b

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

aws_xray_sdk/core/utils/conversion.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ def metadata_to_dict(obj):
3030
return metadata
3131
else:
3232
return obj
33-
except Exception:
34-
log.exception("Failed to convert metadata to dict")
33+
except Exception as e:
34+
import pprint
35+
log.warning("Failed to convert metadata to dict:\n%s", pprint.pformat(getattr(e, "args", None)))
3536
return {}

tests/util.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@
44
from aws_xray_sdk.core.recorder import AWSXRayRecorder
55
from aws_xray_sdk.core.emitters.udp_emitter import UDPEmitter
66
from aws_xray_sdk.core.sampling.sampler import DefaultSampler
7+
from aws_xray_sdk.core.utils.conversion import metadata_to_dict
8+
9+
10+
class CircularReferenceClass:
11+
"""Test class that can create circular references"""
12+
def __init__(self, name):
13+
self.name = name
14+
self.ref = None
715

816

917
class StubbedEmitter(UDPEmitter):
@@ -99,3 +107,15 @@ def _search_entity_by_annotation(entity, key, value):
99107
if result is not None:
100108
return result
101109
return None
110+
111+
112+
def test_metadata_to_dict_self_reference():
113+
"""Test that self-referencing objects don't cause stack overflow"""
114+
obj = CircularReferenceClass("self_ref")
115+
obj.ref = obj # Self reference
116+
117+
# This should not cause stack overflow
118+
result = metadata_to_dict(obj)
119+
120+
# The function should handle the self reference gracefully
121+
assert isinstance(result, dict)

0 commit comments

Comments
 (0)