RE: [PATCH v4 4/4] fsmonitor: normalize FSEvents event paths to the real path

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: Eric DeCosta
> Sent: Tuesday, September 6, 2022 3:02 PM
> To: Jeff Hostetler <git@xxxxxxxxxxxxxxxxx>; Eric DeCosta via GitGitGadget
> <gitgitgadget@xxxxxxxxx>; git@xxxxxxxxxxxxxxx
> Subject: RE: [PATCH v4 4/4] fsmonitor: normalize FSEvents event paths to the
> real path
> 
> 
> 
> > -----Original Message-----
> > From: Jeff Hostetler <git@xxxxxxxxxxxxxxxxx>
> > Sent: Tuesday, September 6, 2022 1:14 PM
> > To: Eric DeCosta <edecosta@xxxxxxxxxxxxx>; Eric DeCosta via
> > GitGitGadget <gitgitgadget@xxxxxxxxx>; git@xxxxxxxxxxxxxxx
> > Subject: Re: [PATCH v4 4/4] fsmonitor: normalize FSEvents event paths
> > to the real path
> >
> >
> >
> > On 9/2/22 12:35 PM, Eric DeCosta wrote:
> > >
> > >
> > >> -----Original Message-----
> > >> From: Jeff Hostetler <git@xxxxxxxxxxxxxxxxx>
> > >> Sent: Thursday, September 1, 2022 4:06 PM
> > >> To: Eric DeCosta via GitGitGadget <gitgitgadget@xxxxxxxxx>;
> > >> git@xxxxxxxxxxxxxxx
> > >> Cc: Eric DeCosta <edecosta@xxxxxxxxxxxxx>
> > >> Subject: Re: [PATCH v4 4/4] fsmonitor: normalize FSEvents event
> > >> paths to the real path
> > >>
> > >>
> > >>
> > >> On 8/31/22 12:09 PM, Eric DeCosta via GitGitGadget wrote:
> > >>> From: Eric DeCosta <edecosta@xxxxxxxxxxxxx>
> > >>>
> > >>> Consider the following network working directory that is mounted
> > >>> under
> > >>> /System/Volumes/Data:
> > >>>
> > >>> /network/working/directory
> > >>>
> > >>> The git working directory path is:
> > >>>
> > >>> /System/Volumes/Data/network/working/directory
> > >>>
> > >>> The paths reported by FSEvents always start with /network.
> > >>> fsmonitor expects paths to be under the working directory;
> > >>> therefore it fails to match /network/... and ignores the change.
> > >>
> > >> I'm not sure I understand what's going on here.
> > >> Are you saying that FSEvents reports network mounted directories
> > >> with a path relative to the mount-point rather than an absolute path?
> > >>
> > >
> > > Yes
> > >
> > >> In your example, is "/network/working/directory" a valid path on
> > >> your system (that also happens to be the same directory as
> > >> "/System/Volumes/...")
> > >>
> > >> That is, do you have some aliasing going on where both paths are
> > >> valid -- like a pair of hard-linked directories?
> > >> Or, is there something special about a network mount point?
> > >>
> > >>
> > >> Did you have to "cd /System/Volumes/..." to get Git to have the
> > >> absolute path be this? Or were you doing a "cd /network/..."?
> > >> (Sorry to ask so many questions but I don't have a pair of systems
> > >> to test any of this on right now.)
> > >>
> > >
> > > "/network/working/directory" is mounted under
> > > "/System/Volumes/Data/network/working/directory"
> > >
> > > There is also a symlink:
> > >
> > > "/network" -> "/System/Volumes/Data/network"
> > >
> > > No matter if I "cd /System/Volumes/Data/network/working/directory"
> > > or "cd /network/working/directory" the paths reported by FSEvents
> > > always start with "/network/working/directory"
> > >
> > > If I do a similar symlink with local directories, I do not get this
> > > unexpected behavior.
> > >
> > > I need to remove the symlink and try it that way, but I need to
> > > coordinate with the machine's owner.
> >
> >
> > I think you have stumbled upon a recent MacOS feature called "firmlinks".
> > I'm just reading up on it myself, so I shouldn't speculate here (yet),
> > but maybe you too could do some reading on the subject.
> >
> > This makes me wonder if the symlink is historical. The real magic is
> > in the firmlinks. For example, if I do:
> >
> > $ (cd / ; ls -l | grep Users)
> > drwxr-xr-x 6 root admin 192 Apr 6 2020 Users
> >
> > $ (cd /Users ; df .)
> > Filesystem 512-blocks Used Available Capacity iused ifree %iused
> > Mounted on
> > /dev/disk1s1 976490576 608954344 338850488 65% 4181323 4878271557 0%
> > /System/Volumes/Data
> >
> > we can see that /Users is on /System/Volumes/Data (and there is a
> > /System/Volumes/Data/Users directory with the same metadata), but it
> > is not a symlink.
> >
> >
> > See [1] for more info.
> >
> > [1]
> > http://www.swiftforensics.com/2019/10/macos-1015-volumes-firmlink-
> > magic.html <https://protect-
> >
> us.mimecast.com/s/QN4qCYEZB2h1p7jWcG1Cbw?domain=swiftforensics.co
> > m>
> >
> >
> 
> Hmm, I don't see anything that suggests a firmlink is involved but this is new
> to me so maybe I just don't see it. There is an automount in addition to the
> symlink though.
> 
> So, dispensing with the abstract "/network" path, and getting to the details
> of my environment:
> 
> % mount | grep /mathworks
> map auto.sfs.sol2.mathworks on /System/Volumes/Data/mathworks
> (autofs, automounted, nobrowse) triggered map auto.sfs.sol2.devel on
> /System/Volumes/Data/mathworks/devel (autofs, automounted,
> nobrowse) triggered map sfs.worldwide.US-Natick.sol2.devel.sbs on
> /System/Volumes/Data/mathworks/devel/sbs (autofs, automounted,
> nobrowse) triggered map sfs.worldwide.US-Natick.devel.sbs.29 on
> /System/Volumes/Data/mathworks/devel/sbs/29 (autofs, automounted,
> nobrowse)
> batfs-sb29-nfs:/vmgr/sbs29/edecosta.Bbashprod1.j1928560.2 on
> /System/Volumes/Data/mathworks/devel/sbs/29/edecosta.Bbashprod1.j19
> 28560.2 (nfs, nodev, automounted, noatime, nobrowse) ...
> 
> % ls -l / | grep mathworks
> lrwxr-xr-x   1 root  wheel    35 Aug 29 10:25 home@ ->
> /System/Volumes/Data/mathworks/home
> lrwxr-xr-x   1 root  wheel    30 Aug 29 10:25 mathworks@ ->
> /System/Volumes/Data/mathworks
> 
> My worktree is:
> /System/Volumes/Data/mathworks/devel/sbs/29/edecosta.Bbashprod1.j19
> 28560.2
> or, equivalently via the symlink just:
> /mathworks/devel/sbs/29/edecosta.Bbashprod1.j1928560.2
> 
> I have sudo'ers access now; so I can try mounting things manually, mess
> about with symlinks and see what I get.
> 
> > [...]
> > >>> @@ -209,7 +209,12 @@ static void
> > >> fsevent_callback(ConstFSEventStreamRef streamRef,
> > >>> /*
> > >>> * On Mac, we receive an array of absolute paths.
> > >>> */
> > >>> - path_k = paths[k];
> > >>> + if (fsm_settings__get_allow_remote(the_repository) > 0) {
> > >>> + strbuf_reset(&tmp); strbuf_realpath_forgiving(&tmp, paths[k],
> > >>> + 0); path_k = tmp.buf; } else path_k = paths[k];
> > >>
> > >> This feels wrong.
> > >>
> > >> It is not that fsmonitor.allowRemote is true, but whether or not
> > >> this particular file system *IS* remote, right?
> > >
> > > True. I suppose each path could be checked, or some bit could be set
> > > if the working directory is remote, perhaps along the lines of
> > > fsmonitor_ipc__get_path. Then the determination of the IPC path and
> > > whether it is remote would be in one place. fsm-settings-* would
> > > then just get that bit and check it against allowRemote.
> > >
> > > Thoughts?
> >
> > I'll do some digging here. There ought to be a way to tell if a
> > component directory in a pathname has a firmlink peer. (But I'm
> > traveling for GitMerge, so I might not have time to look at this until
> > afterwards.)
> >
> > This would indicate that a "bi-directional wormhole" (their words)
> > alias is available (and hopefully, a way to computer the other
> > peer....)
> >
> > I'm thinking that the "/network/..." path in the FSEvents is because
> > FSEventD is using a particular peer spelling (that we weren't
> > expecting).
> >
> > If we can compute the spellings of the peers once when the daemon
> > starts up (and maybe make a little dictionary), then we can do prefix
> > tricks on the absolute path after the path_k = paths[k]; step in
> > fsevent_callback() to extract a relative path rather than an absolute
> > path.
> >
> > Then call fsmonitor_classify_path_relative() instead of _absolute().
> >
> > Watch out though, there are several places that do rel = path+k +
> > ...state->path_worktree_watch.len...
> > that would need to be adjusted.
> >
> > Hope this helps,
> > Jeff
> >
> >
> Thanks for the insights, I'll dig around and test things out some more.
> 
> -Eric

This is informative:

https://developer.apple.com/forums/thread/120665

-Eric






[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux