run in parallel

This commit is contained in:
uubulb 2025-02-01 18:02:31 +08:00
parent e9f8847708
commit 9b17c6deee

View File

@ -2,6 +2,7 @@ package controller
import ( import (
"strconv" "strconv"
"sync"
"time" "time"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@ -284,27 +285,56 @@ func setServerConfig(c *gin.Context) (any, error) {
} }
singleton.ServerLock.RLock() singleton.ServerLock.RLock()
servers := make([]*model.Server, 0, len(configForm.Servers))
for _, sid := range configForm.Servers { for _, sid := range configForm.Servers {
s, ok := singleton.ServerList[sid] s, ok := singleton.ServerList[sid]
if !ok || s.TaskStream == nil { if !ok || s.TaskStream == nil {
singleton.ServerLock.RUnlock() singleton.ServerLock.RUnlock()
return "", nil return "", nil
} }
servers = append(servers, s)
}
singleton.ServerLock.RUnlock()
if !s.HasPermission(c) { var wg sync.WaitGroup
singleton.ServerLock.RUnlock() errChan := make(chan error, len(servers)/10+1)
return "", singleton.Localizer.ErrorT("permission denied")
for i := 0; i < len(servers); i += 10 {
end := i + 10
if end > len(servers) {
end = len(servers)
} }
group := servers[i:end]
if err := s.TaskStream.Send(&pb.Task{ wg.Add(1)
Type: model.TaskTypeApplyConfig, go func(srvGroup []*model.Server) {
Data: configForm.Config, defer wg.Done()
}); err != nil { for _, s := range srvGroup {
singleton.ServerLock.RUnlock() if !s.HasPermission(c) {
errChan <- singleton.Localizer.ErrorT("permission denied")
return
}
// Create and send the task.
task := &pb.Task{
Type: model.TaskTypeApplyConfig,
Data: configForm.Config,
}
if err := s.TaskStream.Send(task); err != nil {
errChan <- err
return
}
}
}(group)
}
wg.Wait()
close(errChan)
for err := range errChan {
if err != nil {
return "", err return "", err
} }
} }
singleton.ServerLock.RUnlock()
return nil, nil return nil, nil
} }