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.io.IOException;
22 import java.io.InputStream;
23 import java.io.OutputStream;
24
25 import org.apache.hadoop.hbase.classification.InterfaceAudience;
26 import org.apache.hadoop.hbase.classification.InterfaceStability;
27 import org.apache.hadoop.hbase.protobuf.generated.ProcedureProtos.SequentialProcedureData;
28
29
30
31
32
33
34
35
36
37
38 @InterfaceAudience.Private
39 @InterfaceStability.Evolving
40 public abstract class SequentialProcedure<TEnvironment> extends Procedure<TEnvironment> {
41 private boolean executed = false;
42
43 @Override
44 protected Procedure[] doExecute(final TEnvironment env)
45 throws ProcedureYieldException {
46 updateTimestamp();
47 try {
48 Procedure[] children = !executed ? execute(env) : null;
49 executed = !executed;
50 return children;
51 } finally {
52 updateTimestamp();
53 }
54 }
55
56 @Override
57 protected void doRollback(final TEnvironment env) throws IOException {
58 updateTimestamp();
59 if (executed) {
60 try {
61 rollback(env);
62 executed = !executed;
63 } finally {
64 updateTimestamp();
65 }
66 }
67 }
68
69 @Override
70 protected void serializeStateData(final OutputStream stream) throws IOException {
71 SequentialProcedureData.Builder data = SequentialProcedureData.newBuilder();
72 data.setExecuted(executed);
73 data.build().writeDelimitedTo(stream);
74 }
75
76 @Override
77 protected void deserializeStateData(final InputStream stream) throws IOException {
78 SequentialProcedureData data = SequentialProcedureData.parseDelimitedFrom(stream);
79 executed = data.getExecuted();
80 }
81 }