Subject: Re: [bug-diffutils] bug#21715: feat req: an option to skip directory inode comparison

From: Jim Meyering <[email-masked]>
Date: Sun, 15 May 2016 21:22:42 -0700

On Mon, Oct 19, 2015 at 7:27 PM, Aaron Davies <[email-masked]> wrote:
> i have a situation where diff -r of two directories fails to report differences that diff of two files in those directories shows
>
> i haven't dug into the code yet, but the directories involved are on an NFS mount of a netapp filer, one is the copy-on-write snapshot counterpart of the other, they show up as the same filesystem, and are the same inode
>
> so my guess is that there's something in the recursive traversal that says that any two directories that are on the same fs and are the same inode must have identical descendent contents and can be skipped completely
>
> this fs probably violates POSIX by doing this, but there's no easy way around it[1], so it would be very useful if diff had a command-line option to turn that optimization off
>
> i've heard anecdotal reports of other filesystems that cause the same problem
>
> here's a sample session:
>
> $ mkdir foo
> $ echo baz >foo/bar
> $ # wait until the next snapshot is created
> $ echo quux >foo/bar
> $ diff -r .snapshot/nightly.0/foo foo
> $ diff .snapshot/nightly.0/foo/bar foo/bar
> 1c1
> < baz
> ---
>> quux
> $ stat -c %i .snapshot/nightly.0/foo foo
> 69403847
> 69403847
> $
> --
> Aaron Davies
> [email-masked]
>
> [1] when i ran into this, i ended up using something like diff <(find .snapshot/nightly.0/foo -type f|sort|xargs cat) <(find foo -type f|sort|xargs cat) to do the comparison -- sufficient for my needs at the time, but cleaning it up for general purpose use would essentially be rewriting the -r part of diff from scratch

Hi Aaron,
Thanks for the suggestion, but what NetApp software are you using?
I've just tried to reproduce that on a NetApp-backed nfs-mounted directory,
and see different inode numbers for the directories:

  $ stat --format %i foo .snapshot/hourly.2016-05-15_*/foo
  97582543
  97557711