You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by "ASF GitHub Bot (JIRA)" <ji...@apache.org> on 2019/04/05 17:53:00 UTC

[jira] [Commented] (AIRFLOW-4248) FileExistsError when creating log dir in file_processor_handler.py

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

ASF GitHub Bot commented on AIRFLOW-4248:
-----------------------------------------

kppullin commented on pull request #5047: [AIRFLOW-4248] Fix 'FileExistsError' makedirs() race condition
URL: https://github.com/apache/airflow/pull/5047
 
 
   Make sure you have checked _all_ steps below.
   
   ### Jira
   
   - [X] My PR addresses the following [Airflow Jira](https://issues.apache.org/jira/browse/AIRFLOW/) issues and references them in the PR title. For example, "\[AIRFLOW-XXX\] My Airflow PR"
     - https://issues.apache.org/jira/browse/AIRFLOW-4248
     - In case you are fixing a typo in the documentation you can prepend your commit with \[AIRFLOW-XXX\], code changes always need a Jira issue.
     - In case you are proposing a fundamental code change, you need to create an Airflow Improvement Proposal ([AIP](https://cwiki.apache.org/confluence/display/AIRFLOW/Airflow+Improvements+Proposals)).
     - In case you are adding a dependency, check if the license complies with the [ASF 3rd Party License Policy](https://www.apache.org/legal/resolved.html#category-x).
   
   ### Description
   
   - [X] Here are some details about my PR, including screenshots of any UI changes:
   
   The `FileProcessorHandler`'s `_init_file` method can trigger an unhandled exception due to a race condition when multiple processes attempt to create the same directory on a shared filesystem.  When this occurs a `FileExistsError` is raised, and if it is the scheduler process, can prevent tasks from starting until the scheduler is restarted.
   
   This PR catches the exception and handles it similarly to how it's done when using the `exists_ok=True` argument of Python v3.2's `os.makedirs` function , which does an `isdir()` call instead of checking for the `EEXIST` error code (comments in `os.makedirs` state that checking for this error code is unreliable because the OS can return other error codes instead).  This PR also replaces the existing `EEXIST` check in the `FileProcessorHandler.__init__` method to instead use `isdir()`.
   
   Note: It'd be slightly nicer to just use the `os.makdirs(exists_ok=True)` parameter instead, which can be done if this PR becomes dependent upon `AIP-3`.
   
   ### Tests
   
   - [] My PR adds the following unit tests __OR__ does not need testing for this extremely good reason:
   
   ### Commits
   
   - [X] My commits all reference Jira issues in their subject lines, and I have squashed multiple commits if they address the same issue. In addition, my commits follow the guidelines from "[How to write a good git commit message](http://chris.beams.io/posts/git-commit/)":
     1. Subject is separated from body by a blank line
     1. Subject is limited to 50 characters (not including Jira issue reference)
     1. Subject does not end with a period
     1. Subject uses the imperative mood ("add", not "adding")
     1. Body wraps at 72 characters
     1. Body explains "what" and "why", not "how"
   
   ### Documentation
   
   - [N/A] In case of new functionality, my PR adds documentation that describes how to use it.
     - All the public functions and the classes in the PR contain docstrings that explain what it does
     - If you implement backwards incompatible changes, please leave a note in the [Updating.md](https://github.com/apache/airflow/blob/master/UPDATING.md) so we can assign it to a appropriate release
   
   ### Code Quality
   
   - [X] Passes `flake8`
   
 
----------------------------------------------------------------
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.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


> FileExistsError when creating log dir in file_processor_handler.py
> ------------------------------------------------------------------
>
>                 Key: AIRFLOW-4248
>                 URL: https://issues.apache.org/jira/browse/AIRFLOW-4248
>             Project: Apache Airflow
>          Issue Type: Bug
>            Reporter: Kevin Pullin
>            Assignee: Kevin Pullin
>            Priority: Major
>
> Similar to AIRFLOW-2065, the `_init_file` method in `file_processor_handler` does not handle the race condition of multiple processes creating the same directory on a shared logging filesystem.
> If the error occurs in the scheduler process, tasks do not execute (at least when using the Kubernetes executor). However the process remains alive and requires a restart to resume running tasks.
>  
> Example log message:
>  
> {noformat}
> [2019-04-03 23:59:55,091] {{sqlalchemy.py:79}} WARNING - DB connection invalidated. Reconnecting...
> Process DagFileProcessor41527-Process:
> Traceback (most recent call last):
>   File "/usr/local/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
>     self.run()
>   File "/usr/local/lib/python3.6/multiprocessing/process.py", line 93, in run
>     self._target(*self._args, **self._kwargs)
>   File "/usr/local/lib/python3.6/site-packages/airflow/jobs.py", line 374, in helper
>     set_context(log, file_path)
>   File "/usr/local/lib/python3.6/site-packages/airflow/utils/log/logging_mixin.py", line 170, in set_context
>     handler.set_context(value)
>   File "/usr/local/lib/python3.6/site-packages/airflow/utils/log/file_processor_handler.py", line 66, in set_context
>     local_loc = self._init_file(filename)
>   File "/usr/local/lib/python3.6/site-packages/airflow/utils/log/file_processor_handler.py", line 141, in _init_file
>     os.makedirs(directory)
>   File "/usr/local/lib/python3.6/os.py", line 220, in makedirs
>     mkdir(name, mode)
> FileExistsError: [Errno 17] File exists: '/usr/local/airflow/logs/scheduler/2019-04-04'{noformat}
>  
> The path `/usr/local/airflow/logs` is on a shared NFS volume.
>  



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