Hello all,

I'm encountering an error in the TestListFile.java class and in the
testFilterAge() specifically.  This unit test and associated class can be
found in the Nifi-Standard-Bundle.  I've noticed a couple issues have been
reported on ListFile before. My issue is most closely related to this one:
https://issues.apache.org/jira/browse/NIFI-3831, although it may be an
issue altogether separate.  I have never seen this particular test pass
before and I've attempted building several versions of nifi now.

I'm doing the nifi build on a new model mac.  My OS Version is:

18.2.0 Darwin Kernel Version 18.2.0: Fri Oct  5 19:41:49 PDT 2018;
root:xnu-4903.221.2~2/RELEASE_X86_64 x86_64

I noticed that my root file system is apfs via mount -v  */dev/disk1s1 on /
(apfs, local, journaled)*

In looking at the ListFiles.testFilterAge() and related methods I found a
comment above the getTestModifiedTime talking about hfs+ only having
granularity to one second.  For APFS this no longer seems to be the case
based on the the link tagged below.  I've modified this method removing the
minus 1 and it doesn't seem to have any affect on the failures I get.

/*
 * HFS+, default for OS X, only has granularity to one second,
accordingly, we go back in time to establish consistent test cases
 *
 * Provides "now" minus 1 second in millis
*/
private static long getTestModifiedTime() {
    final long nowMillis = System.currentTimeMillis();
    // Subtract a second to avoid possible rounding issues
    final long nowSeconds = TimeUnit.SECONDS.convert(nowMillis,
TimeUnit.MILLISECONDS) - 1;
    return TimeUnit.MILLISECONDS.convert(nowSeconds, TimeUnit.SECONDS);
}

https://www.gillware.com/data-recovery-lab/apfs-apple-file-system/
 "Namely, APFS addresses file checksum, nanosecond time stamps, volume
snapshots, and other features which were lacking under HFS+."

All the file ranges seem shifted, but I'm surprised that nobody else has
encountered this same issue.  I haven't raised this issue as a story yet
because no one else has noticed the same problem.

In trying to gain additional understanding I've been modifying the unit
test for testFilterAge and I found incrementing the boundaries by one time
range unit has allowed me to build a passing test case.

         // exclude oldest
         runner.setProperty(ListFile.MIN_AGE, age0);
-        runner.setProperty(ListFile.MAX_AGE, age3);
+        runner.setProperty(ListFile.MAX_AGE, age4);
         runNext.apply(true);
         runner.assertAllFlowFilesTransferred(ListFile.REL_SUCCESS);
         final List<MockFlowFile> successFiles2 =
runner.getFlowFilesForRelationship(ListFile.REL_SUCCESS);
@@ -362,7 +362,7 @@ public class TestListFile {
         assertEquals(file1.getName(),
successFiles2.get(1).getAttribute("filename"));

         // exclude newest
-        runner.setProperty(ListFile.MIN_AGE, age1);
+        runner.setProperty(ListFile.MIN_AGE, age2);
         runner.setProperty(ListFile.MAX_AGE, age5);
         runNext.apply(true);
         runner.assertAllFlowFilesTransferred(ListFile.REL_SUCCESS);
@@ -372,8 +372,8 @@ public class TestListFile {
         assertEquals(file2.getName(),
successFiles3.get(1).getAttribute("filename"));

         // exclude oldest and newest
-        runner.setProperty(ListFile.MIN_AGE, age1);
-        runner.setProperty(ListFile.MAX_AGE, age3);
+        runner.setProperty(ListFile.MIN_AGE, age2);
+        runner.setProperty(ListFile.MAX_AGE, age4);
         runNext.apply(true);
         runner.assertAllFlowFilesTransferred(ListFile.REL_SUCCESS);
         final List<MockFlowFile> successFiles4 =
runner.getFlowFilesForRelationship(ListFile.REL_SUCCESS);

Has anyone else encountered this?  Are there special platform specific
flags I need to pass when running on a mac?  It makes me wonder if the
generated timing is conflicting with the following line in ListFile.java

final long fileAge = System.currentTimeMillis() -
attributes.lastModifiedTime().toMillis();


That line can be found on line 622 in the ListFile class in the
createFileFilter method.  I'm thinking that utilizing
System.currentTImeMillis() instead of providing some kind of shim where the
current clock time can be reliably mocked is causing some inconsistencies
here.  I'm not 100% confident in this because I would think that others
would be encountering the same or similar issues.

Any help would be greatly appreciated.  I'm also happy to clarify if
anything seems unclear.

Thanks in advance,

-- 
Ryan Withers
Senior Software Developer / Analyst

http://www.linkedin.com/in/ryanwithers

Reply via email to