Skip to content

Commit 2cc885f

Browse files
committed
fix: Log NULL KV rows instead of silently skipping them.
1 parent d23fe71 commit 2cc885f

2 files changed

Lines changed: 19 additions & 5 deletions

File tree

services/workspace_tabs.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ def _safe_fetchall(query: str, params: tuple = ()) -> list:
115115
if len(parts) >= 3:
116116
bid = parts[2]
117117
if row["value"] is None:
118+
_logger.warning(
119+
"Skipping Bubble cursorDiskKV row with NULL value: key=%r",
120+
row["key"],
121+
)
118122
continue
119123
try:
120124
parsed = json.loads(row["value"])
@@ -195,6 +199,10 @@ def _safe_fetchall(query: str, params: tuple = ()) -> list:
195199
for row in composer_rows:
196200
composer_id = row["key"].split(":")[1]
197201
if row["value"] is None:
202+
_logger.warning(
203+
"Skipping Composer cursorDiskKV row with NULL value: key=%r",
204+
row["key"],
205+
)
198206
continue
199207
try:
200208
parsed = json.loads(row["value"])

tests/test_workspace_tabs_null_bubble.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,21 @@ def tearDown(self):
7272
def test_null_bubble_row_is_skipped_without_exception(self):
7373
"""assemble_workspace_tabs must not raise when a bubble row has NULL value."""
7474
try:
75-
_payload, status = assemble_workspace_tabs(
76-
workspace_id="global",
77-
workspace_path=self.workspace_path,
78-
rules=[],
79-
)
75+
with self.assertLogs("services.workspace_tabs", level="WARNING") as cm:
76+
_payload, status = assemble_workspace_tabs(
77+
workspace_id="global",
78+
workspace_path=self.workspace_path,
79+
rules=[],
80+
)
8081
except TypeError as exc:
8182
self.fail(f"NULL bubble row raised TypeError: {exc}")
8283

8384
self.assertEqual(status, 200, "NULL bubble row must not turn tabs load into an error response")
85+
messages = [r.getMessage() for r in cm.records]
86+
self.assertTrue(
87+
any("NULL value" in m and "bubble-null" in m for m in messages),
88+
f"expected NULL-value warning for bubble-null row, got: {messages}",
89+
)
8490

8591
def test_healthy_bubbles_still_load_when_null_row_present(self):
8692
"""The healthy bubble surfaces in a tab even when a NULL row is present."""

0 commit comments

Comments
 (0)