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.hadoop.hbase.RemoteExceptionHandler;
23
24 import java.io.IOException;
25 import java.util.ArrayList;
26 import java.util.List;
27 import java.util.concurrent.BlockingQueue;
28 import java.util.concurrent.LinkedBlockingQueue;
29 import java.util.concurrent.TimeUnit;
30
31
32
33
34
35
36
37
38
39
40 class MetaScanner extends BaseScanner {
41
42 private volatile BlockingQueue<MetaRegion> metaRegionsToScan =
43 new LinkedBlockingQueue<MetaRegion>();
44
45 private final List<MetaRegion> metaRegionsToRescan =
46 new ArrayList<MetaRegion>();
47
48
49
50
51
52
53 public MetaScanner(HMaster master) {
54 super(master, false, master.getShutdownRequested());
55 }
56
57
58
59
60 private boolean scanOneMetaRegion(MetaRegion region) {
61 while (!this.master.isClosed() &&
62 !this.master.getRegionManager().isInitialRootScanComplete() &&
63 this.master.getRegionManager().getRootRegionLocation() == null) {
64 sleep();
65 }
66 if (this.master.isClosed()) {
67 return false;
68 }
69
70 try {
71
72 synchronized (scannerLock) {
73 scanRegion(region);
74 this.master.getRegionManager().putMetaRegionOnline(region);
75 }
76 } catch (IOException e) {
77 e = RemoteExceptionHandler.checkIOException(e);
78 LOG.warn("Scan one META region: " + region.toString(), e);
79
80
81
82
83 if (!this.master.getRegionManager().isMetaRegionOnline(region.getStartKey())) {
84 LOG.debug("Scanned region is no longer in map of online " +
85 "regions or its value has changed");
86 return false;
87 }
88
89 this.master.checkFileSystem();
90 } catch (Exception e) {
91
92
93 LOG.error("Unexpected exception", e);
94 }
95 return true;
96 }
97
98 @Override
99 protected boolean initialScan() {
100 MetaRegion region = null;
101 while (!this.master.isClosed() &&
102 (region == null && metaRegionsToScan.size() > 0) &&
103 !metaRegionsScanned()) {
104 try {
105 region = metaRegionsToScan.poll(this.master.getThreadWakeFrequency(),
106 TimeUnit.MILLISECONDS);
107 } catch (InterruptedException e) {
108
109 }
110 if (region == null && metaRegionsToRescan.size() != 0) {
111 region = metaRegionsToRescan.remove(0);
112 }
113 if (region != null) {
114 if (!scanOneMetaRegion(region)) {
115 metaRegionsToRescan.add(region);
116 }
117 }
118 }
119 initialScanComplete = true;
120 return true;
121 }
122
123 @Override
124 protected void maintenanceScan() {
125 List<MetaRegion> regions =
126 this.master.getRegionManager().getListOfOnlineMetaRegions();
127 int regionCount = 0;
128 for (MetaRegion r: regions) {
129 scanOneMetaRegion(r);
130 regionCount++;
131 }
132 LOG.info("All " + regionCount + " .META. region(s) scanned");
133 metaRegionsScanned();
134 }
135
136
137
138
139
140
141
142
143 private synchronized boolean metaRegionsScanned() {
144 if (!this.master.getRegionManager().isInitialRootScanComplete() ||
145 this.master.getRegionManager().numMetaRegions() !=
146 this.master.getRegionManager().numOnlineMetaRegions()) {
147 return false;
148 }
149 notifyAll();
150 return true;
151 }
152
153
154
155
156
157 synchronized boolean waitForMetaRegionsOrClose() {
158 while (!this.master.isClosed()) {
159 synchronized (master.getRegionManager()) {
160 if (this.master.getRegionManager().isInitialRootScanComplete() &&
161 this.master.getRegionManager().numMetaRegions() ==
162 this.master.getRegionManager().numOnlineMetaRegions()) {
163 break;
164 }
165 }
166 try {
167 wait(this.master.getThreadWakeFrequency());
168 } catch (InterruptedException e) {
169
170 }
171 }
172 return this.master.isClosed();
173 }
174
175
176
177
178 void addMetaRegionToScan(MetaRegion m) {
179 metaRegionsToScan.add(m);
180 }
181 }