• Jakob Unterwurzacher's avatar
    fs: add TestTypeChange (simulate inode number reuse) · 53f16b0a
    Jakob Unterwurzacher authored
    TestTypeChange simulates inode number reuse that happens on real
    filesystems. For go-fuse, inode number reuse can look like a file changing
    to a directory or vice versa. Acutally, the old inode does not exist anymore,
    we just have not received the FORGET yet.
    
    The test fails reliably with iteration count 100. Will be fixed in the
    next commit.
    
    Test failure looks like this:
    
    	~/go/src/github.com/hanwen/go-fuse/fs$ go test -run TestTypeChange -v
    	=== RUN   TestTypeChange
    	21:43:36.065494 rx 2: INIT i0 {7.31 Ra 0x20000 MAX_PAGES,SPLICE_READ,FLOCK_LOCKS,READDIRPLUS,READDIRPLUS_AUTO,ASYNC_DIO,WRITEBACK_CACHE,HANDLE_KILLPRIV,SPLICE_WRITE,PARALLEL_DIROPS,ABORT_ERROR,EXPLICIT_INVAL_DATA,NO_OPENDIR_SUPPORT,ASYNC_READ,BIG_WRITES,DONT_MASK,IOCTL_DIR,AUTO_INVAL_DATA,POSIX_ACL,CACHE_SYMLINKS,POSIX_LOCKS,ATOMIC_O_TRUNC,EXPORT_SUPPORT,SPLICE_MOVE,NO_OPEN_SUPPORT}
    	21:43:36.065573 tx 2:     OK, {7.28 Ra 0x20000 PARALLEL_DIROPS,AUTO_INVAL_DATA,ASYNC_READ,BIG_WRITES,NO_OPEN_SUPPORT,READDIRPLUS 0/0 Wr 0x10000 Tg 0x0}
    	21:43:36.065742 rx 4: LOOKUP i1 [".go-fuse-epoll-hack"] 20b
    	21:43:36.065798 tx 4:     2=no such file or directory, {i0 g0 tE=0s tA=0s {M00 SZ=0 L=0 0:0 B0*0 i0:0 A 0.000000 M 0.000000 C 0.000000}}
    	21:43:36.065837 rx 6: CREATE i1 {0100100 [WRONLY,CREAT,TRUNC,0x8000] (00)} [".go-fuse-epoll-hack"] 20b
    	21:43:36.065861 tx 6:     OK, {i18446744073709551615 g0 {M0100644 SZ=0 L=1 0:0 B0*0 i0:18446744073709551615 A 0.000000 M 0.000000 C 0.000000} &{18446744073709551615 0 0}}
    	21:43:36.065945 rx 8: POLL i18446744073709551615
    	21:43:36.065954 tx 8:     38=function not implemented
    	21:43:36.066009 rx 10: FLUSH i18446744073709551615 {Fh 18446744073709551615}
    	21:43:36.066046 tx 10:     5=input/output error
    	21:43:36.066065 rx 12: RELEASE i18446744073709551615 {Fh 18446744073709551615 WRONLY,0x8000  L0}
    	21:43:36.066071 tx 12:     5=input/output error
    	21:43:36.066107 rx 14: LOOKUP i1 ["file"] 5b
    	21:43:36.066181 tx 14:     OK, {i1234 g0 tE=0s tA=0s {M0100644 SZ=0 L=0 0:0 B0*4096 i0:1234 A 0.000000 M 0.000000 C 0.000000}}
    	21:43:36.066217 rx 16: GETATTR i1234 {Fh 0}
    	21:43:36.066240 tx 16:     OK, {tA=0s {M0100644 SZ=0 L=0 0:0 B0*4096 i0:1234 A 0.000000 M 0.000000 C 0.000000}}
    	21:43:36.066264 rx 18: LOOKUP i1 ["file"] 5b
    	21:43:36.066285 tx 18:     OK, {i1234 g0 tE=0s tA=0s {M0100644 SZ=0 L=0 0:0 B0*4096 i0:1234 A 0.000000 M 0.000000 C 0.000000}}
    	21:43:36.066301 rx 20: UNLINK i1 ["file"] 5b
    	21:43:36.066321 tx 20:     OK
    	21:43:36.066361 rx 24: LOOKUP i1 ["dir"] 4b
    	21:43:36.066371 tx 24:     OK, {i1234 g0 tE=0s tA=0s {M0100644 SZ=0 L=0 0:0 B0*4096 i0:1234 A 0.000000 M 0.000000 C 0.000000}}
    	21:43:36.066383 rx 22: FORGET i1234 {Nlookup=2}
    	21:43:36.066390 rx 26: GETATTR i1234 {Fh 0}
    	21:43:36.068259 tx 26:     OK, {tA=0s {M0100644 SZ=0 L=0 0:0 B0*4096 i0:1234 A 0.000000 M 0.000000 C 0.000000}}
    	21:43:36.069664 received ENODEV (unmount request), thread exiting
    	21:43:36.073309 received ENODEV (unmount request), thread exiting
    	21:43:36.073396 received ENODEV (unmount request), thread exiting
    	--- FAIL: TestTypeChange (0.01s)
    	    bridge_test.go:96: should be a dir now
    	FAIL
    	exit status 1
    	FAIL	github.com/hanwen/go-fuse/v2/fs	0.017s
    
    Change-Id: I7a1a10303ecc0a8c008d29d5d81079868fc2cc43
    53f16b0a
bridge_test.go 3.49 KB