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 }