[ 
https://issues.apache.org/jira/browse/LOG4J2-3452?focusedWorklogId=894785&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-894785
 ]

ASF GitHub Bot logged work on LOG4J2-3452:
------------------------------------------

                Author: ASF GitHub Bot
            Created on: 08/Dec/23 18:56
            Start Date: 08/Dec/23 18:56
    Worklog Time Spent: 10m 
      Work Description: ppkarwasz commented on PR #809:
URL: https://github.com/apache/logging-log4j2/pull/809#issuecomment-1847671971

   @merkisoft,
   
   The main point of @stefanvodita's PR is that `File.mkdirs` returns `false` 
if the directory exits or a file system error occurs, we can not differentiate 
the two cases. `Files.createDirectories` on the other hand throws an exception 
only in the latter case.
   
   I don't see anything wrong in adding a `Files.exists` call in front of 
`Files.createDirectories`. You can create a PR for it.
   
   **Remark**: with `Files.exists` you still need to add a "read" permission on 
the log dir.




Issue Time Tracking
-------------------

    Worklog Id:     (was: 894785)
    Time Spent: 40m  (was: 0.5h)

> Race condition in FileUtils.mkdir()
> -----------------------------------
>
>                 Key: LOG4J2-3452
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-3452
>             Project: Log4j 2
>          Issue Type: Bug
>    Affects Versions: 2.13.0
>            Reporter: Stefan Vodita
>            Priority: Major
>          Time Spent: 40m
>  Remaining Estimate: 0h
>
> I noticed an error like:
> {{ERROR Unable to create file ...}}
> {{at org.apache.logging.log4j.core.util.FileUtils.mkdir(FileUtils.java:118)}}
>  
> The error could be due to a race condition:
> {{Thread A: dir.exists() -> false}}
> {{Thread B: dir.exists() -> false}}
> {{Thread B: dir.mkdirs() -> succeeds}}
> {{Thread A: dir.mkdirs() -> throws exception}}
>  
> I wrote a unit test which reproduces the error:
> {{public void testMkdirConcurrent() throws IOException {}}
> {{        final File file = new File("target/test/test");}}
> {{        for (int i = 0; i < 1000; i++) {}}
> {{            new Thread(() -> assertDoesNotThrow(() -> FileUtils.mkdir(file, 
> true))).start();}}
> {{        org.apache.commons.io.FileUtils.deleteDirectory(file);}}
> {{}}}
>  
> As a fix, we can use {{{}Files.createDirectories(){}}}, since this does the 
> existence check and creation as one atomic operation.
>  
> I will create a PR with the unit test and a fix.
>  
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to