Skip to content

Commit 4f7f6c4

Browse files
Silence retryable SQLite lock errors from docket.worker logger
The existing fix in PR #18957 only filtered SQLite lock errors from the uvicorn.error logger. However, when using flow.serve() with SQLite, background tasks like mark_deployments_ready run through docket and log errors through the docket.worker logger, which was not covered. This change extends the SQLite lock log filter to also filter the docket.worker logger, silencing the noisy but harmless 'database is locked' errors that users see during onboarding. Closes #19771 Co-Authored-By: Nate Nowack <[email protected]>
1 parent e0efe42 commit 4f7f6c4

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

src/prefect/server/api/server.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ def _install_sqlite_locked_log_filter() -> None:
156156

157157
filter_ = _SQLiteLockedOperationalErrorFilter()
158158
logging.getLogger("uvicorn.error").addFilter(filter_)
159+
logging.getLogger("docket.worker").addFilter(filter_)
159160
_SQLITE_LOCKED_LOG_FILTER = filter_
160161

161162

tests/server/api/test_server.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,13 @@ async def raise_other_error():
112112
assert response.status_code == 500
113113

114114

115-
def _log_record_for_sqlite_error(orig_exc):
115+
def _log_record_for_sqlite_error(orig_exc, logger_name: str = "uvicorn.error"):
116116
try:
117117
raise sa.exc.OperationalError("statement", {"params": 1}, orig_exc, None)
118118
except sa.exc.OperationalError:
119119
exc_info = sys.exc_info()
120120
return logging.LogRecord(
121-
name="uvicorn.error",
121+
name=logger_name,
122122
level=logging.ERROR,
123123
pathname=__file__,
124124
lineno=1,
@@ -178,6 +178,24 @@ def test_sqlite_locked_log_filter_ignores_non_operational_errors():
178178
assert filter_.filter(record) is True
179179

180180

181+
def test_sqlite_locked_log_filter_works_for_docket_worker_logger():
182+
"""Test that the filter also suppresses SQLite lock errors from docket.worker logger.
183+
184+
This is important because docket background tasks (like mark_deployments_ready)
185+
can hit SQLite locking issues and log errors through the docket.worker logger.
186+
See: https://github.com/PrefectHQ/prefect/issues/19771
187+
"""
188+
filter_ = _SQLiteLockedOperationalErrorFilter()
189+
orig_exc = sqlite3.OperationalError(SQLITE_LOCKED_MSG)
190+
record = _log_record_for_sqlite_error(orig_exc, logger_name="docket.worker")
191+
192+
with temporary_settings({PREFECT_API_LOG_RETRYABLE_ERRORS: False}):
193+
assert filter_.filter(record) is False
194+
195+
with temporary_settings({PREFECT_API_LOG_RETRYABLE_ERRORS: True}):
196+
assert filter_.filter(record) is True
197+
198+
181199
@pytest.mark.parametrize(
182200
"exc",
183201
(

0 commit comments

Comments
 (0)