@@ -137,7 +137,7 @@ public LoadTestController(
137137 * 3. Allows structured parameters in request body
138138 *
139139 * ALTERNATIVE: GET with query parameters
140- * GET /api/loadtest?workIterations=1000&bufferSizeKb=5
140+ * GET /api/loadtest?workIterations=1000&bufferSizeKb=100
141141 * Simpler but less flexible for complex parameters.
142142 *
143143 * URL PATTERN:
@@ -150,8 +150,9 @@ public LoadTestController(
150150 /// </summary>
151151 /// <param name="workIterations">Number of SHA256 hash iterations (default: 1000).</param>
152152 /// <param name="bufferSizeKb">Memory buffer size in KB (default: 100).</param>
153- /// <param name="softLimit">Concurrent request soft limit (default: 10).</param>
154- /// <param name="degradationFactor">Delay ms per request over limit (default: 50).</param>
153+ /// <param name="baselineDelayMs">Minimum blocking delay in ms (default: 500).</param>
154+ /// <param name="softLimit">Concurrent request soft limit (default: 5).</param>
155+ /// <param name="degradationFactor">Delay ms per request over limit (default: 200).</param>
155156 /// <param name="cancellationToken">Cancellation token from the HTTP request pipeline.</param>
156157 /// <returns>Load test result with timing and diagnostic information.</returns>
157158 /// <remarks>
@@ -160,12 +161,13 @@ public LoadTestController(
160161 /// </para>
161162 /// <para>
162163 /// 1. Start a timer (Stopwatch)
163- /// 2. Check current concurrent request count
164- /// 3. If over soft limit, calculate and apply degradation delay
165- /// 4. Perform lightweight CPU work (hash iterations)
166- /// 5. Allocate small memory buffer (released when request ends)
167- /// 6. Periodically check if elapsed time > 120s; if so, 20% chance of exception
168- /// 7. Return response with timing details
164+ /// 2. Apply baseline blocking delay (guarantees thread pool exhaustion)
165+ /// 3. Check current concurrent request count
166+ /// 4. If over soft limit, calculate and apply degradation delay
167+ /// 5. Perform lightweight CPU work (hash iterations)
168+ /// 6. Allocate memory buffer (released when request ends)
169+ /// 7. Periodically check if elapsed time > 120s; if so, 20% chance of exception
170+ /// 8. Return response with timing details
169171 /// </para>
170172 /// <para>
171173 /// <strong>PARAMETERS:</strong>
@@ -180,27 +182,32 @@ public LoadTestController(
180182 /// <description>Size of memory buffer to allocate in kilobytes. Released after request.</description>
181183 /// </item>
182184 /// <item>
183- /// <term>softLimit (default: 10)</term>
185+ /// <term>baselineDelayMs (default: 500)</term>
186+ /// <description>Minimum blocking delay applied to every request. Ensures thread pool exhaustion.</description>
187+ /// </item>
188+ /// <item>
189+ /// <term>softLimit (default: 5)</term>
184190 /// <description>Concurrent request count before degradation delays begin.</description>
185191 /// </item>
186192 /// <item>
187- /// <term>degradationFactor (default: 50 )</term>
193+ /// <term>degradationFactor (default: 200 )</term>
188194 /// <description>Milliseconds of delay added per concurrent request over the soft limit.</description>
189195 /// </item>
190196 /// </list>
191197 /// <para>
192- /// <strong>DEGRADATION FORMULA:</strong>
198+ /// <strong>TOTAL DELAY FORMULA:</strong>
193199 /// <code>
194- /// additionalDelayMs = max(0, currentConcurrent - softLimit) * degradationFactor
200+ /// totalDelay = baselineDelayMs + max(0, currentConcurrent - softLimit) * degradationFactor
195201 /// </code>
196202 /// </para>
197203 /// <para>
198- /// <strong>EXAMPLE SCENARIOS:</strong>
204+ /// <strong>EXAMPLE SCENARIOS (with defaults baselineDelayMs=500, softLimit=5, factor=200) :</strong>
199205 /// </para>
200206 /// <list type="bullet">
201- /// <item>10 concurrent requests, softLimit=50 → 0ms added delay</item>
202- /// <item>60 concurrent requests, softLimit=50, factor=5 → 50ms added delay</item>
203- /// <item>150 concurrent requests, softLimit=50, factor=5 → 500ms added delay</item>
207+ /// <item>1 concurrent request → 500ms baseline only</item>
208+ /// <item>10 concurrent requests → 500ms + (10-5)×200 = 1500ms total</item>
209+ /// <item>20 concurrent requests → 500ms + (20-5)×200 = 3500ms total</item>
210+ /// <item>50 concurrent requests → 500ms + (50-5)×200 = 9500ms total</item>
204211 /// </list>
205212 /// </remarks>
206213 /// <response code="200">Load test completed successfully with timing details.</response>
@@ -212,8 +219,9 @@ public LoadTestController(
212219 public async Task < IActionResult > ExecuteLoadTest (
213220 [ FromQuery ] int workIterations = 1000 ,
214221 [ FromQuery ] int bufferSizeKb = 100 ,
215- [ FromQuery ] int softLimit = 10 ,
216- [ FromQuery ] int degradationFactor = 50 ,
222+ [ FromQuery ] int baselineDelayMs = 500 ,
223+ [ FromQuery ] int softLimit = 5 ,
224+ [ FromQuery ] int degradationFactor = 200 ,
217225 CancellationToken cancellationToken = default )
218226 {
219227 /*
@@ -225,8 +233,8 @@ public async Task<IActionResult> ExecuteLoadTest(
225233 * with Azure Load Testing, JMeter, and browser testing.
226234 *
227235 * Examples:
228- * - GET/POST /api/loadtest (uses all defaults)
229- * - GET/POST /api/loadtest?softLimit=25 °radationFactor=10
236+ * - GET/POST /api/loadtest (uses all defaults - maximum stress )
237+ * - GET/POST /api/loadtest?baselineDelayMs=200& softLimit=20 °radationFactor=50
230238 *
231239 * PORTING NOTES:
232240 * - Query parameters are universal across HTTP clients
@@ -239,6 +247,7 @@ public async Task<IActionResult> ExecuteLoadTest(
239247 {
240248 WorkIterations = workIterations ,
241249 BufferSizeKb = bufferSizeKb ,
250+ BaselineDelayMs = baselineDelayMs ,
242251 SoftLimit = softLimit ,
243252 DegradationFactor = degradationFactor
244253 } ;
@@ -302,8 +311,9 @@ public async Task<IActionResult> ExecuteLoadTest(
302311 /// </summary>
303312 /// <param name="workIterations">Number of hash iterations (default: 1000).</param>
304313 /// <param name="bufferSizeKb">Memory buffer size in KB (default: 100).</param>
305- /// <param name="softLimit">Concurrent request soft limit (default: 10).</param>
306- /// <param name="degradationFactor">Delay ms per request over limit (default: 50).</param>
314+ /// <param name="baselineDelayMs">Minimum blocking delay in ms (default: 500).</param>
315+ /// <param name="softLimit">Concurrent request soft limit (default: 5).</param>
316+ /// <param name="degradationFactor">Delay ms per request over limit (default: 200).</param>
307317 /// <param name="cancellationToken">Cancellation token.</param>
308318 /// <returns>Load test result with timing details.</returns>
309319 [ HttpGet ( "probe" ) ]
@@ -312,8 +322,9 @@ public async Task<IActionResult> ExecuteLoadTest(
312322 public async Task < IActionResult > ExecuteLoadTestProbe (
313323 [ FromQuery ] int workIterations = 1000 ,
314324 [ FromQuery ] int bufferSizeKb = 100 ,
315- [ FromQuery ] int softLimit = 10 ,
316- [ FromQuery ] int degradationFactor = 50 ,
325+ [ FromQuery ] int baselineDelayMs = 500 ,
326+ [ FromQuery ] int softLimit = 5 ,
327+ [ FromQuery ] int degradationFactor = 200 ,
317328 CancellationToken cancellationToken = default )
318329 {
319330 /*
@@ -332,7 +343,7 @@ public async Task<IActionResult> ExecuteLoadTestProbe(
332343 */
333344
334345 // Delegate to main endpoint - both now use query parameters
335- return await ExecuteLoadTest ( workIterations , bufferSizeKb , softLimit , degradationFactor , cancellationToken ) ;
346+ return await ExecuteLoadTest ( workIterations , bufferSizeKb , baselineDelayMs , softLimit , degradationFactor , cancellationToken ) ;
336347 }
337348
338349 /*
0 commit comments