github.com/rohankumardubey/proxyfs@v0.0.0-20210108201508-653efa9ab00e/inode/locker_test.go (about) 1 package inode 2 3 import ( 4 "testing" 5 6 "github.com/swiftstack/ProxyFS/blunder" 7 "github.com/swiftstack/ProxyFS/dlm" 8 ) 9 10 func TestLockerStuff(t *testing.T) { 11 var ( 12 inodeNumber InodeNumber 13 ) 14 15 testSetup(t, false) 16 17 inodeNumber = InodeNumber(2) 18 19 testVolumeHandle, err := FetchVolumeHandle("TestVolume") 20 if nil != err { 21 t.Fatalf("FetchVolumeHandle(\"TestVolume\") failed: %v", err) 22 } 23 24 volume := testVolumeHandle.(*volumeStruct) 25 26 // Test: get a lock for vol A inode 2 27 srcDirLock, err := volume.InitInodeLock(inodeNumber, nil) 28 if err != nil { 29 t.Fatalf("Failed to initInodeLock: %v", err) 30 } 31 srcCallerID := srcDirLock.GetCallerID() 32 33 // Test: get a lock for vol A inode 3 34 inodeNumber++ 35 dstDirLock, err := volume.InitInodeLock(inodeNumber, nil) 36 if err != nil { 37 t.Fatalf("Failed to initInodeLock: %v", err) 38 } 39 dstCallerID := dstDirLock.GetCallerID() 40 41 // Check that the caller IDs are different 42 if *dstCallerID == *srcCallerID { 43 t.Fatalf("Caller IDs should be different!") 44 } 45 46 // Now try to lock something 47 srcDirLock.ReadLock() 48 srcDirLock.Unlock() 49 50 // Simulate multi-lock move sequence 51 var srcDirInodeNumber InodeNumber = 9001 52 var dstDirInodeNumber InodeNumber = 9002 53 callerID := dlm.GenerateCallerID() 54 srcDirLock, err = volume.InitInodeLock(srcDirInodeNumber, callerID) 55 if err != nil { 56 return 57 } 58 srcCallerID = srcDirLock.GetCallerID() 59 60 dstDirLock, err = volume.InitInodeLock(dstDirInodeNumber, callerID) 61 if err != nil { 62 return 63 } 64 dstCallerID = dstDirLock.GetCallerID() 65 66 // Check that the caller IDs are the same 67 if *dstCallerID != *srcCallerID { 68 t.Fatalf("Caller IDs should be the same!") 69 } 70 71 retryLock: 72 err = srcDirLock.WriteLock() 73 if err != nil { 74 return 75 } 76 77 err = dstDirLock.TryWriteLock() 78 if blunder.Is(err, blunder.TryAgainError) { 79 srcDirLock.Unlock() 80 goto retryLock 81 } 82 83 // Here is where we would do our move 84 85 dstDirLock.Unlock() 86 srcDirLock.Unlock() 87 88 testTeardown(t) 89 }