1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.hadoop.hbase.master;
21
22 import org.apache.commons.logging.Log;
23 import org.apache.commons.logging.LogFactory;
24
25 import java.io.IOException;
26 import java.util.concurrent.Delayed;
27 import java.util.concurrent.TimeUnit;
28
29 abstract class RegionServerOperation implements Delayed {
30 protected static final Log LOG =
31 LogFactory.getLog(RegionServerOperation.class.getName());
32
33 private long expire;
34 protected final HMaster master;
35
36
37 private int delay;
38
39 protected RegionServerOperation(HMaster master) {
40 this.master = master;
41 this.delay = this.master.getConfiguration().
42 getInt("hbase.server.thread.wakefrequency", 10 * 1000);
43
44
45 resetExpiration();
46 }
47
48
49
50
51
52 long resetExpiration() {
53
54
55 this.expire = System.currentTimeMillis() + this.delay;
56 return this.expire;
57 }
58
59 public long getDelay(TimeUnit unit) {
60 return unit.convert(this.expire - System.currentTimeMillis(),
61 TimeUnit.MILLISECONDS);
62 }
63
64 void setDelay(final int d) {
65 this.delay = d;
66 }
67
68 public int compareTo(Delayed o) {
69 return Long.valueOf(getDelay(TimeUnit.MILLISECONDS)
70 - o.getDelay(TimeUnit.MILLISECONDS)).intValue();
71 }
72
73 protected void requeue() {
74 this.master.getRegionServerOperationQueue().putOnDelayQueue(this);
75 }
76
77 private long whenToExpire() {
78 return System.currentTimeMillis() + this.delay;
79 }
80
81 protected boolean rootAvailable() {
82 boolean available = true;
83 if (this.master.getRegionManager().getRootRegionLocation() == null) {
84 available = false;
85 requeue();
86 }
87 return available;
88 }
89
90 protected boolean metaTableAvailable() {
91 boolean available = true;
92 if ((master.getRegionManager().numMetaRegions() !=
93 master.getRegionManager().numOnlineMetaRegions()) ||
94 master.getRegionManager().metaRegionsInTransition()) {
95
96
97
98
99
100 if (LOG.isDebugEnabled()) {
101 LOG.debug("numberOfMetaRegions: " +
102 master.getRegionManager().numMetaRegions() +
103 ", onlineMetaRegions.size(): " +
104 master.getRegionManager().numOnlineMetaRegions());
105 LOG.debug("Requeuing because not all meta regions are online");
106 }
107 available = false;
108 requeue();
109 }
110 return available;
111 }
112
113 public int compareTo(RegionServerOperation other) {
114 return getPriority() - other.getPriority();
115 }
116
117
118 protected int getPriority() {
119 return Integer.MAX_VALUE;
120 }
121
122 protected abstract boolean process() throws IOException;
123 }