From 4c4091f89dac1efcb9edc40ac80d1e46b2306244 Mon Sep 17 00:00:00 2001 From: "sentry[bot]" <39604003+sentry[bot]@users.noreply.github.com> Date: Sat, 5 Sep 2026 22:45:27 +0000 Subject: [PATCH 1/2] fix(redis): Support list types in RedisBuffer serialization --- src/sentry/buffer/redis.py | 9 +++++++-- tests/sentry/buffer/test_redis.py | 12 ++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/sentry/buffer/redis.py b/src/sentry/buffer/redis.py index 4e50145bee20..3fa36fcc87e1 100644 --- a/src/sentry/buffer/redis.py +++ b/src/sentry/buffer/redis.py @@ -272,7 +272,7 @@ def _dump_values(cls, values: dict[Any, Any]) -> dict[Any, tuple[str, str]]: @classmethod def _dump_value( cls, - value: str | datetime | date | int | float | dict[str, Any] | None, + value: str | datetime | date | int | float | dict[str, Any] | list[Any] | None, depth: int = 0, ) -> tuple[str, str]: if depth > 3: @@ -297,6 +297,9 @@ def _dump_value( elif isinstance(value, dict): type_ = "di" value = json.dumps({k: cls._dump_value(v, depth + 1) for k, v in value.items()}) + elif isinstance(value, list): + type_ = "l" + value = json.dumps([cls._dump_value(item, depth + 1) for item in value]) else: raise TypeError(type(value)) return type_, str(value) @@ -313,7 +316,7 @@ def _load_values( @classmethod def _load_value( cls, payload: tuple[str, Any] - ) -> dict[str, Any] | str | datetime | date | int | float | None: + ) -> dict[str, Any] | list[Any] | str | datetime | date | int | float | None: (type_, value) = payload if type_ == "n": return None @@ -332,6 +335,8 @@ def _load_value( elif type_ == "di": value = json.loads(value) return {k: cls._load_value(v) for k, v in value.items()} + elif type_ == "l": + return [cls._load_value(item) for item in json.loads(value)] else: raise TypeError(f"invalid type: {type_}") diff --git a/tests/sentry/buffer/test_redis.py b/tests/sentry/buffer/test_redis.py index 973b344220e8..4222fc51bf3e 100644 --- a/tests/sentry/buffer/test_redis.py +++ b/tests/sentry/buffer/test_redis.py @@ -268,6 +268,18 @@ def test_incr_uses_signal_only(self, default_group, task_runner) -> None: (3.14, "float"), ({"a": {"i": 0}, "b": {"s": ""}}, "dict"), (False, "bool"), + ([1, "a", 3.14], "list"), + ( + [ + { + "parent_group_id": 4889213441, + "should_group": True, + "stacktrace_distance": 0.009, + "message_distance": 0.0, + } + ], + "list_of_dicts", + ), ], ids=lambda input: input[1], ) From e1bd97837749c7cdbb2cff86f8e0605c8ae678c2 Mon Sep 17 00:00:00 2001 From: "sentry[bot]" <39604003+sentry[bot]@users.noreply.github.com> Date: Sat, 5 Sep 2026 23:00:08 +0000 Subject: [PATCH 2/2] fix(redis): Support list types in RedisBuffer serialization --- src/sentry/buffer/redis.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sentry/buffer/redis.py b/src/sentry/buffer/redis.py index 3fa36fcc87e1..d84790139eef 100644 --- a/src/sentry/buffer/redis.py +++ b/src/sentry/buffer/redis.py @@ -307,7 +307,7 @@ def _dump_value( @classmethod def _load_values( cls, payload: dict[str, tuple[str, Any]] - ) -> dict[str, str | datetime | date | int | float | dict[str, Any] | None]: + ) -> dict[str, str | datetime | date | int | float | dict[str, Any] | list[Any] | None]: result = {} for k, (t, v) in payload.items(): result[k] = cls._load_value((t, v))