fix monitoring daily dispatch cap
This commit is contained in:
@@ -66,6 +66,11 @@ type monitorDesktopTaskTargetCandidate struct {
|
||||
ClientOrder int
|
||||
}
|
||||
|
||||
type monitorDesktopTaskTargetOptions struct {
|
||||
MaxClientBacklog int
|
||||
RequireIdleClient bool
|
||||
}
|
||||
|
||||
func monitorDesktopTaskSpecIDs(specs []monitorDesktopTaskSpec) []int64 {
|
||||
if len(specs) == 0 {
|
||||
return nil
|
||||
@@ -332,14 +337,37 @@ func (s *MonitoringService) loadMonitorDesktopTaskTargets(
|
||||
specs []monitorDesktopTaskSpec,
|
||||
maxClientBacklog ...int,
|
||||
) (map[string]monitorDesktopTaskTarget, error) {
|
||||
platformIDs := uniqueMonitorDesktopTaskPlatformIDs(specs)
|
||||
if len(platformIDs) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
backlogLimit := 0
|
||||
if len(maxClientBacklog) > 0 && maxClientBacklog[0] > 0 {
|
||||
backlogLimit = maxClientBacklog[0]
|
||||
}
|
||||
return s.loadMonitorDesktopTaskTargetsWithOptions(ctx, tenantID, workspaceID, userID, specs, monitorDesktopTaskTargetOptions{
|
||||
MaxClientBacklog: backlogLimit,
|
||||
})
|
||||
}
|
||||
|
||||
func (s *MonitoringService) loadIdleMonitorDesktopTaskTargets(
|
||||
ctx context.Context,
|
||||
tenantID, workspaceID, userID int64,
|
||||
specs []monitorDesktopTaskSpec,
|
||||
maxClientBacklog int,
|
||||
) (map[string]monitorDesktopTaskTarget, error) {
|
||||
return s.loadMonitorDesktopTaskTargetsWithOptions(ctx, tenantID, workspaceID, userID, specs, monitorDesktopTaskTargetOptions{
|
||||
MaxClientBacklog: maxClientBacklog,
|
||||
RequireIdleClient: true,
|
||||
})
|
||||
}
|
||||
|
||||
func (s *MonitoringService) loadMonitorDesktopTaskTargetsWithOptions(
|
||||
ctx context.Context,
|
||||
tenantID, workspaceID, userID int64,
|
||||
specs []monitorDesktopTaskSpec,
|
||||
options monitorDesktopTaskTargetOptions,
|
||||
) (map[string]monitorDesktopTaskTarget, error) {
|
||||
platformIDs := uniqueMonitorDesktopTaskPlatformIDs(specs)
|
||||
if len(platformIDs) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
rows, err := s.businessPool.Query(ctx, `
|
||||
SELECT
|
||||
@@ -429,11 +457,15 @@ func (s *MonitoringService) loadMonitorDesktopTaskTargets(
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
activeBacklog, err := s.loadMonitorDesktopClientBacklog(ctx, tenantID, workspaceID, clientIDs, backlogLimit)
|
||||
backlogLookupLimit := options.MaxClientBacklog
|
||||
if options.RequireIdleClient && backlogLookupLimit <= 0 {
|
||||
backlogLookupLimit = 1
|
||||
}
|
||||
activeBacklog, err := s.loadMonitorDesktopClientBacklog(ctx, tenantID, workspaceID, clientIDs, backlogLookupLimit)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return selectMonitorDesktopTaskTargets(candidates, accountPresence, onlineClients, activeBacklog, backlogLimit), nil
|
||||
return selectMonitorDesktopTaskTargetsWithOptions(candidates, accountPresence, onlineClients, activeBacklog, options), nil
|
||||
}
|
||||
|
||||
func uniqueMonitorDesktopTaskPlatformIDs(specs []monitorDesktopTaskSpec) []string {
|
||||
@@ -572,6 +604,18 @@ func selectMonitorDesktopTaskTargets(
|
||||
onlineClients map[uuid.UUID]bool,
|
||||
clientBacklog map[uuid.UUID]int,
|
||||
maxClientBacklog int,
|
||||
) map[string]monitorDesktopTaskTarget {
|
||||
return selectMonitorDesktopTaskTargetsWithOptions(candidates, accountPresence, onlineClients, clientBacklog, monitorDesktopTaskTargetOptions{
|
||||
MaxClientBacklog: maxClientBacklog,
|
||||
})
|
||||
}
|
||||
|
||||
func selectMonitorDesktopTaskTargetsWithOptions(
|
||||
candidates []monitorDesktopAccountCandidate,
|
||||
accountPresence map[uuid.UUID][]desktopAccountPresenceClient,
|
||||
onlineClients map[uuid.UUID]bool,
|
||||
clientBacklog map[uuid.UUID]int,
|
||||
options monitorDesktopTaskTargetOptions,
|
||||
) map[string]monitorDesktopTaskTarget {
|
||||
result := make(map[string]monitorDesktopTaskTarget)
|
||||
candidatesByPlatform := make(map[string][]monitorDesktopTaskTargetCandidate)
|
||||
@@ -634,11 +678,11 @@ func selectMonitorDesktopTaskTargets(
|
||||
return platformCandidates[i].betterThan(platformCandidates[j])
|
||||
})
|
||||
for _, candidate := range platformCandidates {
|
||||
if monitorDesktopClientBacklogFull(candidate.Target.ClientID, clientBacklog, maxClientBacklog) {
|
||||
if monitorDesktopClientBacklogUnavailable(candidate.Target.ClientID, clientBacklog, options) {
|
||||
continue
|
||||
}
|
||||
result[platformID] = candidate.Target
|
||||
if maxClientBacklog > 0 {
|
||||
if options.MaxClientBacklog > 0 {
|
||||
clientBacklog[candidate.Target.ClientID]++
|
||||
}
|
||||
break
|
||||
@@ -647,6 +691,16 @@ func selectMonitorDesktopTaskTargets(
|
||||
return result
|
||||
}
|
||||
|
||||
func monitorDesktopClientBacklogUnavailable(clientID uuid.UUID, clientBacklog map[uuid.UUID]int, options monitorDesktopTaskTargetOptions) bool {
|
||||
if clientID == uuid.Nil {
|
||||
return false
|
||||
}
|
||||
if options.RequireIdleClient && clientBacklog[clientID] > 0 {
|
||||
return true
|
||||
}
|
||||
return monitorDesktopClientBacklogFull(clientID, clientBacklog, options.MaxClientBacklog)
|
||||
}
|
||||
|
||||
func monitorDesktopClientBacklogFull(clientID uuid.UUID, clientBacklog map[uuid.UUID]int, maxClientBacklog int) bool {
|
||||
return maxClientBacklog > 0 && clientID != uuid.Nil && clientBacklog[clientID] >= maxClientBacklog
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user