Skip to content

[JENKINS-25897] Infinite loop with crontab "H H(19-24) * * *" #23651

Closed

Description

@jenkins-infra-bot

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 &quot;0 0 1 0 0&quot;" 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>
    

Activity

  1. jenkins-infra-bot commented on Dec 4, 2014

    @jenkins-infra-bot
    Author
    danielbeck:
    • Original comment link
    • 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.

    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.

  2. jenkins-infra-bot commented on Dec 22, 2014

    @jenkins-infra-bot
    Author
    jglick:
    • Original comment link
    • Raw content of original comment:

      Right, this should end in 23, not 24.

    Right, this should end in 23, not 24.

  3. jenkins-infra-bot commented on Dec 23, 2014

    @jenkins-infra-bot
    Author
    danielbeck:
    • Original comment link
    • Raw content of original comment:

      There's no range validation for the H(X-Y) syntax. It only ensures Y is at least X.

    There's no range validation for the H(X-Y) syntax. It only ensures Y is at least X.

  4. jenkins-infra-bot commented on Dec 23, 2014

    @jenkins-infra-bot
    Author
    scm_issue_link:

    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

  5. jenkins-infra-bot commented on Dec 23, 2014

    @jenkins-infra-bot
    Author
    scm_issue_link:

    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-25897 Add tests

  6. jenkins-infra-bot commented on Dec 23, 2014

    @jenkins-infra-bot
    Author
    scm_issue_link:

    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

  7. jenkins-infra-bot commented on Dec 23, 2014

    @jenkins-infra-bot
    Author
    dogfood:

    Integrated in jenkins_main_trunk #3889
    [FIXED JENKINS-25897] Add range check for H(X-Y) syntax (Revision 9a8329e)
    JENKINS-25897 Add tests (Revision b090751)

    Result = SUCCESS
    daniel-beck : 9a8329ebfe6b713acd8c6e42de095e44cd126f2c
    Files :

    • core/src/main/java/hudson/scheduler/BaseParser.java
    • core/src/main/grammar/crontab.g

    daniel-beck : b090751c16242402ad2187292e40f0f7bd5bbe10
    Files :

    • core/src/test/java/hudson/scheduler/CronTabTest.java
  8. jenkins-infra-bot commented on Mar 2, 2015

    @jenkins-infra-bot
    Author
    scm_issue_link:

    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)

  9. jenkins-infra-bot commented on Mar 2, 2015

    @jenkins-infra-bot
    Author
    scm_issue_link:

    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-25897 Add tests

    (cherry picked from commit b090751)

  10. jenkins-infra-bot commented on Sep 24, 2015

    @jenkins-infra-bot
    Author
    dogfood:

    Integrated in jenkins_main_trunk #4292
    [FIXED JENKINS-25897] Add range check for H(X-Y) syntax (Revision 6e67cb9)
    JENKINS-25897 Add tests (Revision b7ccd6b)

    Result = UNSTABLE
    ogondza : 6e67cb9e28707c19ded5c5c5c301ffe179ed5d64
    Files :

    • core/src/main/java/hudson/scheduler/BaseParser.java
    • core/src/main/grammar/crontab.g

    ogondza : b7ccd6bb14becb51a5df9ebf043d28323abd538a
    Files :

    • core/src/test/java/hudson/scheduler/CronTabTest.java
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions