diff --git a/frontend-modern/src/components/Dashboard/EnhancedCPUBar.tsx b/frontend-modern/src/components/Dashboard/EnhancedCPUBar.tsx index fc6e2b6..bcd8bf9 100644 --- a/frontend-modern/src/components/Dashboard/EnhancedCPUBar.tsx +++ b/frontend-modern/src/components/Dashboard/EnhancedCPUBar.tsx @@ -82,6 +82,9 @@ export function EnhancedCPUBar(props: EnhancedCPUBarProps) { {/* Label */} {formatPercent(props.usage)} + + ({props.cores}c) + diff --git a/internal/api/system_settings.go b/internal/api/system_settings.go index 600470f..ab56443 100644 --- a/internal/api/system_settings.go +++ b/internal/api/system_settings.go @@ -294,8 +294,8 @@ func validateSystemSettings(_ *config.SystemSettings, rawRequest map[string]inte if !ok { return fmt.Errorf("discoveryConfig.max_concurrent must be a number") } - if value <= 0 || value > 1000 { - return fmt.Errorf("discoveryConfig.max_concurrent must be between 1 and 1000") + if value <= 0 || value > 1000 || value != float64(int(value)) { + return fmt.Errorf("discoveryConfig.max_concurrent must be a whole number between 1 and 1000") } } diff --git a/internal/api/system_settings_validate_test.go b/internal/api/system_settings_validate_test.go index d84620a..5ce0d36 100644 --- a/internal/api/system_settings_validate_test.go +++ b/internal/api/system_settings_validate_test.go @@ -1068,18 +1068,22 @@ func TestValidateSystemSettings_BoundaryConditions(t *testing.T) { {name: "connectionTimeout: 299.999", input: map[string]interface{}{"connectionTimeout": 299.999}, expectError: false}, {name: "connectionTimeout: 300.001", input: map[string]interface{}{"connectionTimeout": 300.001}, expectError: true}, - // Max concurrent boundaries - // Note: The validation is `value <= 0 || value > 1000`, so 0.999 is actually valid + // Max concurrent boundaries - fractional values are rejected since it's a goroutine count { - name: "max_concurrent: 0.999", + name: "max_concurrent: 0.999 fractional rejected", input: map[string]interface{}{"discoveryConfig": map[string]interface{}{"max_concurrent": 0.999}}, - expectError: false, + expectError: true, }, { - name: "max_concurrent: 1000.001", + name: "max_concurrent: 1000.001 fractional rejected", input: map[string]interface{}{"discoveryConfig": map[string]interface{}{"max_concurrent": 1000.001}}, expectError: true, }, + { + name: "max_concurrent: 5.5 fractional rejected", + input: map[string]interface{}{"discoveryConfig": map[string]interface{}{"max_concurrent": 5.5}}, + expectError: true, + }, } for _, tt := range tests {