github.com/rohankumardubey/proxyfs@v0.0.0-20210108201508-653efa9ab00e/inode/file_stress_test.go (about)

     1  package inode
     2  
     3  import (
     4  	"crypto/rand"
     5  	"sync"
     6  	"testing"
     7  )
     8  
     9  type testStressFileWritesGlobalsStruct struct {
    10  	testStressNumWorkers        uint64
    11  	testStressNumFlushesPerFile uint64
    12  	testStressNumBlocksPerFlush uint64
    13  	testStressNumBytesPerBlock  uint64
    14  	volumeHandle                VolumeHandle
    15  	writeBlock                  []byte
    16  	childrenStart               sync.WaitGroup
    17  	childrenDone                sync.WaitGroup
    18  }
    19  
    20  var testStressFileWritesGlobals testStressFileWritesGlobalsStruct
    21  
    22  func TestStressFileWritesWhileStarved(t *testing.T) {
    23  	testStressFileWritesGlobals.testStressNumWorkers = 100
    24  	testStressFileWritesGlobals.testStressNumFlushesPerFile = 4 // Currently, each triggers a checkpoint as well
    25  	testStressFileWritesGlobals.testStressNumBlocksPerFlush = 20
    26  	testStressFileWritesGlobals.testStressNumBytesPerBlock = 1
    27  
    28  	testStressFileWrites(t, true)
    29  }
    30  
    31  func TestStressFileWritesWhileNotStarved(t *testing.T) {
    32  	testStressFileWritesGlobals.testStressNumWorkers = 100
    33  	testStressFileWritesGlobals.testStressNumFlushesPerFile = 10 // Currently, each triggers a checkpoint as well
    34  	testStressFileWritesGlobals.testStressNumBlocksPerFlush = 20
    35  	testStressFileWritesGlobals.testStressNumBytesPerBlock = 1
    36  
    37  	testStressFileWrites(t, false)
    38  }
    39  
    40  func testStressFileWrites(t *testing.T, starvationMode bool) {
    41  	var (
    42  		err         error
    43  		workerIndex uint64
    44  	)
    45  
    46  	testSetup(t, starvationMode)
    47  
    48  	testStressFileWritesGlobals.volumeHandle, err = FetchVolumeHandle("TestVolume")
    49  	if nil != err {
    50  		t.Fatalf("FetchVolumeHandle(\"TestVolume\") failed: %v", err)
    51  	}
    52  
    53  	testStressFileWritesGlobals.writeBlock = make([]byte, testStressFileWritesGlobals.testStressNumBytesPerBlock)
    54  	rand.Read(testStressFileWritesGlobals.writeBlock)
    55  
    56  	testStressFileWritesGlobals.childrenStart.Add(1)
    57  	testStressFileWritesGlobals.childrenDone.Add(int(testStressFileWritesGlobals.testStressNumWorkers))
    58  
    59  	for workerIndex = 0; workerIndex < testStressFileWritesGlobals.testStressNumWorkers; workerIndex++ {
    60  		go testStressFileWritesWorker(t, workerIndex)
    61  	}
    62  
    63  	testStressFileWritesGlobals.childrenStart.Done()
    64  
    65  	testStressFileWritesGlobals.childrenDone.Wait()
    66  
    67  	testTeardown(t)
    68  }
    69  
    70  func testStressFileWritesWorker(t *testing.T, workerIndex uint64) {
    71  	var (
    72  		err             error
    73  		fileBlockNumber uint64
    74  		fileFlushNumber uint64
    75  		fileInodeNumber InodeNumber
    76  	)
    77  
    78  	fileInodeNumber, err = testStressFileWritesGlobals.volumeHandle.CreateFile(InodeMode(0000), InodeRootUserID, InodeGroupID(0))
    79  	if nil != err {
    80  		t.Fatalf("testStressFileWritesGlobals.volumeHandle.CreateFile() failed: %v", err)
    81  	}
    82  
    83  	testStressFileWritesGlobals.childrenStart.Wait()
    84  
    85  	for fileFlushNumber = 0; fileFlushNumber < testStressFileWritesGlobals.testStressNumFlushesPerFile; fileFlushNumber++ {
    86  		for fileBlockNumber = 0; fileBlockNumber < testStressFileWritesGlobals.testStressNumBlocksPerFlush; fileBlockNumber++ {
    87  			err = testStressFileWritesGlobals.volumeHandle.Write(
    88  				fileInodeNumber,
    89  				fileBlockNumber*testStressFileWritesGlobals.testStressNumBytesPerBlock,
    90  				testStressFileWritesGlobals.writeBlock,
    91  				nil)
    92  			if nil != err {
    93  				t.Fatalf("Write() failed: %v", err)
    94  			}
    95  		}
    96  
    97  		err = testStressFileWritesGlobals.volumeHandle.Flush(fileInodeNumber, false)
    98  		if nil != err {
    99  			t.Fatalf("Flush() failed: %v", err)
   100  		}
   101  	}
   102  
   103  	err = testStressFileWritesGlobals.volumeHandle.Flush(fileInodeNumber, true)
   104  	if nil != err {
   105  		t.Fatalf("Flush() failed: %v", err)
   106  	}
   107  
   108  	err = testStressFileWritesGlobals.volumeHandle.Destroy(fileInodeNumber)
   109  	if nil != err {
   110  		t.Fatalf("Destroy() failed: %v", err)
   111  	}
   112  
   113  	testStressFileWritesGlobals.childrenDone.Done()
   114  }