Skip to content

Commit

Permalink
get rid of 7s in ranges
Browse files Browse the repository at this point in the history
  • Loading branch information
dnr committed Sep 10, 2022
1 parent 2912033 commit b1ced54
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 18 deletions.
24 changes: 14 additions & 10 deletions service/worker/scheduler/calendar.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,17 +102,17 @@ func newCompiledCalendar(cal *schedpb.StructuredCalendarSpec, tz *time.Location)
var err error
if cc.year, err = makeSliceMatcher(cal.Year); err != nil {
return nil, err
} else if cc.month, err = makeBitMatcher(cal.Month, parseModeMonth); err != nil {
} else if cc.month, err = makeBitMatcher(cal.Month); err != nil {
return nil, err
} else if cc.dayOfMonth, err = makeBitMatcher(cal.DayOfMonth, parseModeInt); err != nil {
} else if cc.dayOfMonth, err = makeBitMatcher(cal.DayOfMonth); err != nil {
return nil, err
} else if cc.dayOfWeek, err = makeBitMatcher(cal.DayOfWeek, parseModeDow); err != nil {
} else if cc.dayOfWeek, err = makeBitMatcher(cal.DayOfWeek); err != nil {
return nil, err
} else if cc.hour, err = makeBitMatcher(cal.Hour, parseModeInt); err != nil {
} else if cc.hour, err = makeBitMatcher(cal.Hour); err != nil {
return nil, err
} else if cc.minute, err = makeBitMatcher(cal.Minute, parseModeInt); err != nil {
} else if cc.minute, err = makeBitMatcher(cal.Minute); err != nil {
return nil, err
} else if cc.second, err = makeBitMatcher(cal.Second, parseModeInt); err != nil {
} else if cc.second, err = makeBitMatcher(cal.Second); err != nil {
return nil, err
}
return cc, nil
Expand Down Expand Up @@ -351,13 +351,10 @@ func handlePredefinedCronStrings(c string) string {
}
}

func makeBitMatcher(ranges []*schedpb.Range, parseMode parseMode) (func(int) bool, error) {
func makeBitMatcher(ranges []*schedpb.Range) (func(int) bool, error) {
var bits uint64
add := func(i int) { bits |= 1 << i }
iterateRanges(ranges, add)
if parseMode == parseModeDow {
bits |= bits >> 7 // allow 7 or 0 for sunday
}
return func(v int) bool { return (1<<v)&bits != 0 }, nil
}

Expand Down Expand Up @@ -459,6 +456,13 @@ func makeRange(s, def string, min, max int, parseMode parseMode) ([]*schedpb.Ran
}
}
}
// special handling for sunday: turn "7" into "0", which may require an extra range
if parseMode == parseModeDow && end == 7 && (7-start)%step == 0 {
if step == 1 && start > 1 || step > 1 {
ranges = append(ranges, &schedpb.Range{Start: int32(0)})
}
end = 6
}
if start == end {
end = 0 // use default value so proto is smaller
}
Expand Down
23 changes: 16 additions & 7 deletions service/worker/scheduler/calendar_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,14 +104,23 @@ func (s *calendarSuite) TestCalendarMatch() {
s.True(cc.matches(time.Date(2022, time.March, 16, 12, 55, 55, 0, time.UTC)))

// different sunday representations
for _, dow := range []string{"0", "7", "sun", "*", "0-3", "5-7"} {
for _, dow := range []string{"0", "7", "sun", "*", "0-3", "5-7", "5-7/2", "6-7", "2-7/5", "0-7/7", "0/7"} {
cc = s.mustCompileCalendarSpec(&schedpb.CalendarSpec{
Second: "55",
Minute: "55",
Hour: "5",
DayOfWeek: dow,
}, pacific)
s.True(cc.matches(time.Date(2022, time.March, 6, 5, 55, 55, 0, pacific)))
}, time.UTC)
s.True(cc.matches(time.Date(2022, time.March, 6, 0, 0, 0, 0, time.UTC)))
}
for _, dow := range []string{"*", "5-7", "5-7/2", "6-7", "2/4", "2-7/4"} {
cc = s.mustCompileCalendarSpec(&schedpb.CalendarSpec{
DayOfWeek: dow,
}, time.UTC)
s.True(cc.matches(time.Date(2022, time.March, 5, 0, 0, 0, 0, time.UTC)))
}
for _, dow := range []string{"0", "7", "sun", "5-7", "5-7/2", "6-7", "2-7/5", "0-7/7", "0/7"} {
cc = s.mustCompileCalendarSpec(&schedpb.CalendarSpec{
DayOfWeek: dow,
}, time.UTC)
s.False(cc.matches(time.Date(2022, time.March, 7, 0, 0, 0, 0, time.UTC)))
}
}

Expand Down Expand Up @@ -287,7 +296,7 @@ func (s *calendarSuite) TestMakeMatcher() {
s.NoError(err)
var m func(int) bool
if max < 63 {
m, err = makeBitMatcher(ranges, parseMode)
m, err = makeBitMatcher(ranges)
} else {
m, err = makeSliceMatcher(ranges)
}
Expand Down
2 changes: 1 addition & 1 deletion service/worker/scheduler/spec_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ func (s *specSuite) TestCanonicalize() {
Hour: []*schedpb.Range{{Start: 5}, {Start: 7}},
DayOfMonth: []*schedpb.Range{{Start: 1, End: 31}},
Month: []*schedpb.Range{{Start: 1, End: 12}},
DayOfWeek: []*schedpb.Range{{Start: 0, End: 7}},
DayOfWeek: []*schedpb.Range{{Start: 0, End: 6}},
Year: []*schedpb.Range{{Start: minCalendarYear, End: maxCalendarYear}},
}}
s.Equal(&schedpb.ScheduleSpec{
Expand Down

0 comments on commit b1ced54

Please sign in to comment.