-
Bug
-
Resolution: Unresolved
-
Minor
-
None
When using a init.groovy.d script to set the slave agent port to a fixed value (like the official docker image for Jenkins does), Jenkins shows an error message that seem to tell us that it failed to listen to the agent port.
java.net.BindException: Failed to listen on port 10000 because it's already in use.
at hudson.TcpSlaveAgentListener.<init>(TcpSlaveAgentListener.java:74)
at jenkins.model.Jenkins.<init>(Jenkins.java:825)
at hudson.model.Hudson.<init>(Hudson.java:83)
at hudson.model.Hudson.<init>(Hudson.java:79)
at hudson.WebAppMain$3.run(WebAppMain.java:225)
Caused by: java.net.BindException: Address already in use
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:436)
at sun.nio.ch.Net.bind(Net.java:428)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:67)
at hudson.TcpSlaveAgentListener.<init>(TcpSlaveAgentListener.java:72)
... 4 more
As a workaround, people have been adding delays, but really the issue is that we have the following sequence of events occurring :
- Jenkins init
- init.groovy.d
- calls Jenkins.getInstance(). setSlaveAgentPort(xxx)
- behind the scenes, this call starts the TcpSlaveAgentListener
- calls Jenkins.getInstance(). setSlaveAgentPort(xxx)
- initializes TcpSlaveAgentListener, but doesn't suppose that it may have been started before => the port is already taken, hence the error message above.
[JENKINS-29798] Failed to listen to incoming slave connection after fixing port through init.groovy.d
Description |
Original:
When using a init.groovy.d script to set the slave agent port to a fixed value (like the [official docker image|https://github.com/jenkinsci/docker/blob/master/init.groovy] for Jenkins does), Jenkins shows an error message that seem to tell us that it failed to listen to the agent port. {quote} java.net.BindException: Failed to listen on port 10000 because it's already in use. at hudson.TcpSlaveAgentListener.<init>(TcpSlaveAgentListener.java:74) at jenkins.model.Jenkins.<init>(Jenkins.java:825) at hudson.model.Hudson.<init>(Hudson.java:83) at hudson.model.Hudson.<init>(Hudson.java:79) at hudson.WebAppMain$3.run(WebAppMain.java:225) Caused by: java.net.BindException: Address already in use at sun.nio.ch.Net.bind0(Native Method) at sun.nio.ch.Net.bind(Net.java:436) at sun.nio.ch.Net.bind(Net.java:428) at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214) at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:67) at hudson.TcpSlaveAgentListener.<init>(TcpSlaveAgentListener.java:72) ... 4 more {quote} As a workaround, people have been adding delays, but really the issue is that we have the following sequence of events occurring : - Jenkins init - init.groovy.d - calls Jenkins.getInstance(). setSlaveAgentPort(xxx) - behind the scenes, this call starts the TcpSlaveAgentListener - initializes TcpSlaveAgentListener, but doesn't suppose that it may have been started before => the port is already taken, hence the error message above. |
New:
When using a init.groovy.d script to set the slave agent port to a fixed value (like the [official docker image|https://github.com/jenkinsci/docker/blob/master/init.groovy] for Jenkins does), Jenkins shows an error message that seem to tell us that it failed to listen to the agent port. {quote} java.net.BindException: Failed to listen on port 10000 because it's already in use. at hudson.TcpSlaveAgentListener.<init>(TcpSlaveAgentListener.java:74) at jenkins.model.Jenkins.<init>(Jenkins.java:825) at hudson.model.Hudson.<init>(Hudson.java:83) at hudson.model.Hudson.<init>(Hudson.java:79) at hudson.WebAppMain$3.run(WebAppMain.java:225) Caused by: java.net.BindException: Address already in use at sun.nio.ch.Net.bind0(Native Method) at sun.nio.ch.Net.bind(Net.java:436) at sun.nio.ch.Net.bind(Net.java:428) at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214) at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:67) at hudson.TcpSlaveAgentListener.<init>(TcpSlaveAgentListener.java:72) ... 4 more {quote} As a workaround, people have been adding delays, but really the issue is that we have the following sequence of events occurring : - Jenkins init - init.groovy.d -* calls Jenkins.getInstance(). setSlaveAgentPort(xxx) -** behind the scenes, this call starts the TcpSlaveAgentListener - initializes TcpSlaveAgentListener, but doesn't suppose that it may have been started before => the port is already taken, hence the error message above. |
Assignee | New: Vincent Latombe [ vlatombe ] |
Resolution | New: Fixed [ 1 ] | |
Status | Original: Open [ 1 ] | New: Resolved [ 5 ] |
Workflow | Original: JNJira [ 164874 ] | New: JNJira + In-Review [ 197568 ] |
Code changed in jenkins
User: Vincent Latombe
Path:
changelog.html
core/src/main/java/jenkins/model/Jenkins.java
http://jenkins-ci.org/commit/jenkins/7dfa765d8b7562ea25b8eab6c26d8c7a5ca6ef1b
Log:
[FIXED JENKINS-29798] Failed to listen to incoming slave connection
Factor tcpSlaveAgentListener logic to a single method able to shutdown
existing listener if required, then launch a new one if it needs to.
Also, the administrative monitor gets cleared if we had previously a
taken port and changed to a valid port.