1package consul 2 3import ( 4 "math/rand" 5 "time" 6) 7 8// DurationMinusBuffer returns a duration, minus a buffer and jitter 9// subtracted from the duration. This function is used primarily for 10// servicing Consul TTL Checks in advance of the TTL. 11func DurationMinusBuffer(intv time.Duration, buffer time.Duration, jitter int64) time.Duration { 12 d := intv - buffer 13 if jitter == 0 { 14 d -= RandomStagger(d) 15 } else { 16 d -= RandomStagger(time.Duration(int64(d) / jitter)) 17 } 18 return d 19} 20 21// DurationMinusBufferDomain returns the domain of valid durations from a 22// call to DurationMinusBuffer. This function is used to check user 23// specified input values to DurationMinusBuffer. 24func DurationMinusBufferDomain(intv time.Duration, buffer time.Duration, jitter int64) (min time.Duration, max time.Duration) { 25 max = intv - buffer 26 if jitter == 0 { 27 min = max 28 } else { 29 min = max - time.Duration(int64(max)/jitter) 30 } 31 return min, max 32} 33 34// RandomStagger returns an interval between 0 and the duration 35func RandomStagger(intv time.Duration) time.Duration { 36 if intv == 0 { 37 return 0 38 } 39 return time.Duration(uint64(rand.Int63()) % uint64(intv)) 40} 41