diff --git a/Sense/scripts/t014-capacity.ps1 b/Sense/scripts/t014-capacity.ps1 index b1131bc..663dfff 100644 --- a/Sense/scripts/t014-capacity.ps1 +++ b/Sense/scripts/t014-capacity.ps1 @@ -802,9 +802,14 @@ try { $previousSampleAt = 0.0 $initialInventory = Get-MediaInventory $script:productionAPIPort $samples = 0 + $requiredSamples = [int][Math]::Ceiling($targetSeconds / $sampleSeconds) $maximumUnconverged = 0 - while ($observation.Elapsed.TotalSeconds -lt $targetSeconds) { - Start-Sleep -Seconds $sampleSeconds + while ($samples -lt $requiredSamples) { + $nextSampleAt = ($samples + 1) * $sampleSeconds + $delayMilliseconds = [int][Math]::Ceiling(($nextSampleAt - $observation.Elapsed.TotalSeconds) * 1000) + if ($delayMilliseconds -gt 0) { + Start-Sleep -Milliseconds $delayMilliseconds + } Assert-Alive $sourceMedia Assert-Alive $productionMedia Assert-Alive $sense @@ -848,7 +853,8 @@ try { $inboundMbps = if ($observationSeconds -gt 0) { ($inboundDelta * 8.0) / $observationSeconds / 1000000.0 } else { 0.0 } $databaseSizeBytes = [Int64](Get-PostgresScalar "SELECT pg_database_size('$databaseName')") $finalUnconverged = [int](Get-SenseMetric 'sense_reconcile_devices' '{state="unconverged"}') - if ($finalUnconverged -ne 0 -or $maximumUnconverged -ne 0 -or $samples -lt [Math]::Floor($targetSeconds / $sampleSeconds)) { + if ($observationSeconds -lt $targetSeconds -or $finalUnconverged -ne 0 -or + $maximumUnconverged -ne 0 -or $samples -lt $requiredSamples) { throw 'formal observation did not satisfy sampling and convergence requirements' } diff --git a/tests/test_sense_capacity_contract.py b/tests/test_sense_capacity_contract.py index dfba927..343eb18 100644 --- a/tests/test_sense_capacity_contract.py +++ b/tests/test_sense_capacity_contract.py @@ -32,6 +32,8 @@ class SenseCapacityContractTests(unittest.TestCase): def test_formal_window_and_functional_gates_are_fixed(self): self.assertRegex(self.script, r"\[int\]\$ObservationMinutes = 30") self.assertIn("$sampleSeconds = 10", self.script) + self.assertIn("$requiredSamples = [int][Math]::Ceiling($targetSeconds / $sampleSeconds)", self.script) + self.assertIn("$nextSampleAt = ($samples + 1) * $sampleSeconds", self.script) self.assertIn("formal_eligible = $ObservationMinutes -ge 30", self.script) self.assertIn("Wait-Convergence 'enabled'", self.script) self.assertIn("Wait-Convergence 'disabled'", self.script)