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  }