1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.procedure2;
20
21 import java.util.ArrayList;
22 import java.util.HashSet;
23 import java.util.List;
24 import java.util.Set;
25
26 import org.apache.commons.logging.Log;
27 import org.apache.commons.logging.LogFactory;
28 import org.apache.hadoop.hbase.classification.InterfaceAudience;
29 import org.apache.hadoop.hbase.classification.InterfaceStability;
30 import org.apache.hadoop.hbase.protobuf.generated.ProcedureProtos.ProcedureState;
31
32
33
34
35
36
37
38
39
40
41
42
43 @InterfaceAudience.Private
44 @InterfaceStability.Evolving
45 class RootProcedureState {
46 private static final Log LOG = LogFactory.getLog(RootProcedureState.class);
47
48 private enum State {
49 RUNNING,
50 FAILED,
51 ROLLINGBACK,
52 }
53
54 private Set<Procedure> subprocs = null;
55 private ArrayList<Procedure> subprocStack = null;
56 private State state = State.RUNNING;
57 private int running = 0;
58
59 public synchronized boolean isFailed() {
60 switch (state) {
61 case ROLLINGBACK:
62 case FAILED:
63 return true;
64 default:
65 break;
66 }
67 return false;
68 }
69
70 public synchronized boolean isRollingback() {
71 return state == State.ROLLINGBACK;
72 }
73
74
75
76
77 protected synchronized boolean setRollback() {
78 if (running == 0 && state == State.FAILED) {
79 state = State.ROLLINGBACK;
80 return true;
81 }
82 return false;
83 }
84
85
86
87
88 protected synchronized void unsetRollback() {
89 assert state == State.ROLLINGBACK;
90 state = State.FAILED;
91 }
92
93 protected synchronized long[] getSubprocedureIds() {
94 if (subprocs == null) return null;
95 int index = 0;
96 final long[] subIds = new long[subprocs.size()];
97 for (Procedure proc: subprocs) {
98 subIds[index++] = proc.getProcId();
99 }
100 return subIds;
101 }
102
103 protected synchronized List<Procedure> getSubproceduresStack() {
104 return subprocStack;
105 }
106
107 protected synchronized RemoteProcedureException getException() {
108 if (subprocStack != null) {
109 for (Procedure proc: subprocStack) {
110 if (proc.hasException()) {
111 return proc.getException();
112 }
113 }
114 }
115 return null;
116 }
117
118
119
120
121 protected synchronized boolean acquire(final Procedure proc) {
122 if (state != State.RUNNING) return false;
123
124 running++;
125 return true;
126 }
127
128
129
130
131 protected synchronized void release(final Procedure proc) {
132 running--;
133 }
134
135 protected synchronized void abort() {
136 if (state == State.RUNNING) {
137 state = State.FAILED;
138 }
139 }
140
141
142
143
144
145 protected synchronized void addRollbackStep(final Procedure proc) {
146 if (proc.isFailed()) {
147 state = State.FAILED;
148 }
149 if (subprocStack == null) {
150 subprocStack = new ArrayList<Procedure>();
151 }
152 proc.addStackIndex(subprocStack.size());
153 subprocStack.add(proc);
154 }
155
156 protected synchronized void addSubProcedure(final Procedure proc) {
157 if (!proc.hasParent()) return;
158 if (subprocs == null) {
159 subprocs = new HashSet<Procedure>();
160 }
161 subprocs.add(proc);
162 }
163
164
165
166
167
168
169
170
171 protected synchronized void loadStack(final Procedure proc) {
172 addSubProcedure(proc);
173 int[] stackIndexes = proc.getStackIndexes();
174 if (stackIndexes != null) {
175 if (subprocStack == null) {
176 subprocStack = new ArrayList<Procedure>();
177 }
178 int diff = (1 + stackIndexes[stackIndexes.length - 1]) - subprocStack.size();
179 if (diff > 0) {
180 subprocStack.ensureCapacity(1 + stackIndexes[stackIndexes.length - 1]);
181 while (diff-- > 0) subprocStack.add(null);
182 }
183 for (int i = 0; i < stackIndexes.length; ++i) {
184 subprocStack.set(stackIndexes[i], proc);
185 }
186 }
187 if (proc.getState() == ProcedureState.ROLLEDBACK) {
188 state = State.ROLLINGBACK;
189 } else if (proc.isFailed()) {
190 state = State.FAILED;
191 }
192 }
193
194
195
196
197 protected synchronized boolean isValid() {
198 if (subprocStack != null) {
199 for (Procedure proc: subprocStack) {
200 if (proc == null) {
201 return false;
202 }
203 }
204 }
205 return true;
206 }
207 }