1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.replication.regionserver;
20
21 import java.util.HashMap;
22 import java.util.Map;
23
24 import org.apache.hadoop.hbase.classification.InterfaceAudience;
25 import org.apache.hadoop.hbase.CompatibilitySingletonFactory;
26 import org.apache.hadoop.hbase.HBaseInterfaceAudience;
27 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
28
29
30
31
32
33 @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.REPLICATION)
34 public class MetricsSource {
35
36
37 private Map<String, Long> lastTimeStamps = new HashMap<String, Long>();
38 private long lastHFileRefsQueueSize = 0;
39 private String id;
40
41 private final MetricsReplicationSourceSource singleSourceSource;
42 private final MetricsReplicationSourceSource globalSourceSource;
43 private Map<String, MetricsReplicationSourceSource> singleSourceSourceByTable;
44
45
46
47
48
49
50 public MetricsSource(String id) {
51 this.id = id;
52 singleSourceSource =
53 CompatibilitySingletonFactory.getInstance(MetricsReplicationSourceFactory.class)
54 .getSource(id);
55 globalSourceSource = CompatibilitySingletonFactory
56 .getInstance(MetricsReplicationSourceFactory.class).getGlobalSource();
57 singleSourceSourceByTable = new HashMap<>();
58 }
59
60
61
62
63
64
65
66 public MetricsSource(String id, MetricsReplicationSourceSource singleSourceSource,
67 MetricsReplicationSourceSource globalSourceSource,
68 Map<String, MetricsReplicationSourceSource> singleSourceSourceByTable) {
69 this.id = id;
70 this.singleSourceSource = singleSourceSource;
71 this.globalSourceSource = globalSourceSource;
72 this.singleSourceSourceByTable = singleSourceSourceByTable;
73 }
74
75
76
77
78
79
80 public void setAgeOfLastShippedOp(long timestamp, String walGroup) {
81 long age = EnvironmentEdgeManager.currentTime() - timestamp;
82 singleSourceSource.setLastShippedAge(age);
83 globalSourceSource.setLastShippedAge(Math.max(age, globalSourceSource.getLastShippedAge()));
84 this.lastTimeStamps.put(walGroup, timestamp);
85 }
86
87
88
89
90
91
92 public void setAgeOfLastShippedOpByTable(long timestamp, String tableName) {
93 long age = EnvironmentEdgeManager.currentTime() - timestamp;
94 if (!this.getSingleSourceSourceByTable().containsKey(tableName)) {
95 this.getSingleSourceSourceByTable().put(tableName,
96 CompatibilitySingletonFactory.getInstance(MetricsReplicationSourceFactory.class)
97 .getSource(tableName));
98 }
99 this.singleSourceSourceByTable.get(tableName).setLastShippedAge(age);
100 }
101
102
103
104
105
106 public void refreshAgeOfLastShippedOp(String walGroupId) {
107 Long lastTimestamp = this.lastTimeStamps.get(walGroupId);
108 if (lastTimestamp == null) {
109 this.lastTimeStamps.put(walGroupId, 0L);
110 lastTimestamp = 0L;
111 }
112 if (lastTimestamp > 0) {
113 setAgeOfLastShippedOp(lastTimestamp, walGroupId);
114 }
115 }
116
117
118
119
120 public void incrSizeOfLogQueue() {
121 singleSourceSource.incrSizeOfLogQueue(1);
122 globalSourceSource.incrSizeOfLogQueue(1);
123 }
124
125 public void decrSizeOfLogQueue() {
126 singleSourceSource.decrSizeOfLogQueue(1);
127 globalSourceSource.decrSizeOfLogQueue(1);
128 }
129
130
131
132
133
134
135 private void incrLogEditsRead(long delta) {
136 singleSourceSource.incrLogReadInEdits(delta);
137 globalSourceSource.incrLogReadInEdits(delta);
138 }
139
140
141 public void incrLogEditsRead() {
142 incrLogEditsRead(1);
143 }
144
145
146
147
148
149
150 public void incrLogEditsFiltered(long delta) {
151 singleSourceSource.incrLogEditsFiltered(delta);
152 globalSourceSource.incrLogEditsFiltered(delta);
153 }
154
155
156 public void incrLogEditsFiltered() {
157 incrLogEditsFiltered(1);
158 }
159
160
161
162
163
164
165 public void shipBatch(long batchSize, int sizeInBytes) {
166 singleSourceSource.incrBatchesShipped(1);
167 globalSourceSource.incrBatchesShipped(1);
168
169 singleSourceSource.incrOpsShipped(batchSize);
170 globalSourceSource.incrOpsShipped(batchSize);
171
172 singleSourceSource.incrShippedBytes(sizeInBytes);
173 globalSourceSource.incrShippedBytes(sizeInBytes);
174 }
175
176
177
178
179
180
181
182 public void shipBatch(long batchSize, int sizeInBytes, long hfiles) {
183 shipBatch(batchSize, sizeInBytes);
184 singleSourceSource.incrHFilesShipped(hfiles);
185 globalSourceSource.incrHFilesShipped(hfiles);
186 }
187
188
189 public void incrLogReadInBytes(long readInBytes) {
190 singleSourceSource.incrLogReadInBytes(readInBytes);
191 globalSourceSource.incrLogReadInBytes(readInBytes);
192 }
193
194
195 public void clear() {
196 int lastQueueSize = singleSourceSource.getSizeOfLogQueue();
197 globalSourceSource.decrSizeOfLogQueue(lastQueueSize);
198 singleSourceSource.decrSizeOfLogQueue(lastQueueSize);
199 singleSourceSource.clear();
200 globalSourceSource.decrSizeOfHFileRefsQueue(lastHFileRefsQueueSize);
201 lastTimeStamps.clear();
202 lastHFileRefsQueueSize = 0;
203 }
204
205
206
207
208
209 public Long getAgeOfLastShippedOp() {
210 return singleSourceSource.getLastShippedAge();
211 }
212
213
214
215
216
217 public int getSizeOfLogQueue() {
218 return singleSourceSource.getSizeOfLogQueue();
219 }
220
221
222
223
224
225 public long getTimeStampOfLastShippedOp() {
226 long lastTimestamp = 0L;
227 for (long ts : lastTimeStamps.values()) {
228 if (ts > lastTimestamp) {
229 lastTimestamp = ts;
230 }
231 }
232 return lastTimestamp;
233 }
234
235
236
237
238
239 public String getPeerID() {
240 return id;
241 }
242
243 public void incrSizeOfHFileRefsQueue(long size) {
244 singleSourceSource.incrSizeOfHFileRefsQueue(size);
245 globalSourceSource.incrSizeOfHFileRefsQueue(size);
246 lastHFileRefsQueueSize = size;
247 }
248
249 public void decrSizeOfHFileRefsQueue(int size) {
250 singleSourceSource.decrSizeOfHFileRefsQueue(size);
251 globalSourceSource.decrSizeOfHFileRefsQueue(size);
252 lastHFileRefsQueueSize -= size;
253 if (lastHFileRefsQueueSize < 0) {
254 lastHFileRefsQueueSize = 0;
255 }
256 }
257
258 public void incrUnknownFileLengthForClosedWAL() {
259 singleSourceSource.incrUnknownFileLengthForClosedWAL();
260 globalSourceSource.incrUnknownFileLengthForClosedWAL();
261 }
262
263 public void incrUncleanlyClosedWALs() {
264 singleSourceSource.incrUncleanlyClosedWALs();
265 globalSourceSource.incrUncleanlyClosedWALs();
266 }
267
268 public void incrBytesSkippedInUncleanlyClosedWALs(final long bytes) {
269 singleSourceSource.incrBytesSkippedInUncleanlyClosedWALs(bytes);
270 globalSourceSource.incrBytesSkippedInUncleanlyClosedWALs(bytes);
271 }
272
273 public void incrRestartedWALReading() {
274 singleSourceSource.incrRestartedWALReading();
275 globalSourceSource.incrRestartedWALReading();
276 }
277
278 public void incrRepeatedFileBytes(final long bytes) {
279 singleSourceSource.incrRepeatedFileBytes(bytes);
280 globalSourceSource.incrRepeatedFileBytes(bytes);
281 }
282
283 public void incrCompletedWAL() {
284 singleSourceSource.incrCompletedWAL();
285 globalSourceSource.incrCompletedWAL();
286 }
287
288 public void incrCompletedRecoveryQueue() {
289 singleSourceSource.incrCompletedRecoveryQueue();
290 globalSourceSource.incrCompletedRecoveryQueue();
291 }
292
293 public void incrFailedRecoveryQueue() {
294 globalSourceSource.incrFailedRecoveryQueue();
295 }
296
297 public Map<String, MetricsReplicationSourceSource> getSingleSourceSourceByTable() {
298 return singleSourceSourceByTable;
299 }
300 }