@@ -184,37 +184,45 @@ func TestTracerouteHandlerConcurrencyLimit(t *testing.T) {
184184 setting .tr_flags = []string {"-c" , "sleep 1; echo Done" }
185185 setting .tr_raw = true
186186
187- // Launch more concurrent requests than the limit
188- numRequests := 5
189- responses := make (chan int , numRequests )
190-
191- for i := 0 ; i < numRequests ; i ++ {
192- go func () {
193- r := httptest .NewRequest (http .MethodGet , "/traceroute?q=" + url .QueryEscape ("1.1.1.1" ), nil )
194- w := httptest .NewRecorder ()
195- tracerouteHandler (w , r )
196- responses <- w .Code
197- }()
198- }
199-
200- // Collect all responses
201- statusCodes := make (map [int ]int )
202- for i := 0 ; i < numRequests ; i ++ {
203- code := <- responses
204- statusCodes [code ]++
205- }
206-
207- // Verify that some requests succeeded (200) and some were rejected (503)
208- if statusCodes [http .StatusOK ] == 0 {
209- t .Error ("Expected at least one request to succeed with 200" )
210- }
211- if statusCodes [http .StatusServiceUnavailable ] == 0 {
212- t .Error ("Expected at least one request to be rejected with 503" )
213- }
214-
215- // Verify we didn't get any unexpected status codes
216- totalRequests := statusCodes [http .StatusOK ] + statusCodes [http .StatusServiceUnavailable ]
217- if totalRequests != numRequests {
218- t .Errorf ("Expected %d total requests, got %d" , numRequests , totalRequests )
187+ // Run two rounds to verify semaphores are properly released
188+ for round := 1 ; round <= 2 ; round ++ {
189+ t .Logf ("Round %d: Testing concurrency limit" , round )
190+
191+ // Launch more concurrent requests than the limit
192+ numRequests := 5
193+ responses := make (chan int , numRequests )
194+
195+ for i := 0 ; i < numRequests ; i ++ {
196+ go func () {
197+ r := httptest .NewRequest (http .MethodGet , "/traceroute?q=" + url .QueryEscape ("1.1.1.1" ), nil )
198+ w := httptest .NewRecorder ()
199+ tracerouteHandler (w , r )
200+ responses <- w .Code
201+ }()
202+ }
203+
204+ // Collect all responses
205+ statusCodes := make (map [int ]int )
206+ for i := 0 ; i < numRequests ; i ++ {
207+ code := <- responses
208+ statusCodes [code ]++
209+ }
210+
211+ // Verify that some requests succeeded (200) and some were rejected (503)
212+ if statusCodes [http .StatusOK ] == 0 {
213+ t .Errorf ("Round %d: Expected at least one request to succeed with 200" , round )
214+ }
215+ if statusCodes [http .StatusServiceUnavailable ] == 0 {
216+ t .Errorf ("Round %d: Expected at least one request to be rejected with 503" , round )
217+ }
218+
219+ // Verify we didn't get any unexpected status codes
220+ totalRequests := statusCodes [http .StatusOK ] + statusCodes [http .StatusServiceUnavailable ]
221+ if totalRequests != numRequests {
222+ t .Errorf ("Round %d: Expected %d total requests, got %d" , round , numRequests , totalRequests )
223+ }
224+
225+ t .Logf ("Round %d: Got %d successful (200) and %d rejected (503) requests" ,
226+ round , statusCodes [http .StatusOK ], statusCodes [http .StatusServiceUnavailable ])
219227 }
220228}
0 commit comments