You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							42 lines
						
					
					
						
							824 B
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							42 lines
						
					
					
						
							824 B
						
					
					
				
								package util
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"fmt"
							 | 
						|
									"math/rand"
							 | 
						|
									"sync"
							 | 
						|
									"testing"
							 | 
						|
									"time"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								func TestOrderedLock(t *testing.T) {
							 | 
						|
									lt := NewLockTable[string]()
							 | 
						|
								
							 | 
						|
									var wg sync.WaitGroup
							 | 
						|
									// Simulate transactions requesting locks
							 | 
						|
									for i := 1; i <= 50; i++ {
							 | 
						|
										wg.Add(1)
							 | 
						|
										go func(i int) {
							 | 
						|
											defer wg.Done()
							 | 
						|
											key := "resource"
							 | 
						|
											lockType := SharedLock
							 | 
						|
											if i%5 == 0 {
							 | 
						|
												lockType = ExclusiveLock
							 | 
						|
											}
							 | 
						|
								
							 | 
						|
											// Simulate attempting to acquire the lock
							 | 
						|
											lock := lt.AcquireLock("", key, lockType)
							 | 
						|
								
							 | 
						|
											// Lock acquired, perform some work
							 | 
						|
											fmt.Printf("ActiveLock %d acquired lock %v\n", lock.ID, lockType)
							 | 
						|
								
							 | 
						|
											// Simulate some work
							 | 
						|
											time.Sleep(time.Duration(rand.Int31n(10)*10) * time.Millisecond)
							 | 
						|
								
							 | 
						|
											// Release the lock
							 | 
						|
											lt.ReleaseLock(key, lock)
							 | 
						|
											fmt.Printf("ActiveLock %d released lock %v\n", lock.ID, lockType)
							 | 
						|
										}(i)
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									wg.Wait()
							 | 
						|
								}
							 |