⚡️ refactor: 将排序的服务器列表的锁拆分出来
This commit is contained in:
		
							parent
							
								
									d059835877
								
							
						
					
					
						commit
						bf71aeaaf9
					
				@ -90,8 +90,8 @@ func (p *commonPage) service(c *gin.Context) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (cp *commonPage) home(c *gin.Context) {
 | 
					func (cp *commonPage) home(c *gin.Context) {
 | 
				
			||||||
	dao.ServerLock.RLock()
 | 
						dao.SortedServerLock.RLock()
 | 
				
			||||||
	defer dao.ServerLock.RUnlock()
 | 
						defer dao.SortedServerLock.RUnlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	c.HTML(http.StatusOK, "theme-"+dao.Conf.Site.Theme+"/home", mygin.CommonEnvironment(c, gin.H{
 | 
						c.HTML(http.StatusOK, "theme-"+dao.Conf.Site.Theme+"/home", mygin.CommonEnvironment(c, gin.H{
 | 
				
			||||||
		"Servers":    dao.SortedServerList,
 | 
							"Servers":    dao.SortedServerList,
 | 
				
			||||||
@ -115,9 +115,9 @@ func (cp *commonPage) ws(c *gin.Context) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	defer conn.Close()
 | 
						defer conn.Close()
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
		dao.ServerLock.RLock()
 | 
							dao.SortedServerLock.RLock()
 | 
				
			||||||
		err = conn.WriteJSON(dao.SortedServerList)
 | 
							err = conn.WriteJSON(dao.SortedServerList)
 | 
				
			||||||
		dao.ServerLock.RUnlock()
 | 
							dao.SortedServerLock.RUnlock()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			break
 | 
								break
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
				
			|||||||
@ -53,11 +53,11 @@ func (ma *memberAPI) delete(c *gin.Context) {
 | 
				
			|||||||
	var err error
 | 
						var err error
 | 
				
			||||||
	switch c.Param("model") {
 | 
						switch c.Param("model") {
 | 
				
			||||||
	case "server":
 | 
						case "server":
 | 
				
			||||||
		dao.ServerLock.Lock()
 | 
					 | 
				
			||||||
		defer dao.ServerLock.Unlock()
 | 
					 | 
				
			||||||
		err = dao.DB.Delete(&model.Server{}, "id = ?", id).Error
 | 
							err = dao.DB.Delete(&model.Server{}, "id = ?", id).Error
 | 
				
			||||||
		if err == nil {
 | 
							if err == nil {
 | 
				
			||||||
 | 
								dao.ServerLock.Lock()
 | 
				
			||||||
			delete(dao.ServerList, id)
 | 
								delete(dao.ServerList, id)
 | 
				
			||||||
 | 
								dao.ServerLock.Unlock()
 | 
				
			||||||
			dao.ReSortServer()
 | 
								dao.ReSortServer()
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	case "notification":
 | 
						case "notification":
 | 
				
			||||||
@ -109,14 +109,10 @@ func (ma *memberAPI) addOrEditServer(c *gin.Context) {
 | 
				
			|||||||
		s.ID = sf.ID
 | 
							s.ID = sf.ID
 | 
				
			||||||
		s.Tag = sf.Tag
 | 
							s.Tag = sf.Tag
 | 
				
			||||||
		if sf.ID == 0 {
 | 
							if sf.ID == 0 {
 | 
				
			||||||
			dao.ServerLock.Lock()
 | 
					 | 
				
			||||||
			defer dao.ServerLock.Unlock()
 | 
					 | 
				
			||||||
			s.Secret = com.MD5(fmt.Sprintf("%s%s%d", time.Now(), sf.Name, admin.ID))
 | 
								s.Secret = com.MD5(fmt.Sprintf("%s%s%d", time.Now(), sf.Name, admin.ID))
 | 
				
			||||||
			s.Secret = s.Secret[:10]
 | 
								s.Secret = s.Secret[:10]
 | 
				
			||||||
			err = dao.DB.Create(&s).Error
 | 
								err = dao.DB.Create(&s).Error
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			dao.ServerLock.RLock()
 | 
					 | 
				
			||||||
			defer dao.ServerLock.RUnlock()
 | 
					 | 
				
			||||||
			isEdit = true
 | 
								isEdit = true
 | 
				
			||||||
			err = dao.DB.Save(&s).Error
 | 
								err = dao.DB.Save(&s).Error
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -129,13 +125,18 @@ func (ma *memberAPI) addOrEditServer(c *gin.Context) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if isEdit {
 | 
						if isEdit {
 | 
				
			||||||
 | 
							dao.ServerLock.RLock()
 | 
				
			||||||
		s.Host = dao.ServerList[s.ID].Host
 | 
							s.Host = dao.ServerList[s.ID].Host
 | 
				
			||||||
		s.State = dao.ServerList[s.ID].State
 | 
							s.State = dao.ServerList[s.ID].State
 | 
				
			||||||
 | 
							dao.ServerList[s.ID] = &s
 | 
				
			||||||
 | 
							dao.ServerLock.RUnlock()
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		s.Host = &model.Host{}
 | 
							s.Host = &model.Host{}
 | 
				
			||||||
		s.State = &model.HostState{}
 | 
							s.State = &model.HostState{}
 | 
				
			||||||
	}
 | 
							dao.ServerLock.Lock()
 | 
				
			||||||
		dao.ServerList[s.ID] = &s
 | 
							dao.ServerList[s.ID] = &s
 | 
				
			||||||
 | 
							dao.ServerLock.Unlock()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	dao.ReSortServer()
 | 
						dao.ReSortServer()
 | 
				
			||||||
	c.JSON(http.StatusOK, model.Response{
 | 
						c.JSON(http.StatusOK, model.Response{
 | 
				
			||||||
		Code: http.StatusOK,
 | 
							Code: http.StatusOK,
 | 
				
			||||||
 | 
				
			|||||||
@ -29,8 +29,8 @@ func (mp *memberPage) serve() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (mp *memberPage) server(c *gin.Context) {
 | 
					func (mp *memberPage) server(c *gin.Context) {
 | 
				
			||||||
	dao.ServerLock.RLock()
 | 
						dao.SortedServerLock.RLock()
 | 
				
			||||||
	defer dao.ServerLock.RUnlock()
 | 
						defer dao.SortedServerLock.RUnlock()
 | 
				
			||||||
	c.HTML(http.StatusOK, "dashboard/server", mygin.CommonEnvironment(c, gin.H{
 | 
						c.HTML(http.StatusOK, "dashboard/server", mygin.CommonEnvironment(c, gin.H{
 | 
				
			||||||
		"Title":   "服务器管理",
 | 
							"Title":   "服务器管理",
 | 
				
			||||||
		"Servers": dao.SortedServerList,
 | 
							"Servers": dao.SortedServerList,
 | 
				
			||||||
 | 
				
			|||||||
@ -31,7 +31,7 @@ func DispatchTask(duration time.Duration) {
 | 
				
			|||||||
		var tasks []model.Monitor
 | 
							var tasks []model.Monitor
 | 
				
			||||||
		var hasAliveAgent bool
 | 
							var hasAliveAgent bool
 | 
				
			||||||
		dao.DB.Find(&tasks)
 | 
							dao.DB.Find(&tasks)
 | 
				
			||||||
		dao.ServerLock.RLock()
 | 
							dao.SortedServerLock.RLock()
 | 
				
			||||||
		startedAt := time.Now()
 | 
							startedAt := time.Now()
 | 
				
			||||||
		for i := 0; i < len(tasks); i++ {
 | 
							for i := 0; i < len(tasks); i++ {
 | 
				
			||||||
			if index >= uint64(len(dao.SortedServerList)) {
 | 
								if index >= uint64(len(dao.SortedServerList)) {
 | 
				
			||||||
@ -50,7 +50,7 @@ func DispatchTask(duration time.Duration) {
 | 
				
			|||||||
			dao.SortedServerList[index].TaskStream.Send(tasks[i].PB())
 | 
								dao.SortedServerList[index].TaskStream.Send(tasks[i].PB())
 | 
				
			||||||
			index++
 | 
								index++
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		dao.ServerLock.RUnlock()
 | 
							dao.SortedServerLock.RUnlock()
 | 
				
			||||||
		time.Sleep(time.Until(startedAt.Add(duration)))
 | 
							time.Sleep(time.Until(startedAt.Add(duration)))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -22,13 +22,19 @@ var Cache *cache.Cache
 | 
				
			|||||||
var DB *gorm.DB
 | 
					var DB *gorm.DB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var ServerList map[uint64]*model.Server
 | 
					var ServerList map[uint64]*model.Server
 | 
				
			||||||
var SortedServerList []*model.Server
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var ServerLock sync.RWMutex
 | 
					var ServerLock sync.RWMutex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var SortedServerList []*model.Server
 | 
				
			||||||
 | 
					var SortedServerLock sync.RWMutex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var Version = "v0.2.4"
 | 
					var Version = "v0.2.4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ReSortServer() {
 | 
					func ReSortServer() {
 | 
				
			||||||
 | 
						ServerLock.RLock()
 | 
				
			||||||
 | 
						defer ServerLock.RUnlock()
 | 
				
			||||||
 | 
						SortedServerLock.Lock()
 | 
				
			||||||
 | 
						defer SortedServerLock.Unlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SortedServerList = []*model.Server{}
 | 
						SortedServerList = []*model.Server{}
 | 
				
			||||||
	for _, s := range ServerList {
 | 
						for _, s := range ServerList {
 | 
				
			||||||
		SortedServerList = append(SortedServerList, s)
 | 
							SortedServerList = append(SortedServerList, s)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user