[
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)