️ refactor: 将排序的服务器列表的锁拆分出来

This commit is contained in:
naiba 2021-01-17 22:18:36 +08:00
parent d059835877
commit bf71aeaaf9
5 changed files with 24 additions and 17 deletions

View File

@ -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
} }

View File

@ -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,

View File

@ -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,

View File

@ -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)))
} }
} }

View File

@ -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)