time.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package kafka
  2. import (
  3. "math"
  4. "time"
  5. )
  6. const (
  7. maxTimeout = time.Duration(math.MaxInt32) * time.Millisecond
  8. minTimeout = time.Duration(math.MinInt32) * time.Millisecond
  9. defaultRTT = 1 * time.Second
  10. )
  11. func makeTime(t int64) time.Time {
  12. if t <= 0 {
  13. return time.Time{}
  14. }
  15. return time.Unix(t/1000, (t%1000)*int64(time.Millisecond)).UTC()
  16. }
  17. func timestamp(t time.Time) int64 {
  18. if t.IsZero() {
  19. return 0
  20. }
  21. return t.UnixNano() / int64(time.Millisecond)
  22. }
  23. func makeDuration(ms int32) time.Duration {
  24. return time.Duration(ms) * time.Millisecond
  25. }
  26. func milliseconds(d time.Duration) int32 {
  27. switch {
  28. case d > maxTimeout:
  29. d = maxTimeout
  30. case d < minTimeout:
  31. d = minTimeout
  32. }
  33. return int32(d / time.Millisecond)
  34. }
  35. func deadlineToTimeout(deadline time.Time, now time.Time) time.Duration {
  36. if deadline.IsZero() {
  37. return maxTimeout
  38. }
  39. return deadline.Sub(now)
  40. }
  41. func adjustDeadlineForRTT(deadline time.Time, now time.Time, rtt time.Duration) time.Time {
  42. if !deadline.IsZero() {
  43. timeout := deadline.Sub(now)
  44. if timeout < rtt {
  45. rtt = timeout / 4
  46. }
  47. deadline = deadline.Add(-rtt)
  48. }
  49. return deadline
  50. }