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, InterruptedException {
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)
58 throws IOException, InterruptedException {
59 updateTimestamp();
60 if (executed) {
61 try {
62 rollback(env);
63 executed = !executed;
64 } finally {
65 updateTimestamp();
66 }
67 }
68 }
69
70 @Override
71 protected void serializeStateData(final OutputStream stream) throws IOException {
72 SequentialProcedureData.Builder data = SequentialProcedureData.newBuilder();
73 data.setExecuted(executed);
74 data.build().writeDelimitedTo(stream);
75 }
76
77 @Override
78 protected void deserializeStateData(final InputStream stream) throws IOException {
79 SequentialProcedureData data = SequentialProcedureData.parseDelimitedFrom(stream);
80 executed = data.getExecuted();
81 }
82 }