Repository navigation
[JENKINS-25897] Infinite loop with crontab "H H(19-24) * * *" #23651
Copy link
Copy link
Closed
Description
Bug similar to JENKINS-12356 and JENKINS-12357.
Problem: setting "Build periodically" on schedule H H(19-24) * * * triggers infinite loop. There are multiple threads taking all available CPU resources.
http://localhost:8080/threadDump shows traces like this:
"Handling GET /view/q/job/t/descriptorByName/hudson.triggers.TimerTrigger/checkSpec : RequestHandlerThread[#11]" Id=128 Group=main RUNNABLE
at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2592)
at java.util.Calendar.updateTime(Calendar.java:2606)
at java.util.Calendar.complete(Calendar.java:1558)
at java.util.GregorianCalendar.add(GregorianCalendar.java:891)
at hudson.scheduler.CronTab$CalendarField.addTo(CronTab.java:169)
at hudson.scheduler.CronTab.floor(CronTab.java:367)
at hudson.scheduler.CronTabList.previous(CronTabList.java:99)
at hudson.triggers.TimerTrigger$DescriptorImpl.doCheckSpec(TimerTrigger.java:81)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:298)
at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:161)
at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:96)
at org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:121)
at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:745)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:875)
at org.kohsuke.stapler.MetaClass$6.doDispatch(MetaClass.java:249)
at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:745)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:875)
at org.kohsuke.stapler.MetaClass$6.doDispatch(MetaClass.java:249)
at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:745)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:875)
at org.kohsuke.stapler.MetaClass$6.doDispatch(MetaClass.java:249)
at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:745)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:875)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:648)
at org.kohsuke.stapler.Stapler.service(Stapler.java:237)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:686)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1494)
at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:96)
at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:88)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:48)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84)
at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:76)
at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:164)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:46)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:81)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1474)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:533)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handle(Server.java:370)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489)
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:949)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1011)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:668)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
at winstone.BoundedExecutorService$1.run(BoundedExecutorService.java:77)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Number of locked synchronizers = 1
- java.util.concurrent.ThreadPoolExecutor$Worker@79fa1df7
The issue has been identified in production with 1.580.1 and 1.565.3. The following setup was enough to reproduce the problem:
- Jenkins: 1.580.1
- Cron Column Plugin 1.4 (not confirmed if relevant)
- java -version
java version "1.7.0_65" OpenJDK Runtime Environment (IcedTea 2.5.3) (7u71-2.5.3-0ubuntu1) OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode) ```</li> <li>running on Ubuntu 14.10</li> </ul> <p>Entering of this specific schedule was not enough to trigger the bug. A few editing attempts, especially changing "24" to 23 and back could trigger this infinite loop.</p> <p>In production jenkins the job with this particular schedule was not triggered at the specified hour.</p> <p>In case someone needs it: workaround for not restarting the master was to .stop() offending threads using Groovy console.</p> --- <details><summary><i>Originally reported by <a href="https://issues.jenkins.io/secure/ViewProfile.jspa?name=ortylp">ortylp</a>, imported from: <a class="no-jira-link-rewrite" href="https://issues.jenkins.io/browse/JENKINS-25897" target="_blank">Infinite loop with crontab "H H(19-24) * * *"</a></i></summary> <i><ul> <li><b>assignee</b>: <img align="left" width="20" src="https://raw.githubusercontent.com/jenkinsci/artifacts-from-jira-issues/refs/heads/main/avatars/danielbeck.png" title="danielbeck's avatar" /> <a href="https://issues.jenkins.io/secure/ViewProfile.jspa?name=danielbeck">danielbeck</a> <li><b>status</b>: Resolved <li><b>priority</b>: Major <li><b>component(s)</b>: core <li><b>label(s)</b>: 1.596.2-fixed <li><b>resolution</b>: Fixed <li><b>resolved</b>: 2014-12-23T13:43:53+00:00 <li><b>votes</b>: 1 <li><b>watchers</b>: 4 <li><b>imported</b>: 2025-11-24 </ul></i> <details><summary>Raw content of original issue</summary> <pre> <p>Bug similar to <a href="https://issues.jenkins.io/browse/JENKINS-12356" title="Infinite loop with crontab "0 0 1 0 0"" class="issue-link" data-issue-key="JENKINS-12356"><del>JENKINS-12356</del></a> and <a href="https://issues.jenkins.io/browse/JENKINS-12357" title="Infinite loop or invalid next execution with crontab DoW=7" class="issue-link" data-issue-key="JENKINS-12357"><del>JENKINS-12357</del></a>.</p> <p>Problem: setting "Build periodically" on schedule H H(19-24) * * * triggers infinite loop. There are multiple threads taking all available CPU resources.</p> <p><a href="http://localhost:8080/threadDump" class="external-link" target="_blank" rel="nofollow noopener">http://localhost:8080/threadDump</a> shows traces like this:</p> <div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent panelContent"> <pre>"Handling GET /view/q/job/t/descriptorByName/hudson.triggers.TimerTrigger/checkSpec : RequestHandlerThread[#11]" Id=128 Group=main RUNNABLE at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2592) at java.util.Calendar.updateTime(Calendar.java:2606) at java.util.Calendar.complete(Calendar.java:1558) at java.util.GregorianCalendar.add(GregorianCalendar.java:891) at hudson.scheduler.CronTab$CalendarField.addTo(CronTab.java:169) at hudson.scheduler.CronTab.floor(CronTab.java:367) at hudson.scheduler.CronTabList.previous(CronTabList.java:99) at hudson.triggers.TimerTrigger$DescriptorImpl.doCheckSpec(TimerTrigger.java:81) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:298) at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:161) at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:96) at org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:121) at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53) at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:745) at org.kohsuke.stapler.Stapler.invoke(Stapler.java:875) at org.kohsuke.stapler.MetaClass$6.doDispatch(MetaClass.java:249) at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53) at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:745) at org.kohsuke.stapler.Stapler.invoke(Stapler.java:875) at org.kohsuke.stapler.MetaClass$6.doDispatch(MetaClass.java:249) at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53) at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:745) at org.kohsuke.stapler.Stapler.invoke(Stapler.java:875) at org.kohsuke.stapler.MetaClass$6.doDispatch(MetaClass.java:249) at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53) at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:745) at org.kohsuke.stapler.Stapler.invoke(Stapler.java:875) at org.kohsuke.stapler.Stapler.invoke(Stapler.java:648) at org.kohsuke.stapler.Stapler.service(Stapler.java:237) at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:686) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1494) at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:96) at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:88) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482) at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:48) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482) at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84) at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:76) at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:164) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482) at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:46) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482) at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:81) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1474) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:533) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) at org.eclipse.jetty.server.Server.handle(Server.java:370) at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489) at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:949) at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1011) at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644) at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:668) at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52) at winstone.BoundedExecutorService$1.run(BoundedExecutorService.java:77) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Number of locked synchronizers = 1 - java.util.concurrent.ThreadPoolExecutor$Worker@79fa1df7 </pre> </div></div> <p>The issue has been identified in production with 1.580.1 and 1.565.3. The following setup was enough to reproduce the problem:</p> <ul> <li>Jenkins: 1.580.1</li> <li>Cron Column Plugin 1.4 (not confirmed if relevant)</li> <li>java -version <div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent panelContent"> <pre> java version "1.7.0_65" OpenJDK Runtime Environment (IcedTea 2.5.3) (7u71-2.5.3-0ubuntu1) OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode) </pre> </div></div></li> <li>running on Ubuntu 14.10</li> </ul> <p>Entering of this specific schedule was not enough to trigger the bug. A few editing attempts, especially changing "24" to 23 and back could trigger this infinite loop.</p> <p>In production jenkins the job with this particular schedule was not triggered at the specified hour.</p> <p>In case someone needs it: workaround for not restarting the master was to .stop() offending threads using Groovy console.</p></pre> </details> </details>
Reactions are currently unavailable
Activity
jenkins-infra-bot commentedon Dec 4, 2014
Raw content of original comment:
Schedules that cross date boundaries are not supported (e.g. H(22-2)), so there's probably something wrong in the check that allows schedules to end in hour 24.
jenkins-infra-bot commentedon Dec 22, 2014
Raw content of original comment:
Right, this should end in 23, not 24.
jenkins-infra-bot commentedon Dec 23, 2014
Raw content of original comment:
There's no range validation for the H(X-Y) syntax. It only ensures Y is at least X.
jenkins-infra-bot commentedon Dec 23, 2014
Raw content of original comment:
Code changed in jenkins
User: Daniel Beck
Path:
core/src/main/grammar/crontab.g
core/src/main/java/hudson/scheduler/BaseParser.java
http://jenkins-ci.org/commit/jenkins/9a8329ebfe6b713acd8c6e42de095e44cd126f2c
Log:
[FIXED JENKINS-25897] Add range check for H(X-Y) syntax
jenkins-infra-bot commentedon Dec 23, 2014
Raw content of original comment:
Code changed in jenkins
User: Daniel Beck
Path:
core/src/test/java/hudson/scheduler/CronTabTest.java
http://jenkins-ci.org/commit/jenkins/b090751c16242402ad2187292e40f0f7bd5bbe10
Log:
JENKINS-25897Add testsjenkins-infra-bot commentedon Dec 23, 2014
Raw content of original comment:
Code changed in jenkins
User: Oliver Gondža
Path:
core/src/main/grammar/crontab.g
core/src/main/java/hudson/scheduler/BaseParser.java
core/src/test/java/hudson/scheduler/CronTabTest.java
http://jenkins-ci.org/commit/jenkins/a89bcddc898898946214b29df2af0607bba09a89
Log:
Merge pull request #1500 from daniel-beck/
JENKINS-25897[FIXED JENKINS-25897] Add range check for H(X-Y) syntax
jenkins-infra-bot commentedon Dec 23, 2014
Raw content of original comment:
daniel-beck : b090751c16242402ad2187292e40f0f7bd5bbe10 Files :
Integrated in
jenkins_main_trunk #3889
[FIXED JENKINS-25897] Add range check for H(X-Y) syntax (Revision 9a8329e)
JENKINS-25897Add tests (Revision b090751)Result = SUCCESS
daniel-beck : 9a8329ebfe6b713acd8c6e42de095e44cd126f2c
Files :
daniel-beck : b090751c16242402ad2187292e40f0f7bd5bbe10
Files :
jenkins-infra-bot commentedon Mar 2, 2015
Raw content of original comment:
Code changed in jenkins
User: Daniel Beck
Path:
core/src/main/grammar/crontab.g
core/src/main/java/hudson/scheduler/BaseParser.java
http://jenkins-ci.org/commit/jenkins/6e67cb9e28707c19ded5c5c5c301ffe179ed5d64
Log:
[FIXED JENKINS-25897] Add range check for H(X-Y) syntax
(cherry picked from commit 9a8329e)
jenkins-infra-bot commentedon Mar 2, 2015
Raw content of original comment:
Code changed in jenkins
User: Daniel Beck
Path:
core/src/test/java/hudson/scheduler/CronTabTest.java
http://jenkins-ci.org/commit/jenkins/b7ccd6bb14becb51a5df9ebf043d28323abd538a
Log:
JENKINS-25897Add tests(cherry picked from commit b090751)
jenkins-infra-bot commentedon Sep 24, 2015
Raw content of original comment:
ogondza : b7ccd6bb14becb51a5df9ebf043d28323abd538a Files :
Integrated in
jenkins_main_trunk #4292
[FIXED JENKINS-25897] Add range check for H(X-Y) syntax (Revision 6e67cb9)
JENKINS-25897Add tests (Revision b7ccd6b)Result = UNSTABLE
ogondza : 6e67cb9e28707c19ded5c5c5c301ffe179ed5d64
Files :
ogondza : b7ccd6bb14becb51a5df9ebf043d28323abd538a
Files :