1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.monitoring;
20
21 import org.apache.hadoop.classification.InterfaceAudience;
22 import org.codehaus.jackson.map.ObjectMapper;
23
24 import java.io.IOException;
25 import java.util.HashMap;
26 import java.util.Map;
27
28 @InterfaceAudience.Private
29 class MonitoredTaskImpl implements MonitoredTask {
30 private long startTime;
31 private long statusTime;
32 private long stateTime;
33
34 private volatile String status;
35 private volatile String description;
36
37 protected volatile State state = State.RUNNING;
38
39 public MonitoredTaskImpl() {
40 startTime = System.currentTimeMillis();
41 statusTime = startTime;
42 stateTime = startTime;
43 }
44
45 @Override
46 public synchronized MonitoredTaskImpl clone() {
47 try {
48 return (MonitoredTaskImpl) super.clone();
49 } catch (CloneNotSupportedException e) {
50 throw new AssertionError();
51 }
52 }
53
54 @Override
55 public long getStartTime() {
56 return startTime;
57 }
58
59 @Override
60 public String getDescription() {
61 return description;
62 }
63
64 @Override
65 public String getStatus() {
66 return status;
67 }
68
69 @Override
70 public long getStatusTime() {
71 return statusTime;
72 }
73
74 @Override
75 public State getState() {
76 return state;
77 }
78
79 @Override
80 public long getStateTime() {
81 return stateTime;
82 }
83
84 @Override
85 public long getCompletionTimestamp() {
86 if (state == State.COMPLETE || state == State.ABORTED) {
87 return stateTime;
88 }
89 return -1;
90 }
91
92 @Override
93 public void markComplete(String status) {
94 setState(State.COMPLETE);
95 setStatus(status);
96 }
97
98 @Override
99 public void pause(String msg) {
100 setState(State.WAITING);
101 setStatus(msg);
102 }
103
104 @Override
105 public void resume(String msg) {
106 setState(State.RUNNING);
107 setStatus(msg);
108 }
109
110 @Override
111 public void abort(String msg) {
112 setStatus(msg);
113 setState(State.ABORTED);
114 }
115
116 @Override
117 public void setStatus(String status) {
118 this.status = status;
119 statusTime = System.currentTimeMillis();
120 }
121
122 protected void setState(State state) {
123 this.state = state;
124 stateTime = System.currentTimeMillis();
125 }
126
127 @Override
128 public void setDescription(String description) {
129 this.description = description;
130 }
131
132 @Override
133 public void cleanup() {
134 if (state == State.RUNNING) {
135 setState(State.ABORTED);
136 }
137 }
138
139
140
141
142
143 public void expireNow() {
144 stateTime -= 180 * 1000;
145 }
146
147 @Override
148 public Map<String, Object> toMap() {
149 Map<String, Object> map = new HashMap<String, Object>();
150 map.put("description", getDescription());
151 map.put("status", getStatus());
152 map.put("state", getState());
153 map.put("starttimems", getStartTime());
154 map.put("statustimems", getCompletionTimestamp());
155 map.put("statetimems", getCompletionTimestamp());
156 return map;
157 }
158
159 @Override
160 public String toJSON() throws IOException {
161 ObjectMapper mapper = new ObjectMapper();
162 return mapper.writeValueAsString(toMap());
163 }
164
165 @Override
166 public String toString() {
167 StringBuilder sb = new StringBuilder(512);
168 sb.append(getDescription());
169 sb.append(": status=");
170 sb.append(getStatus());
171 sb.append(", state=");
172 sb.append(getState());
173 sb.append(", startTime=");
174 sb.append(getStartTime());
175 sb.append(", completionTime=");
176 sb.append(getCompletionTimestamp());
177 return sb.toString();
178 }
179
180 }