mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 07:20:07 -05:00 
			
		
		
		
	Improve status table implementation (#879)
* Remove superfluous defer calls * Improve status table implementation as well This would probably only help with large, high-traffic installs
This commit is contained in:
		@@ -14,36 +14,34 @@ import (
 | 
				
			|||||||
// in different goroutines.
 | 
					// in different goroutines.
 | 
				
			||||||
type StatusTable struct {
 | 
					type StatusTable struct {
 | 
				
			||||||
	lock sync.RWMutex
 | 
						lock sync.RWMutex
 | 
				
			||||||
	pool map[string]bool
 | 
						pool map[string]struct{}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewStatusTable initializes and returns a new StatusTable object.
 | 
					// NewStatusTable initializes and returns a new StatusTable object.
 | 
				
			||||||
func NewStatusTable() *StatusTable {
 | 
					func NewStatusTable() *StatusTable {
 | 
				
			||||||
	return &StatusTable{
 | 
						return &StatusTable{
 | 
				
			||||||
		pool: make(map[string]bool),
 | 
							pool: make(map[string]struct{}),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Start sets value of given name to true in the pool.
 | 
					// Start sets value of given name to true in the pool.
 | 
				
			||||||
func (p *StatusTable) Start(name string) {
 | 
					func (p *StatusTable) Start(name string) {
 | 
				
			||||||
	p.lock.Lock()
 | 
						p.lock.Lock()
 | 
				
			||||||
	defer p.lock.Unlock()
 | 
						p.pool[name] = struct{}{}
 | 
				
			||||||
 | 
						p.lock.Unlock()
 | 
				
			||||||
	p.pool[name] = true
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Stop sets value of given name to false in the pool.
 | 
					// Stop sets value of given name to false in the pool.
 | 
				
			||||||
func (p *StatusTable) Stop(name string) {
 | 
					func (p *StatusTable) Stop(name string) {
 | 
				
			||||||
	p.lock.Lock()
 | 
						p.lock.Lock()
 | 
				
			||||||
	defer p.lock.Unlock()
 | 
						delete(p.pool, name)
 | 
				
			||||||
 | 
						p.lock.Unlock()
 | 
				
			||||||
	p.pool[name] = false
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsRunning checks if value of given name is set to true in the pool.
 | 
					// IsRunning checks if value of given name is set to true in the pool.
 | 
				
			||||||
func (p *StatusTable) IsRunning(name string) bool {
 | 
					func (p *StatusTable) IsRunning(name string) bool {
 | 
				
			||||||
	p.lock.RLock()
 | 
						p.lock.RLock()
 | 
				
			||||||
	defer p.lock.RUnlock()
 | 
						_, ok := p.pool[name]
 | 
				
			||||||
 | 
						p.lock.RUnlock()
 | 
				
			||||||
	return p.pool[name]
 | 
						return ok
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										19
									
								
								modules/sync/status_pool_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								modules/sync/status_pool_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					package sync
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Test_StatusTable(t *testing.T) {
 | 
				
			||||||
 | 
						table := NewStatusTable()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.False(t, table.IsRunning("xyz"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						table.Start("xyz")
 | 
				
			||||||
 | 
						assert.True(t, table.IsRunning("xyz"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						table.Stop("xyz")
 | 
				
			||||||
 | 
						assert.False(t, table.IsRunning("xyz"))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -51,7 +51,7 @@ func (q *UniqueQueue) AddFunc(id interface{}, fn func()) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	idStr := com.ToStr(id)
 | 
						idStr := com.ToStr(id)
 | 
				
			||||||
	q.table.lock.Lock()
 | 
						q.table.lock.Lock()
 | 
				
			||||||
	q.table.pool[idStr] = true
 | 
						q.table.pool[idStr] = struct{}{}
 | 
				
			||||||
	if fn != nil {
 | 
						if fn != nil {
 | 
				
			||||||
		fn()
 | 
							fn()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user