#27377·jenkins

Add a timeout to the update center refresh http calls DownloadService loadJSON and loadJSONHTML

Author: gbhat618Created Sep 11, 2026Updated Sep 11, 2026

The response reading doesn't have any timeouts configured, we (CloudBees) noticed in one of our tests getting stuck with the following thread dump,

thread stuck in reading DownloadService.loadJSON
"Update site data downloader [#3]" Id=256 Group=main RUNNABLE (in native)
	at [email protected]/sun.nio.ch.Net.poll(Native Method)
	at [email protected]/sun.nio.ch.NioSocketImpl.park(NioSocketImpl.java:190)
	at [email protected]/sun.nio.ch.NioSocketImpl.park(NioSocketImpl.java:200)
	at [email protected]/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:307)
	at [email protected]/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:354)
	at [email protected]/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:798)
	at [email protected]/java.net.Socket$SocketInputStream.implRead(Socket.java:974)
	at [email protected]/java.net.Socket$SocketInputStream.read(Socket.java:964)
	at [email protected]/java.io.BufferedInputStream.fill(BufferedInputStream.java:289)
	at [email protected]/java.io.BufferedInputStream.read1(BufferedInputStream.java:330)
	at [email protected]/java.io.BufferedInputStream.read(BufferedInputStream.java:388)
	-  locked java.io.BufferedInputStream@76396509
	at [email protected]/sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:795)
	at [email protected]/sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:727)
	at [email protected]/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1392)
	at [email protected]/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1302)
	at app//hudson.model.DownloadService.loadJSON(DownloadService.java:122)
	at app//hudson.model.UpdateSite.updateDirectlyNow(UpdateSite.java:235)
	at app//hudson.model.UpdateSite.lambda$updateDirectly$0(UpdateSite.java:196)
	at app//hudson.model.UpdateSite$$Lambda/0x000000006cdd7b48.call(Unknown Source)
	at [email protected]/java.util.concurrent.FutureTask.run(FutureTask.java:328)
	at [email protected]/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
	at [email protected]/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
	at [email protected]/java.lang.Thread.runWith(Thread.java:1487)
	at [email protected]/java.lang.Thread.run(Thread.java:1474)

	Number of locked synchronizers = 3
	- java.util.concurrent.locks.ReentrantLock$NonfairSync@637c840d
	- java.util.concurrent.locks.ReentrantLock$NonfairSync@51ac12ac
	- java.util.concurrent.ThreadPoolExecutor$Worker@1caffe35
Companion thread from jenkins-test-harness
"Jetty (JavaNetReverseProxy)-152" Id=152 Group=main RUNNABLE (in native)
	at [email protected]/sun.nio.ch.Net.connect0(Native Method)
	at [email protected]/sun.nio.ch.Net.connect(Net.java:546)
	at [email protected]/sun.nio.ch.Net.connect(Net.java:535)
	at [email protected]/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:585)
	at [email protected]/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:284)
	at [email protected]/java.net.Socket.connect(Socket.java:659)
	at [email protected]/sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:304)
	at [email protected]/sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:181)
	at [email protected]/sun.net.NetworkClient.doConnect(NetworkClient.java:166)
	at [email protected]/sun.net.www.http.HttpClient.openServer(HttpClient.java:516)
	at [email protected]/sun.net.www.http.HttpClient.openServer(HttpClient.java:604)
	at [email protected]/sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:206)
	at [email protected]/sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:288)
	at [email protected]/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:193)
	at [email protected]/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:963)
	at [email protected]/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:899)
	at [email protected]/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:179)
	at [email protected]/sun.net.www.protocol.http.HttpURLConnection.followRedirect0(HttpURLConnection.java:2540)
	at [email protected]/sun.net.www.protocol.http.HttpURLConnection.followRedirect(HttpURLConnection.java:2456)
	at [email protected]/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1631)
	at [email protected]/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1302)
	at [email protected]/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:223)
	at [email protected]/java.net.URL.openStream(URL.java:1263)
	at app//org.jvnet.hudson.test.JavaNetReverseProxy2.service(JavaNetReverseProxy2.java:82)
	at app//jakarta.servlet.http.HttpServlet.service(HttpServlet.java:587)
	at app//org.eclipse.jetty.ee9.servlet.ServletHolder.handle(ServletHolder.java:781)
	at app//org.eclipse.jetty.ee9.servlet.ServletHandler.doHandle(ServletHandler.java:528)
	at app//org.eclipse.jetty.ee9.nested.ScopedHandler.nextHandle(ScopedHandler.java:193)
	at app//org.eclipse.jetty.ee9.nested.ContextHandler.doHandle(ContextHandler.java:1047)
	at app//org.eclipse.jetty.ee9.nested.ScopedHandler.nextScope(ScopedHandler.java:162)
	at app//org.eclipse.jetty.ee9.servlet.ServletHandler.doScope(ServletHandler.java:483)
	at app//org.eclipse.jetty.ee9.nested.ScopedHandler.nextScope(ScopedHandler.java:160)
	at app//org.eclipse.jetty.ee9.nested.ContextHandler.doScope(ContextHandler.java:962)
	at app//org.eclipse.jetty.ee9.nested.ScopedHandler.handle(ScopedHandler.java:123)
	at app//org.eclipse.jetty.ee9.nested.ContextHandler.handle(ContextHandler.java:1729)
	at app//org.eclipse.jetty.ee9.nested.HttpChannel$RequestDispatchable.dispatch(HttpChannel.java:1581)
	at app//org.eclipse.jetty.ee9.nested.HttpChannel.dispatch(HttpChannel.java:733)
	at app//org.eclipse.jetty.ee9.nested.HttpChannel.handle(HttpChannel.java:520)
	at app//org.eclipse.jetty.ee9.nested.ContextHandler$CoreContextHandler$CoreToNestedHandler.handle(ContextHandler.java:3054)
	at app//org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1224)
	at app//org.eclipse.jetty.server.Server.handle(Server.java:197)
	at app//org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:787)
	at app//org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:420)
	at app//org.eclipse.jetty.server.internal.HttpConnection$FillableCallback.succeeded(HttpConnection.java:1809)
	at app//org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
	at app//org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:54)
	at app//org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:1009)
	at app//org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1239)
	at app//org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1194)
	at [email protected]/java.lang.Thread.runWith(Thread.java:1487)
	at [email protected]/java.lang.Thread.run(Thread.java:1474)

	Number of locked synchronizers = 3
	- java.util.concurrent.locks.ReentrantLock$NonfairSync@77a0dd63
	- java.util.concurrent.locks.ReentrantLock$NonfairSync@543fe698
	- java.util.concurrent.locks.ReentrantLock$NonfairSync@6b2fdffc

Add a system property (SystemProperties.getDuration of here) with some sensible default, so if someone want to configure a higher timeout they have an option to do so.