Search code examples
pythonmysqlsqlalchemymariadbcelery

Celery can't mark task as done


When the version of mariadb (to MariaDB 10.7. 8) was updated, Celery began to pour out warnings when it tries to mark the task as completed.

Tell me what to do to solve it.

WARNING - py.warnings - /usr/local/lib/python3.9/site-packages/celery/app/trace.py:660: RuntimeWarning: Exception raised outside body: StatementError('(sqlalchemy.exc.OperationalError) (MySQLdb._exceptions.OperationalError) (4091, "Unknown SEQUENCE: \'task_id_sequence\'")'):
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1978, in _cursor_execute
    self.dialect.do_execute(cursor, statement, parameters, context)
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 736, in do_execute
    cursor.execute(statement, parameters)
  File "/usr/local/lib/python3.9/site-packages/MySQLdb/cursors.py", line 209, in execute
    res = self._query(query)
  File "/usr/local/lib/python3.9/site-packages/MySQLdb/cursors.py", line 315, in _query
    db.query(q)
  File "/usr/local/lib/python3.9/site-packages/MySQLdb/connections.py", line 239, in query
    _mysql.connection.query(self, query)
MySQLdb._exceptions.OperationalError: (4091, "Unknown SEQUENCE: 'task_id_sequence'")

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1800, in _execute_context
    context = constructor(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 1026, in _init_compiled
    self._process_executesingle_defaults()
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 1928, in _process_executesingle_defaults
    val = self.get_insert_default(c)
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 1872, in get_insert_default
    return self._exec_default(column, column.default, column.type)
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 1733, in _exec_default
    return self.fire_sequence(default, type_)
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/base.py", line 1153, in fire_sequence
    return self._execute_scalar(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 1320, in _execute_scalar
    conn._cursor_execute(self.cursor, stmt, parameters, context=self)
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1980, in _cursor_execute
    self._handle_dbapi_exception(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 2124, in _handle_dbapi_exception
    util.raise_(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/util/compat.py", line 211, in raise_
    raise exception
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1978, in _cursor_execute
    self.dialect.do_execute(cursor, statement, parameters, context)
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 736, in do_execute
    cursor.execute(statement, parameters)
  File "/usr/local/lib/python3.9/site-packages/MySQLdb/cursors.py", line 209, in execute
    res = self._query(query)
  File "/usr/local/lib/python3.9/site-packages/MySQLdb/cursors.py", line 315, in _query
    db.query(q)
  File "/usr/local/lib/python3.9/site-packages/MySQLdb/connections.py", line 239, in query
    _mysql.connection.query(self, query)
sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (4091, "Unknown SEQUENCE: 'task_id_sequence'")
[SQL: select nextval(task_id_sequence)]
(Background on this error at: https://sqlalche.me/e/14/e3q8)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/celery/app/trace.py", line 518, in trace_task
    task.backend.mark_as_done(
  File "/usr/local/lib/python3.9/site-packages/celery/backends/base.py", line 162, in mark_as_done
    self.store_result(task_id, result, state, request=request)
  File "/usr/local/lib/python3.9/site-packages/celery/backends/base.py", line 528, in store_result
    self._store_result(task_id, result, state, traceback,
  File "/usr/local/lib/python3.9/site-packages/celery/backends/database/__init__.py", line 47, in _inner
    return fun(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/celery/backends/database/__init__.py", line 123, in _store_result
    session.flush()
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/orm/session.py", line 3444, in flush
    self._flush(objects)
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/orm/session.py", line 3584, in _flush
    transaction.rollback(_capture_exception=True)
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
    compat.raise_(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/util/compat.py", line 211, in raise_
    raise exception
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/orm/session.py", line 3544, in _flush
    flush_context.execute()
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/orm/unitofwork.py", line 456, in execute
    rec.execute(self)
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/orm/unitofwork.py", line 630, in execute
    util.preloaded.orm_persistence.save_obj(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/orm/persistence.py", line 245, in save_obj
    _emit_insert_statements(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/orm/persistence.py", line 1238, in _emit_insert_statements
    result = connection._execute_20(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1705, in _execute_20
    return meth(self, args_10style, kwargs_10style, execution_options)
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/sql/elements.py", line 334, in _execute_on_connection
    return connection._execute_clauseelement(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1572, in _execute_clauseelement
    ret = self._execute_context(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1806, in _execute_context
    self._handle_dbapi_exception(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 2124, in _handle_dbapi_exception
    util.raise_(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/util/compat.py", line 211, in raise_
    raise exception
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1800, in _execute_context
    context = constructor(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 1026, in _init_compiled
    self._process_executesingle_defaults()
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 1928, in _process_executesingle_defaults
    val = self.get_insert_default(c)
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 1872, in get_insert_default
    return self._exec_default(column, column.default, column.type)
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 1733, in _exec_default
    return self.fire_sequence(default, type_)
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/base.py", line 1153, in fire_sequence
    return self._execute_scalar(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 1320, in _execute_scalar
    conn._cursor_execute(self.cursor, stmt, parameters, context=self)
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1980, in _cursor_execute
    self._handle_dbapi_exception(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 2124, in _handle_dbapi_exception
    util.raise_(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/util/compat.py", line 211, in raise_
    raise exception
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1978, in _cursor_execute
    self.dialect.do_execute(cursor, statement, parameters, context)
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 736, in do_execute
    cursor.execute(statement, parameters)
  File "/usr/local/lib/python3.9/site-packages/MySQLdb/cursors.py", line 209, in execute
    res = self._query(query)
  File "/usr/local/lib/python3.9/site-packages/MySQLdb/cursors.py", line 315, in _query
    db.query(q)
  File "/usr/local/lib/python3.9/site-packages/MySQLdb/connections.py", line 239, in query
    _mysql.connection.query(self, query)
sqlalchemy.exc.StatementError: (sqlalchemy.exc.OperationalError) (MySQLdb._exceptions.OperationalError) (4091, "Unknown SEQUENCE: 'task_id_sequence'")
[SQL: INSERT INTO celery_taskmeta (id, task_id, status, result, date_done, traceback) VALUES (%s, %s, %s, %s, %s, %s)]
[parameters: [{'task_id': '2d5c94c0-d776-48b4-8875-460f7eaf4025', 'result': None, 'traceback': None}]]
(Background on this error at: https://sqlalche.me/e/14/e3q8)

package versions:
celery - 5.2.7
sqlachemy - 1.4.46
mysqlclient - 1.4.6
pymysql - 1.0.2

Didn't find anything to do with it. I need to do something with the table to get rid of the errors.


Solution

  • It would appear that your database was not completely/properly updated. Something is trying to reference a sequence (for an autoincrementing column ID column, I would guess) that does not exist. The sequence is task_id_sequence. I'm guessing your upgrade moved from a simple autoincrement to using a sequence.

    I would try to create the sequence with something like:

    CREATE SEQUENCE task_id_sequence START WITH <desired_start>;
    

    where desired_start should likely be replaced with the highest existing task_id + 1.