1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.regionserver.compactions;
19
20 import java.util.Calendar;
21 import java.util.GregorianCalendar;
22 import org.apache.hadoop.hbase.classification.InterfaceAudience;
23 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
24
25 @InterfaceAudience.Private
26 public class CurrentHourProvider {
27
28 private CurrentHourProvider() {
29 throw new AssertionError();
30 }
31
32 private static final class Tick {
33 final int currentHour;
34 final long expirationTimeInMillis;
35
36 Tick(int currentHour, long expirationTimeInMillis) {
37 this.currentHour = currentHour;
38 this.expirationTimeInMillis = expirationTimeInMillis;
39 }
40 }
41
42 private static Tick nextTick() {
43 Calendar calendar = new GregorianCalendar();
44 calendar.setTimeInMillis(EnvironmentEdgeManager.currentTime());
45 int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
46 moveToNextHour(calendar);
47 return new Tick(currentHour, calendar.getTimeInMillis());
48 }
49
50 private static void moveToNextHour(Calendar calendar) {
51 calendar.add(Calendar.HOUR_OF_DAY, 1);
52 calendar.set(Calendar.MINUTE, 0);
53 calendar.set(Calendar.SECOND, 0);
54 calendar.set(Calendar.MILLISECOND, 0);
55 }
56
57 private static volatile Tick tick = nextTick();
58
59 public static int getCurrentHour() {
60 Tick tick = CurrentHourProvider.tick;
61 if (EnvironmentEdgeManager.currentTime() < tick.expirationTimeInMillis) {
62 return tick.currentHour;
63 }
64 tick = nextTick();
65 CurrentHourProvider.tick = tick;
66 return tick.currentHour;
67 }
68
69
70 static void advanceTick() {
71 tick = nextTick();
72 }
73 }