feat: add priority demotion controls
This commit is contained in:
@@ -2,8 +2,10 @@ package store
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"encoding/json"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/jackc/pgx/v5"
|
||||
)
|
||||
@@ -28,6 +30,14 @@ type runtimePolicyScanner interface {
|
||||
Scan(dest ...any) error
|
||||
}
|
||||
|
||||
type PlatformDynamicPriorityState struct {
|
||||
PlatformID string `json:"platformId"`
|
||||
Priority int `json:"priority"`
|
||||
DynamicPriority *int `json:"dynamicPriority,omitempty"`
|
||||
EffectivePriority int `json:"effectivePriority"`
|
||||
UpdatedAt time.Time `json:"updatedAt"`
|
||||
}
|
||||
|
||||
func (s *Store) ListRuntimePolicySets(ctx context.Context) ([]RuntimePolicySet, error) {
|
||||
rows, err := s.pool.Query(ctx, `SELECT `+runtimePolicyColumns+` FROM model_runtime_policy_sets ORDER BY policy_key ASC`)
|
||||
if err != nil {
|
||||
@@ -149,26 +159,64 @@ WHERE id = $1::uuid`, platformModelID, cooldownSeconds)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *Store) DemoteCandidatePlatformPriority(ctx context.Context, platformID string, demoteStep int) error {
|
||||
func (s *Store) DemoteCandidatePlatformPriority(ctx context.Context, platformID string) (int, error) {
|
||||
if strings.TrimSpace(platformID) == "" {
|
||||
return 0, nil
|
||||
}
|
||||
var dynamicPriority int
|
||||
err := s.pool.QueryRow(ctx, `
|
||||
UPDATE integration_platforms target
|
||||
SET dynamic_priority = COALESCE((
|
||||
SELECT MAX(COALESCE(peer.dynamic_priority, peer.priority))
|
||||
FROM integration_platforms peer
|
||||
WHERE peer.deleted_at IS NULL
|
||||
), target.priority) + 1,
|
||||
updated_at = now()
|
||||
WHERE target.id = $1::uuid
|
||||
RETURNING dynamic_priority`, platformID).Scan(&dynamicPriority)
|
||||
return dynamicPriority, err
|
||||
}
|
||||
|
||||
func (s *Store) UpdatePlatformDynamicPriority(ctx context.Context, platformID string, dynamicPriority *int) (PlatformDynamicPriorityState, error) {
|
||||
if strings.TrimSpace(platformID) == "" {
|
||||
return PlatformDynamicPriorityState{}, pgx.ErrNoRows
|
||||
}
|
||||
value := 0
|
||||
reset := dynamicPriority == nil
|
||||
if dynamicPriority != nil {
|
||||
value = *dynamicPriority
|
||||
}
|
||||
return scanPlatformDynamicPriorityState(s.pool.QueryRow(ctx, `
|
||||
UPDATE integration_platforms
|
||||
SET dynamic_priority = CASE WHEN $2::boolean THEN priority ELSE $3::int END,
|
||||
updated_at = now()
|
||||
WHERE id = $1::uuid
|
||||
AND deleted_at IS NULL
|
||||
RETURNING id::text, priority, dynamic_priority, COALESCE(dynamic_priority, priority), updated_at`, platformID, reset, value))
|
||||
}
|
||||
|
||||
func scanPlatformDynamicPriorityState(scanner runtimePolicyScanner) (PlatformDynamicPriorityState, error) {
|
||||
var item PlatformDynamicPriorityState
|
||||
var dynamicPriority sql.NullInt64
|
||||
if err := scanner.Scan(
|
||||
&item.PlatformID,
|
||||
&item.Priority,
|
||||
&dynamicPriority,
|
||||
&item.EffectivePriority,
|
||||
&item.UpdatedAt,
|
||||
); err != nil {
|
||||
return PlatformDynamicPriorityState{}, err
|
||||
}
|
||||
item.DynamicPriority = intPointerFromNull(dynamicPriority)
|
||||
return item, nil
|
||||
}
|
||||
|
||||
func intPointerFromNull(value sql.NullInt64) *int {
|
||||
if !value.Valid {
|
||||
return nil
|
||||
}
|
||||
if demoteStep <= 0 {
|
||||
demoteStep = 100
|
||||
}
|
||||
_, err := s.pool.Exec(ctx, `
|
||||
UPDATE integration_platforms target
|
||||
SET dynamic_priority = GREATEST(
|
||||
COALESCE(target.dynamic_priority, target.priority),
|
||||
COALESCE((
|
||||
SELECT MAX(COALESCE(peer.dynamic_priority, peer.priority))
|
||||
FROM integration_platforms peer
|
||||
WHERE peer.deleted_at IS NULL
|
||||
), target.priority) + $2::int
|
||||
),
|
||||
updated_at = now()
|
||||
WHERE target.id = $1::uuid`, platformID, demoteStep)
|
||||
return err
|
||||
converted := int(value.Int64)
|
||||
return &converted
|
||||
}
|
||||
|
||||
func scanRuntimePolicySet(scanner runtimePolicyScanner) (RuntimePolicySet, error) {
|
||||
|
||||
Reference in New Issue
Block a user