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