mapledan opened a new issue, #30064:
URL: https://github.com/apache/superset/issues/30064
### Bug description
In version 4.0.2, my sql_lab async tasks were functioning correctly with
Celery. However, after upgrading to version 4.1.0rc2, I started encountering
errors when executing sql_lab.get_sql_results. The tasks are now failing with a
psycopg2.errors.SerializationFailure.
My databse is PostgreSQL 15.
Here is my current super_config:
```
GLOBAL_ASYNC_QUERIES_REDIS_CONFIG = {
"port": f"{REDIS_PORT}",
"host": f"{REDIS_HOST}",
"db": 0,
"ssl": False,
}
GLOBAL_ASYNC_QUERIES_REDIS_STREAM_PREFIX = "async-events-"
GLOBAL_ASYNC_QUERIES_REDIS_STREAM_LIMIT = 1000
GLOBAL_ASYNC_QUERIES_REDIS_STREAM_LIMIT_FIREHOSE = 1000000
GLOBAL_ASYNC_QUERIES_JWT_COOKIE_NAME = "async-token"
GLOBAL_ASYNC_QUERIES_JWT_COOKIE_SECURE = True
GLOBAL_ASYNC_QUERIES_JWT_COOKIE_SAMESITE: None
GLOBAL_ASYNC_QUERIES_JWT_COOKIE_DOMAIN = None
GLOBAL_ASYNC_QUERIES_JWT_SECRET = "..."
GLOBAL_ASYNC_QUERIES_TRANSPORT = "ws"
GLOBAL_ASYNC_QUERIES_WEBSOCKET_URL = "wss://.../ws"
RESULTS_BACKEND = RedisCache(
host=REDIS_HOST, port=REDIS_PORT, db=REDIS_RESULTS_DB,
key_prefix='superset_result_')
class CeleryConfig(object):
broker_url = f"redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_CELERY_DB}"
imports = ("superset.sql_lab", "superset.tasks.scheduler")
result_backend = f"redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_RESULTS_DB}"
log_level = "DEBUG"
worker_concurrency = 64
worker_prefetch_multiplier = 2
task_acks_late = False
task_time_limit = 600
task_annotations = {
"sql_lab.get_sql_results": {
"rate_limit": "5/s",
},
"email_reports.send": {
"rate_limit": "5/s",
"time_limit": 180,
"soft_time_limit": 240,
"ignore_result": True,
},
}
CELERY_CONFIG = CeleryConfig
```
### How to reproduce the bug
1. Upgrade from version 4.0.2 to 4.1.0rc2.
2. Set the async query setting.
3. Run query in SQL Lab.
### Screenshots/recordings
```
Traceback (most recent call last):
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py",
line 1910, in _execute_context
self.dialect.do_execute(
File
"/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line
736, in do_execute
cursor.execute(statement, parameters)
psycopg2.errors.SerializationFailure: could not serialize access due to
concurrent update
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/app/superset/sql_lab.py", line 182, in get_sql_results
return execute_sql_statements(
File "/app/superset/sql_lab.py", line 440, in execute_sql_statements
db.session.commit()
File "<string>", line 2, in commit
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py",
line 1454, in commit
self._transaction.commit(_to_root=self.future)
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py",
line 832, in commit
self._prepare_impl()
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py",
line 811, in _prepare_impl
self.session.flush()
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py",
line 3449, in flush
self._flush(objects)
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py",
line 3588, in _flush
with util.safe_reraise():
File
"/usr/local/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line
70, in __exit__
compat.raise_(
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/compat.py",
line 211, in raise_
raise exception
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py",
line 3549, in _flush
flush_context.execute()
File
"/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.py", line
456, in execute
rec.execute(self)
File
"/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.py", line
630, in execute
util.preloaded.orm_persistence.save_obj(
File
"/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line
237, in save_obj
_emit_update_statements(
File
"/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line
1001, in _emit_update_statements
c = connection._execute_20(
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py",
line 1710, in _execute_20
return meth(self, args_10style, kwargs_10style, execution_options)
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/sql/elements.py",
line 334, in _execute_on_connection
return connection._execute_clauseelement(
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py",
line 1577, in _execute_clauseelement
ret = self._execute_context(
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py",
line 1953, in _execute_context
self._handle_dbapi_exception(
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py",
line 2134, in _handle_dbapi_exception
util.raise_(
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/compat.py",
line 211, in raise_
raise exception
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py",
line 1910, in _execute_context
self.dialect.do_execute(
File
"/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line
736, in do_execute
cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (psycopg2.errors.SerializationFailure)
could not serialize access due to concurrent update
[SQL: UPDATE query SET status=%(status)s,
start_running_time=%(start_running_time)s, changed_on=%(changed_on)s WHERE
query.id = %(query_id)s]
[parameters: {'status': <QueryStatus.RUNNING: 'running'>,
'start_running_time': 1725005762062.906, 'changed_on': datetime.datetime(2024,
8, 30, 8, 16, 2, 66679), 'query_id': 77114}]
(Background on this error at: https://sqlalche.me/e/14/e3q8)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/app/superset/sql_lab.py", line 157, in get_query
return db.session.query(Query).filter_by(id=query_id).one()
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/query.py",
line 2870, in one
return self._iter().one()
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/query.py",
line 2916, in _iter
result = self.session.execute(
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py",
line 1716, in execute
conn = self._connection_for_bind(bind)
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py",
line 1555, in _connection_for_bind
return self._transaction._connection_for_bind(
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py",
line 724, in _connection_for_bind
self._assert_active()
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py",
line 604, in _assert_active
raise sa_exc.PendingRollbackError(
sqlalchemy.exc.PendingRollbackError: This Session's transaction has been
rolled back due to a previous exception during flush. To begin a new
transaction with this Session, first issue Session.rollback(). Original
exception was: (psycopg2.errors.SerializationFailure) could not serialize
access due to concurrent update
[SQL: UPDATE query SET status=%(status)s,
start_running_time=%(start_running_time)s, changed_on=%(changed_on)s WHERE
query.id = %(query_id)s]
[parameters: {'status': <QueryStatus.RUNNING: 'running'>,
'start_running_time': 1725005762062.906, 'changed_on': datetime.datetime(2024,
8, 30, 8, 16, 2, 66679), 'query_id': 77114}]
(Background on this error at: https://sqlalche.me/e/14/e3q8) (Background on
this error at: https://sqlalche.me/e/14/7s2a)
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/usr/local/lib/python3.10/site-packages/celery/app/trace.py", line
453, in trace_task
R = retval = fun(*args, **kwargs)
File "/app/superset/initialization/__init__.py", line 111, in __call__
return task_base.__call__(self, *args, **kwargs)
File "/usr/local/lib/python3.10/site-packages/celery/app/trace.py", line
736, in __protected_call__
return self.run(*args, **kwargs)
File "/app/superset/sql_lab.py", line 194, in get_sql_results
query = get_query(query_id)
File "/usr/local/lib/python3.10/site-packages/backoff/_sync.py", line 105,
in retry
ret = target(*args, **kwargs)
File "/app/superset/sql_lab.py", line 159, in get_query
raise SqlLabException("Failed at getting query") from ex
superset.sql_lab.SqlLabException: Failed at getting query
```

### Superset version
master / latest-dev
### Python version
3.10
### Node version
16
### Browser
Chrome
### Additional context
_No response_
### Checklist
- [X] I have searched Superset docs and Slack and didn't find a solution to
my problem.
- [X] I have searched the GitHub issue tracker and didn't find a similar bug
report.
- [X] I have checked Superset's logs for errors and if I found a relevant
Python stacktrace, I included it here as text in the "additional context"
section.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]