• Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Major Major
    • core

      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)
        
      • running on Ubuntu 14.10

      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.

      In production jenkins the job with this particular schedule was not triggered at the specified hour.

      In case someone needs it: workaround for not restarting the master was to .stop() offending threads using Groovy console.

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

          Daniel Beck added a 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.

          Daniel Beck added a 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.

          Jesse Glick added a comment -

          Right, this should end in 23, not 24.

          Jesse Glick added a comment - Right, this should end in 23, not 24.

          Daniel Beck added a comment -

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

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

          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

          SCM/JIRA link daemon added a 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

          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

          SCM/JIRA link daemon added a 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-25897 Add tests

          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

          SCM/JIRA link daemon added a 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

          dogfood added a comment -

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

          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

          dogfood added a comment - Integrated in jenkins_main_trunk #3889 [FIXED JENKINS-25897] Add range check for H(X-Y) syntax (Revision 9a8329ebfe6b713acd8c6e42de095e44cd126f2c) JENKINS-25897 Add tests (Revision b090751c16242402ad2187292e40f0f7bd5bbe10) 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

          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 9a8329ebfe6b713acd8c6e42de095e44cd126f2c)

          SCM/JIRA link daemon added a 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 9a8329ebfe6b713acd8c6e42de095e44cd126f2c)

          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 b090751c16242402ad2187292e40f0f7bd5bbe10)

          SCM/JIRA link daemon added a 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-25897 Add tests (cherry picked from commit b090751c16242402ad2187292e40f0f7bd5bbe10)

          dogfood added a comment -

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

          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

          dogfood added a comment - Integrated in jenkins_main_trunk #4292 [FIXED JENKINS-25897] Add range check for H(X-Y) syntax (Revision 6e67cb9e28707c19ded5c5c5c301ffe179ed5d64) JENKINS-25897 Add tests (Revision b7ccd6bb14becb51a5df9ebf043d28323abd538a) 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

            danielbeck Daniel Beck
            ortylp Paul Ortyl
            Votes:
            1 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: