You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by "Aizhamal Nurmamat kyzy (JIRA)" <ji...@apache.org> on 2019/05/18 03:14:05 UTC

[jira] [Updated] (AIRFLOW-2160) Changing task instance state fails when id or execution date contains a dot

     [ https://issues.apache.org/jira/browse/AIRFLOW-2160?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Aizhamal Nurmamat kyzy updated AIRFLOW-2160:
--------------------------------------------
         Labels: webapp  (was: )
    Component/s:     (was: webapp)

Moving to ui component as part of component refactor. Webapp component will be removed.

> Changing task instance state fails when id or execution date contains a dot
> ---------------------------------------------------------------------------
>
>                 Key: AIRFLOW-2160
>                 URL: https://issues.apache.org/jira/browse/AIRFLOW-2160
>             Project: Apache Airflow
>          Issue Type: Bug
>          Components: ui
>    Affects Versions: 1.10.0, 2.0.0
>            Reporter: Christian Mladenov
>            Assignee: Christian Mladenov
>            Priority: Minor
>              Labels: webapp
>             Fix For: 2.0.0
>
>
> When there is a dot in a task's ID or in its execution date [1], changing its state from the UI fails.
> What the user sees is the non-descript Oops:
> {code:java}
>                           ____/ (  (    )   )  \___
>                          /( (  (  )   _    ))  )   )\
>                        ((     (   )(    )  )   (   )  )
>                      ((/  ( _(   )   (   _) ) (  () )  )
>                     ( (  ( (_)   ((    (   )  .((_ ) .  )_
>                    ( (  )    (      (  )    )   ) . ) (   )
>                   (  (   (  (   ) (  _  ( _) ).  ) . ) ) ( )
>                   ( (  (   ) (  )   (  ))     ) _)(   )  )  )
>                  ( (  ( \ ) (    (_  ( ) ( )  )   ) )  )) ( )
>                   (  (   (  (   (_ ( ) ( _    )  ) (  )  )   )
>                  ( (  ( (  (  )     (_  )  ) )  _)   ) _( ( )
>                   ((  (   )(    (     _    )   _) _(_ (  (_ )
>                    (_((__(_(__(( ( ( |  ) ) ) )_))__))_)___)
>                    ((__)        \\||lll|l||///          \_))
>                             (   /(/ (  )  ) )\   )
>                           (    ( ( ( | | ) ) )\   )
>                            (   /(| / ( )) ) ) )) )
>                          (     ( ((((_(|)_)))))     )
>                           (      ||\(|(|)|/||     )
>                         (        |(||(||)||||        )
>                           (     //|/l|||)|\\ \     )
>                         (/ / //  /|//||||\\  \ \  \ _)
> -------------------------------------------------------------------------------
> Node: d6b08a99dfda
> -------------------------------------------------------------------------------
> Traceback (most recent call last):
>   File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1982, in wsgi_app
>     response = self.full_dispatch_request()
>   File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1614, in full_dispatch_request
>     rv = self.handle_user_exception(e)
>   File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1517, in handle_user_exception
>     reraise(exc_type, exc_value, tb)
>   File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1612, in full_dispatch_request
>     rv = self.dispatch_request()
>   File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1598, in dispatch_request
>     return self.view_functions[rule.endpoint](**req.view_args)
>   File "/usr/local/lib/python2.7/site-packages/flask_admin/base.py", line 69, in inner
>     return self._run_view(f, *args, **kwargs)
>   File "/usr/local/lib/python2.7/site-packages/flask_admin/base.py", line 368, in _run_view
>     return fn(self, *args, **kwargs)
>   File "/usr/local/lib/python2.7/site-packages/flask_admin/model/base.py", line 2068, in action_view
>     return self.handle_action()
>   File "/usr/local/lib/python2.7/site-packages/flask_admin/actions.py", line 113, in handle_action
>     response = handler[0](ids)
>   File "/usr/local/lib/python2.7/site-packages/airflow/utils/db.py", line 69, in wrapper
>     return func(*args, **kwargs)
>   File "/usr/local/lib/python2.7/site-packages/airflow/www/views.py", line 2591, in action_clear
>     raise Exception("Ooops")
> Exception: Ooops{code}
> The actual exception is something like:
> {code:java}
> Traceback (most recent call last):
>   File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1982, in wsgi_app
>     response = self.full_dispatch_request()
>   File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1614, in full_dispatch_request
>     rv = self.handle_user_exception(e)
>   File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1517, in handle_user_exception
>     reraise(exc_type, exc_value, tb)
>   File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1612, in full_dispatch_request
>     rv = self.dispatch_request()
>   File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1598, in dispatch_request
>     return self.view_functions[rule.endpoint](**req.view_args)
>   File "/usr/local/lib/python2.7/site-packages/flask_admin/base.py", line 69, in inner
>     return self._run_view(f, *args, **kwargs)
>   File "/usr/local/lib/python2.7/site-packages/flask_admin/base.py", line 368, in _run_view
>     return fn(self, *args, **kwargs)
>   File "/usr/local/lib/python2.7/site-packages/flask_admin/model/base.py", line 2068, in action_view
>     return self.handle_action()
>   File "/usr/local/lib/python2.7/site-packages/flask_admin/actions.py", line 113, in handle_action
>     response = handler[0](ids)
>   File "/usr/local/lib/python2.7/site-packages/airflow/utils/db.py", line 69, in wrapper
>     return func(*args, **kwargs)
>   File "/usr/local/lib/python2.7/site-packages/airflow/www/views.py", line 2573, in action_clear
>     execution_date = parse_execution_date(execution_date)
>   File "/usr/local/lib/python2.7/site-packages/airflow/utils/dates.py", line 247, in parse_execution_date
>     return timezone.parse(execution_date_str)
>   File "/usr/local/lib/python2.7/site-packages/airflow/utils/timezone.py", line 152, in parse
>     return pendulum.parse(string, tz=TIMEZONE)
>   File "/usr/local/lib/python2.7/site-packages/pendulum/parser.py", line 75, in parse
>     return Parser(**options).parse(text)
>   File "/usr/local/lib/python2.7/site-packages/pendulum/parser.py", line 31, in parse
>     parsed = super(Parser, self).parse(text)
>   File "/usr/local/lib/python2.7/site-packages/pendulum/parsing/parser.py", line 297, in parse
>     return self.normalize(self._parse(text))
>   File "/usr/local/lib/python2.7/site-packages/pendulum/parsing/parser.py", line 355, in _parse
>     raise ParserError('Invalid date string: {}'.format(text))
> ParserError: Invalid date string: 2018-02-28 20:21:40..819909+00:00{code}
> The reason for this is that Flask-Admin's {{iterencode}} function encodes composite primary keys using dot as the escape symbol. If there is already a dot in any of the values, it is doubled [2].
> On decoding however, Airflow is currently just splitting the string on a comma [3].
> The solution would be simple - use Flask-Admin's {{iterdecode}} function which is already used in another place in views.py [4].
> [1] Dot in the execution date happens when a DAG is run manually. Then the execution date can contain milliseconds (at least in Postgres)
> [2] iterencode escapes a dot with 2 dots: https://github.com/flask-admin/flask-admin/blob/d57048b041c737f8f4b61f9a2260fc0607dff2aa/flask_admin/tools.py#L118
> [3]
> [https://github.com/apache/incubator-airflow/blob/343af062b6426e0e5e5cd1fa2d8c397ad4c626a3/airflow/www/views.py#L2573] and  [https://github.com/apache/incubator-airflow/blob/343af062b6426e0e5e5cd1fa2d8c397ad4c626a3/airflow/www/views.py#L2607]
> [4] 
> [https://github.com/apache/incubator-airflow/blob/343af062b6426e0e5e5cd1fa2d8c397ad4c626a3/airflow/www/views.py#L2629]
>  
>  



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