OHTAKE Tomohiro created JENKINS-12676:
-----------------------------------------

             Summary: next-executions: Support evenly distributed crontab
                 Key: JENKINS-12676
                 URL: https://issues.jenkins-ci.org/browse/JENKINS-12676
             Project: Jenkins
          Issue Type: Bug
          Components: next-executions
         Environment: Next Executions 1.03
Jenkins 1.450
            Reporter: OHTAKE Tomohiro
            Priority: Minor


Jenkins 1.448 added a new feature for crontab to distribute crontab evenly.
See 
https://github.com/jenkinsci/jenkins/commit/b1bb3f66676b550971db08725d5c3cef5b42191b.

The issue is that next execution plugin does not support the new feature.
For instance, if a job is configured as crontab @daily,
next executions plugin says that the next will be 09/02/2012 00:00.
But actual next execution might be 09/02/2012 12:34 or 09/02/2012 01:23.

An unsafe workaround is to read private fiels of Trigger and CronTabList.

{code:title=NextExecutionsUtils.java}
@@ -25,9 +27,23 @@ public static NextBuilds getNextBuild(AbstractProject 
project){
                if(!project.isDisabled()){
                        Trigger trigger = 
project.getTrigger(TimerTrigger.class);
                        if(trigger != null){
-                               List<CronTab> crons = 
parseSpec(trigger.getSpec());
+                               Vector<CronTab> tabs;
+                               try {
+                                       Field fieldTriggerTabs = 
Trigger.class.getDeclaredField("tabs");
+                                       fieldTriggerTabs.setAccessible(true);
+                                       Field fieldCronTabListTabs = 
CronTabList.class.getDeclaredField("tabs");
+                                       
fieldCronTabListTabs.setAccessible(true);
+                                       CronTabList crontablist = 
(CronTabList)fieldTriggerTabs.get(trigger);
+                                       tabs = (Vector<CronTab>) 
fieldCronTabListTabs.get(crontablist);
+                               } catch (NoSuchFieldException ex) {
+                                       ex.printStackTrace();
+                                       throw new NoSuchFieldError();
+                               } catch (IllegalAccessException ex) {
+                                       ex.printStackTrace();
+                                       throw new IllegalAccessError();
+                               }
                                Calendar cal = null;
-                               for (CronTab cronTab : crons) {
+                               for (CronTab cronTab : tabs) {
                                        Date d = new Date();                    
        
                                        cal = (cal == null || 
cal.compareTo(cronTab.ceil(d.getTime())) > 0)? cronTab.ceil(d.getTime()) : cal; 
                                  
                                }
{code}


--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.jenkins-ci.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to