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  }