Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cmd/upspinfs.Symlink needs to take care of relative symlinks #602

Open
filmil opened this issue Aug 5, 2018 · 3 comments
Open

cmd/upspinfs.Symlink needs to take care of relative symlinks #602

filmil opened this issue Aug 5, 2018 · 3 comments

Comments

@filmil
Copy link
Contributor

filmil commented Aug 5, 2018

See: https://github.com/upspin/upspin/blob/master/cmd/upspinfs/fs.go#L984

It looks like any call to Symlink() in an upspin mounted directory will turn a symlink into one that is relative to the mountpoint of the upspin filesystem,

This approach will break git repositories containing symlinks that get created in an upspinfs mounted filesystem, at the moment one creates a symlink with the intention of committing it.

This is because in a git repo you typically don't want absolute symlinks (so that the repo could be moved around without links breaking), but upspinfs will change your repo-relative symlink to one that is relative to the upspinfs mountpoint.

@filmil
Copy link
Contributor Author

filmil commented Aug 5, 2018

Test commands:

$ ln -s file1.txt rel.lnk
$ pwd
/home/fmil/u/f@filmar.us/test/upspin/links
$ ln -s $HOME/u/f@filmar.us/test/upspin/links/file1.txt abs.lnk
$ ls -al
total 1
lrwx------ 1 fmil eng 0 Aug  5 02:41 abs.lnk -> file1.txt
-rwx------ 1 fmil eng 5 Aug  5 02:40 file1.txt
lrwx------ 1 fmil eng 0 Aug  5 02:41 rel.lnk -> file1.txt
$ ls -la
total 1
lrwx------ 1 fmil eng 0 Aug  5 02:41 abs.lnk -> file1.txt
-rwx------ 1 fmil eng 5 Aug  5 02:40 file1.txt
lrwx------ 1 fmil eng 0 Aug  5 02:41 rel.lnk -> file1.txt
$ ls -al
total 1
lrwx------ 1 fmil eng 0 Aug  5 02:41 abs.lnk -> file1.txt
-rwx------ 1 fmil eng 5 Aug  5 02:40 file1.txt
lrwx------ 1 fmil eng 0 Aug  5 02:41 rel.lnk -> file1.txt
$

Debug log is below:

2018/08/05 09:41:15.806524 FUSE <- Getattr [ID=0x101 Node=0xc Uid=89956 Gid=5000 Pid=78858] 0x0 fl=0                                                                                                                                                                 [118/45755]
2018/08/05 09:41:15.806620 Attr f@filmar.us/test/upspin/links 0xc valid=1m0s ino=12 size=0 mode=drwx------ 2018-08-05 09:40:54 +0000 UTC
2018/08/05 09:41:15.806702 FUSE -> [ID=0x101] Getattr valid=1m0s ino=12 size=0 mode=drwx------                                          
2018/08/05 09:41:44.035354 FUSE <- Lookup [ID=0x102 Node=0xc Uid=89956 Gid=5000 Pid=79159] "abs.lnk"
2018/08/05 09:41:44.035407 dir/remote("udir.filmar.us:443").Lookup("f@filmar.us/test/upspin/links/abs.lnk")                                 
2018/08/05 09:41:44.035832 dir/remote("udir.filmar.us:443").Lookup("f@filmar.us/test/upspin/links/abs.lnk") error: item does not exist:
        f@filmar.us/test/upspin/links/abs.lnk does not exist                                
2018/08/05 09:41:44.035867 Lookup: f@filmar.us/test/upspin/links/abs.lnk: item does not exist:                                                                         
        dir/remote("udir.filmar.us:443").Lookup:                  
        f@filmar.us/test/upspin/links/abs.lnk does not exist                                        
2018/08/05 09:41:44.035890 FUSE -> [ID=0x102] Lookup error=ENOENT: Lookup: f@filmar.us/test/upspin/links/abs.lnk: item does not exist:          
        dir/remote("udir.filmar.us:443").Lookup:                                              
        f@filmar.us/test/upspin/links/abs.lnk does not exist                                                                                                            
2018/08/05 09:41:44.036109 FUSE <- Lookup [ID=0x103 Node=0xc Uid=89956 Gid=5000 Pid=79159] "abs.lnk"                        
2018/08/05 09:41:44.036127 Lookup: f@filmar.us/test/upspin/links/abs.lnk: item does not exist                                                  
2018/08/05 09:41:44.036139 FUSE -> [ID=0x103] Lookup error=ENOENT: Lookup: f@filmar.us/test/upspin/links/abs.lnk: item does not exist
2018/08/05 09:41:44.036274 FUSE <- Symlink [ID=0x104 Node=0xc Uid=89956 Gid=5000 Pid=79159] from "abs.lnk" to target "/home/fmil/u/f@filmar.us/test/upspin/links/file1.txt"
2018/08/05 09:41:44.036287 Symlink target "f@filmar.us/test/upspin/links/file1.txt"                                                     
2018/08/05 09:41:44.036325 dir/remote("udir.filmar.us:443").Put("f@filmar.us/test/upspin/links/abs.lnk")
2018/08/05 09:41:44.276921 upspinfs: Watch("f@filmar.us/") entry: f@filmar.us/test/upspin/links/abs.lnk (delete=false)                      
2018/08/05 09:41:44.276991 Symlink "f@filmar.us/test/upspin/links 0xc"/"abs.lnk" to "/home/fmil/u/f@filmar.us/test/upspin/links/file1.txt" returns "f@filmar.us/test/upspin/links/abs.lnk 0xf"
2018/08/05 09:41:44.277060 FUSE => InvalidateNode 0xc Off:0 Size:0                          
2018/08/05 09:41:44.277304 FUSE => InvalidateNode 0xc Off:0 Size:-1                                                                                                    
2018/08/05 09:41:44.277137 Attr f@filmar.us/test/upspin/links/abs.lnk 0xf valid=1m0s ino=15 size=0 mode=Lrwx------ 2018-08-05 09:41:44 +0000 UTC
2018/08/05 09:41:44.277438 FUSE -> [ID=0x104] Symlink 0xf gen=0 valid=1m0s attr={valid=1m0s ino=15 size=0 mode=Lrwx------}
2018/08/05 09:41:44.279807 FUSE <- Getattr [ID=0x105 Node=0xc Uid=89956 Gid=5000 Pid=78858] 0x0 fl=0                                            
2018/08/05 09:41:44.279899 Attr f@filmar.us/test/upspin/links 0xc valid=1m0s ino=12 size=0 mode=drwx------ 2018-08-05 09:40:54 +0000 UTC
2018/08/05 09:41:44.279959 FUSE -> [ID=0x105] Getattr valid=1m0s ino=12 size=0 mode=drwx------      
2018/08/05 09:43:54.740844 FUSE <- Getattr [ID=0x106 Node=0xc Uid=89956 Gid=5000 Pid=79462] 0x0 fl=0                                            
2018/08/05 09:43:54.740981 Attr f@filmar.us/test/upspin/links 0xc valid=1m0s ino=12 size=0 mode=drwx------ 2018-08-05 09:40:54 +0000 UTC
2018/08/05 09:43:54.741066 FUSE -> [ID=0x106] Getattr valid=1m0s ino=12 size=0 mode=drwx------
2018/08/05 09:43:54.773917 FUSE <- Open [ID=0x107 Node=0xc Uid=89956 Gid=5000 Pid=79470] dir=true fl=OpenReadOnly+OpenDirectory+OpenNonblock
2018/08/05 09:43:54.773981 dir/remote("udir.filmar.us:443").Glob("f@filmar.us/test/upspin/links/*")
2018/08/05 09:43:54.774748 FUSE -> [ID=0x107] Open 0x1 fl=0                                 
2018/08/05 09:43:54.774913 FUSE <- Read [ID=0x108 Node=0xc Uid=89956 Gid=5000 Pid=79470] 0x1 4096 @0x0 dir=true fl=0 lock=0 ffl=OpenReadOnly+OpenDirectory+OpenNonblock
2018/08/05 09:43:54.774959 FUSE -> [ID=0x108] Read 104            
2018/08/05 09:43:54.775161 FUSE <- Lookup [ID=0x109 Node=0xc Uid=89956 Gid=5000 Pid=79470] "file1.txt"
2018/08/05 09:43:54.775203 Attr f@filmar.us/test/upspin/links/file1.txt 0xd valid=1m0s ino=13 size=5 mode=-rwx------ 2018-08-05 09:40:54 +0000 UTC
2018/08/05 09:43:54.775233 FUSE -> [ID=0x109] Lookup 0xd gen=0 valid=1m0s attr={valid=1m0s ino=13 size=5 mode=-rwx------}
2018/08/05 09:43:54.775842 FUSE <- Lookup [ID=0x10a Node=0xc Uid=89956 Gid=5000 Pid=79470] "rel.lnk"
2018/08/05 09:43:54.775878 Attr f@filmar.us/test/upspin/links/rel.lnk 0xe valid=1m0s ino=14 size=0 mode=Lrwx------ 2018-08-05 09:41:15 +0000 UTC
2018/08/05 09:43:54.775906 FUSE -> [ID=0x10a] Lookup 0xe gen=0 valid=1m0s attr={valid=1m0s ino=14 size=0 mode=Lrwx------}
2018/08/05 09:43:54.776061 FUSE <- Readlink [ID=0x10b Node=0xe Uid=89956 Gid=5000 Pid=79470]        
2018/08/05 09:43:54.776089 Readlink "f@filmar.us/test/upspin/links/rel.lnk 0xe" -> "f@filmar.us/test/upspin/links/file1.txt"                    
2018/08/05 09:43:54.776120 FUSE -> [ID=0x10b] Readlink "file1.txt"                            
2018/08/05 09:43:54.776299 FUSE <- Readlink [ID=0x10c Node=0xe Uid=89956 Gid=5000 Pid=79470]                                                                            
2018/08/05 09:43:54.776325 Readlink "f@filmar.us/test/upspin/links/rel.lnk 0xe" -> "f@filmar.us/test/upspin/links/file1.txt"
2018/08/05 09:43:54.776355 FUSE -> [ID=0x10c] Readlink "file1.txt"                                                                             
2018/08/05 09:43:54.776517 FUSE <- Readlink [ID=0x10d Node=0xe Uid=89956 Gid=5000 Pid=79470]
2018/08/05 09:43:54.776539 Readlink "f@filmar.us/test/upspin/links/rel.lnk 0xe" -> "f@filmar.us/test/upspin/links/file1.txt"
2018/08/05 09:43:54.776566 FUSE -> [ID=0x10d] Readlink "file1.txt"                                                                      
2018/08/05 09:43:54.776717 FUSE <- Readlink [ID=0x10e Node=0xe Uid=89956 Gid=5000 Pid=79470]  
2018/08/05 09:43:54.776737 Readlink "f@filmar.us/test/upspin/links/rel.lnk 0xe" -> "f@filmar.us/test/upspin/links/file1.txt"
2018/08/05 09:43:54.776762 FUSE -> [ID=0x10e] Readlink "file1.txt"
2018/08/05 09:43:54.776907 FUSE <- Readlink [ID=0x10f Node=0xe Uid=89956 Gid=5000 Pid=79470]
2018/08/05 09:43:54.776925 Readlink "f@filmar.us/test/upspin/links/rel.lnk 0xe" -> "f@filmar.us/test/upspin/links/file1.txt"
2018/08/05 09:43:54.776948 FUSE -> [ID=0x10f] Readlink "file1.txt"
2018/08/05 09:43:54.777115 FUSE <- Lookup [ID=0x110 Node=0xc Uid=89956 Gid=5000 Pid=79470] "abs.lnk"
2018/08/05 09:43:54.777150 Attr f@filmar.us/test/upspin/links/abs.lnk 0xf valid=1m0s ino=15 size=0 mode=Lrwx------ 2018-08-05 09:41:44 +0000 UTC
2018/08/05 09:43:54.777179 FUSE -> [ID=0x110] Lookup 0xf gen=0 valid=1m0s attr={valid=1m0s ino=15 size=0 mode=Lrwx------}
2018/08/05 09:43:54.777328 FUSE <- Readlink [ID=0x111 Node=0xf Uid=89956 Gid=5000 Pid=79470]
2018/08/05 09:43:54.777348 Readlink "f@filmar.us/test/upspin/links/abs.lnk 0xf" -> "f@filmar.us/test/upspin/links/file1.txt"
2018/08/05 09:43:54.777372 FUSE -> [ID=0x111] Readlink "file1.txt"
2018/08/05 09:43:54.777511 FUSE <- Readlink [ID=0x112 Node=0xf Uid=89956 Gid=5000 Pid=79470]

@filmil
Copy link
Contributor Author

filmil commented Aug 5, 2018

One other bit of weirdness, the size of the symlink below is reported as zero, despite this line which explicitly sets the symlink size to nonzero: https://github.com/upspin/upspin/blob/master/cmd/upspinfs/fs.go#L996

This excerpt from the log from previous comment shows the issue:

2018/08/05 09:41:44.036274 FUSE <- Symlink [ID=0x104 Node=0xc Uid=89956 Gid=5000 Pid=79159] from "abs.lnk" to target "/home/fmil/u/f@filmar.us/test/upspin/links/file1.txt"
2018/08/05 09:41:44.036287 Symlink target "f@filmar.us/test/upspin/links/file1.txt"
2018/08/05 09:41:44.036325 dir/remote("udir.filmar.us:443").Put("f@filmar.us/test/upspin/links/abs.lnk")
2018/08/05 09:41:44.276921 upspinfs: Watch("f@filmar.us/") entry: f@filmar.us/test/upspin/links/abs.lnk (delete=false)
2018/08/05 09:41:44.276991 Symlink "f@filmar.us/test/upspin/links 0xc"/"abs.lnk" to "/home/fmil/u/f@filmar.us/test/upspin/links/file1.txt" returns "f@filmar.us/test/upspin/links/abs.lnk 0xf"
2018/08/05 09:41:44.277060 FUSE => InvalidateNode 0xc Off:0 Size:0
2018/08/05 09:41:44.277304 FUSE => InvalidateNode 0xc Off:0 Size:-1
2018/08/05 09:41:44.277137 Attr f@filmar.us/test/upspin/links/abs.lnk 0xf valid=1m0s ino=15 size=0 mode=Lrwx------ 2018-08-05 09:41:44 +0000 UTC
2018/08/05 09:41:44.277438 FUSE -> [ID=0x104] Symlink 0xf gen=0 valid=1m0s attr={valid=1m0s ino=15 size=0 mode=Lrwx------}

@filmil
Copy link
Contributor Author

filmil commented Apr 3, 2019

One other bit of weirdness, the size of the symlink below is reported as zero, despite this line which explicitly sets the symlink size to nonzero: https://github.com/upspin/upspin/blob/master/cmd/upspinfs/fs.go#L996

This particular issue was fixed at #691.

@filmil filmil closed this as completed Apr 3, 2019
@filmil filmil reopened this Apr 3, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant