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:34 PM
> To: 'Jeff Hostetler' <git@xxxxxxxxxxxxxxxxx>; 'Eric DeCosta via GitGitGadget'
> <gitgitgadget@xxxxxxxxx>; 'git@xxxxxxxxxxxxxxx' <git@xxxxxxxxxxxxxxx>
> Subject: RE: [PATCH v4 4/4] fsmonitor: normalize FSEvents event paths to the
> real path
> 
> 
> 
> > -----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
> 
Conversation with one of our macOS admins:

Q: Is /mathworks a symbolic link or some sort of firmlink or synthetic firmlink?

A: It’s a “synthetic” link, per apple. Config is managed in /etc/synthetic.conf

The auto mounter will also automatically create it based on the contents of /etc/auto_master even without the synthetic.conf file. We went back and forth with apple for a while on the “right” way to do it and now I’m not sure what we settled on, off the top of my head

I don’t know if they’re the same under the hood, but it seemed to be able to create root level links even though you can’t with ln anymore

I suspect apple wants users to use the synthetic.conf file in all cases...
----

It appears that the automounter is creating "synthetic firmlinks", a la https://derflounder.wordpress.com/2020/01/18/creating-root-level-directories-and-symbolic-links-on-macos-catalina/

When I look in /etc/auto_master I see several entries that appear as symlinks in the output of "ls -l /" but in reality they are synthetic firmlinks.

-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