View Javadoc

1   /**
2    *
3    * Licensed to the Apache Software Foundation (ASF) under one
4    * or more contributor license agreements.  See the NOTICE file
5    * distributed with this work for additional information
6    * regarding copyright ownership.  The ASF licenses this file
7    * to you under the Apache License, Version 2.0 (the
8    * "License"); you may not use this file except in compliance
9    * with the License.  You may obtain a copy of the License at
10   *
11   *     http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing, software
14   * distributed under the License is distributed on an "AS IS" BASIS,
15   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16   * See the License for the specific language governing permissions and
17   * limitations under the License.
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(); // Won't happen
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    * Force the completion timestamp backwards so that
141    * it expires now.
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 }