[ 
https://issues.apache.org/jira/browse/AIRFLOW-2870?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16572816#comment-16572816
 ] 

George Leslie-Waksman commented on AIRFLOW-2870:
------------------------------------------------

The process to reproduce is as follows:
 # Start with an Airflow deployment that predates 
{{cc1e65623dc7_add_max_tries_column_to_task_instance.py}} (e.g. 1.8.1)
 # Run Airflow enough to populate task_instances in the metadata database (run 
one of the sample dags)
 # Install an Airflow version after 
{{27c6a30d7c24_add_executor_config_to_task_instance.py}} (e.g. 1.10rc3)
 # {{airflow upgradedb}}

This will fail with a message about the column "task_instance.executor_config" 
not existing.

My current understanding of what is happening:
 * When constructing a sqlalchemy orm query using a declarative model (i.e. 
{{TaskInstance}}), the database table must be consistent with the structure of 
that model.
 ** SQLAlchemy's mapper will query all columns known to the orm mapper (code 
side) and assume they exist in the database
 * When running a migration, the database table is in a transitionary state
 * The code in {{airflow/models.py}} reflects the state of the database after 
running ALL migrations through the present
* When we are using the 1.10rc3 code to run migrations and we reach 
{{cc1e65623dc7_add_max_tries_column_to_task_instance.py}}, we [import 
TaskInstance|https://github.com/apache/incubator-airflow/blob/master/airflow/migrations/versions/cc1e65623dc7_add_max_tries_column_to_task_instance.py#L36]
 as if it has all future columns and then [query the old 
schema|https://github.com/apache/incubator-airflow/blob/master/airflow/migrations/versions/cc1e65623dc7_add_max_tries_column_to_task_instance.py#L64]

Under typical circumstances, one can avoid this issue by performing migrations 
using alembic + SQLAlchemy core (no orm) and directly manipulating the tables. 
However, in this case, we need to populate information from a {{Task}} object 
that does not have a representation in the database.

We may be able to work around the database issues by manipulating SQLAlchemy's 
[column 
loading|http://docs.sqlalchemy.org/en/latest/orm/loading_columns.html#load-only-cols]
 but that may be tricky given the intertwined nature of Airflow's model code.

> Migrations fail when upgrading from below 
> cc1e65623dc7_add_max_tries_column_to_task_instance
> --------------------------------------------------------------------------------------------
>
>                 Key: AIRFLOW-2870
>                 URL: https://issues.apache.org/jira/browse/AIRFLOW-2870
>             Project: Apache Airflow
>          Issue Type: Bug
>            Reporter: George Leslie-Waksman
>            Priority: Blocker
>
> Running migrations from below 
> cc1e65623dc7_add_max_tries_column_to_task_instance.py fail with:
> {noformat}
> INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
> INFO  [alembic.runtime.migration] Will assume transactional DDL.
> INFO  [alembic.runtime.migration] Running upgrade 127d2bf2dfa7 -> 
> cc1e65623dc7, add max tries column to task instance
> Traceback (most recent call last):
>   File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", 
> line 1182, in _execute_context
>     context)
>   File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", 
> line 470, in do_execute
>     cursor.execute(statement, parameters)
> psycopg2.ProgrammingError: column task_instance.executor_config does not exist
> LINE 1: ...ued_dttm, task_instance.pid AS task_instance_pid, task_insta...
> {noformat}
> The failure is occurring because 
> cc1e65623dc7_add_max_tries_column_to_task_instance.py imports TaskInstance 
> from the current code version, which has changes to the task_instance table 
> that are not expected by the migration.
> Specifically, 27c6a30d7c24_add_executor_config_to_task_instance.py adds an 
> executor_config column that does not exist as of when 
> cc1e65623dc7_add_max_tries_column_to_task_instance.py is run.
> It is worth noting that this will not be observed for new installs because 
> the migration branches on table existence/non-existence at a point that will 
> hide the issue from new installs.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to