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

Christopher McDermott commented on NIFI-2928:
---------------------------------------------

I disagree.  Perhaps I am missing something but I am pretty sure we can tell 
the difference between "definitely does not exist" and "can't tell if it 
exists".

See [https://docs.oracle.com/javase/tutorial/essential/io/check.html]

I believe this would do the trick.

{code}
        // Verify that file exists
        java.nio.file.Path p = file.toPath();
        if (Files.notExists(p)) {
            if (!Files.exists(p)) {
                getLogger().log(levelFileNotFound, "Could not fetch file {} 
from file system for {} because the file does not exist; routing to not.found", 
new Object[] {file, flowFile});
                session.getProvenanceReporter().route(flowFile, REL_NOT_FOUND);
                session.transfer(session.penalize(flowFile), REL_NOT_FOUND);
                return;
            }
            else {
                getLogger().log(levelFileNotFound, "Could not fetch file {} 
from file system for {} because the file system could not be accessed; routing 
to Failure", new Object[] {file, flowFile});
                session.getProvenanceReporter().route(flowFile, REL_FAILURE);
                session.transfer(session.penalize(flowFile), REL_FAILURE);
                return;                
            }
        }
{code}

It would be more efficient to use {{checkAccess()}} directly as both 
{{exists()}} and {{notExists()}} call {{checkAccess()}} and make a 
determination base on the the lack of a thrown exception or on the specific 
exception thrown, but that would require rewriting most of the method.

> FetchFile routes to not.found when it cannot determine whether or not the 
> file exists
> -------------------------------------------------------------------------------------
>
>                 Key: NIFI-2928
>                 URL: https://issues.apache.org/jira/browse/NIFI-2928
>             Project: Apache NiFi
>          Issue Type: Bug
>          Components: Core Framework
>    Affects Versions: 0.7.1
>            Reporter: Christopher McDermott
>            Assignee: Oleg Zhurakousky
>             Fix For: 1.1.0
>
>
> I have a flow that reads files from an NFS volume.  To simulate the NFS 
> server being offline/unreachable I am using IP tables to block all TCP 
> traffic between the NFS server and the host running NiFi.
> Trying to read files using FetchFile, I am seeing
> 2016-10-20 20:34:31,789 ERROR [Timer-Driven Process Thread-4] 
> o.a.nifi.processors.standard.FetchFile 
> FetchFile[id=9e642524-0e05-4d58-aabc-d6b49d687917] Could not fetch file 
> /share/st5103/REDACTED from file system for 
> StandardFlowFileRecord[uuid=1f88f322-57a2-4ac5-87df-d53fdd63d52c,claim=StandardContentClaim
>  [resourceClaim=StandardResourceClaim[id=1476995181657-18524, 
> container=default, section=92], offset=569544, 
> length=745],offset=0,name=1248995905448067,size=745] because the file does 
> not exist; routing to not.found
> The file is actually there, but of course it is inaccessible because the 
> network traffic is blocked.
> I see the code is using {{File.exists()}}.
> This [bug|https://bugs.openjdk.java.net/browse/JDK-6191254] report suggest 
> that it should instead use
> {{[File.toPath().checkAccess()|http://download.java.net/jdk7/archive/b123/docs/api/java/nio/file/Path.html#checkAccess(java.nio.file.AccessMode...)]}}
> {{[java.nio.Files.notExists()|http://docs.oracle.com/javase/7docs/api/java/nio/file/Files.html#notExists-java.nio.file.Path-java.nio.file.LinkOption...-]}}
>  uses {{checkAccess()}} and might be a drop-in replacement.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to