View Javadoc

1   /**
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  
19  package org.apache.hadoop.hbase.chaos.factories;
20  
21  import org.apache.hadoop.hbase.chaos.actions.Action;
22  import org.apache.hadoop.hbase.chaos.actions.AddColumnAction;
23  import org.apache.hadoop.hbase.chaos.actions.BatchRestartRsAction;
24  import org.apache.hadoop.hbase.chaos.actions.ChangeBloomFilterAction;
25  import org.apache.hadoop.hbase.chaos.actions.ChangeCompressionAction;
26  import org.apache.hadoop.hbase.chaos.actions.ChangeEncodingAction;
27  import org.apache.hadoop.hbase.chaos.actions.ChangeSplitPolicyAction;
28  import org.apache.hadoop.hbase.chaos.actions.ChangeVersionsAction;
29  import org.apache.hadoop.hbase.chaos.actions.CompactRandomRegionOfTableAction;
30  import org.apache.hadoop.hbase.chaos.actions.CompactTableAction;
31  import org.apache.hadoop.hbase.chaos.actions.DecreaseMaxHFileSizeAction;
32  import org.apache.hadoop.hbase.chaos.actions.DumpClusterStatusAction;
33  import org.apache.hadoop.hbase.chaos.actions.FlushRandomRegionOfTableAction;
34  import org.apache.hadoop.hbase.chaos.actions.FlushTableAction;
35  import org.apache.hadoop.hbase.chaos.actions.MergeRandomAdjacentRegionsOfTableAction;
36  import org.apache.hadoop.hbase.chaos.actions.MoveRandomRegionOfTableAction;
37  import org.apache.hadoop.hbase.chaos.actions.MoveRegionsOfTableAction;
38  import org.apache.hadoop.hbase.chaos.actions.RemoveColumnAction;
39  import org.apache.hadoop.hbase.chaos.actions.RestartActiveMasterAction;
40  import org.apache.hadoop.hbase.chaos.actions.RestartRandomRsAction;
41  import org.apache.hadoop.hbase.chaos.actions.RestartRsHoldingMetaAction;
42  import org.apache.hadoop.hbase.chaos.actions.RollingBatchRestartRsAction;
43  import org.apache.hadoop.hbase.chaos.actions.RollingBatchSuspendResumeRsAction;
44  import org.apache.hadoop.hbase.chaos.actions.SnapshotTableAction;
45  import org.apache.hadoop.hbase.chaos.actions.SplitAllRegionOfTableAction;
46  import org.apache.hadoop.hbase.chaos.actions.SplitRandomRegionOfTableAction;
47  import org.apache.hadoop.hbase.chaos.monkies.ChaosMonkey;
48  import org.apache.hadoop.hbase.chaos.monkies.PolicyBasedChaosMonkey;
49  import org.apache.hadoop.hbase.chaos.policies.CompositeSequentialPolicy;
50  import org.apache.hadoop.hbase.chaos.policies.DoActionsOncePolicy;
51  import org.apache.hadoop.hbase.chaos.policies.PeriodicRandomActionPolicy;
52  
53  public class SlowDeterministicMonkeyFactory extends MonkeyFactory {
54  
55    private long action1Period;
56    private long action2Period;
57    private long action3Period;
58    private long action4Period;
59    private long moveRegionsMaxTime;
60    private long moveRegionsSleepTime;
61    private long moveRandomRegionSleepTime;
62    private long restartRandomRSSleepTime;
63    private long batchRestartRSSleepTime;
64    private float batchRestartRSRatio;
65    private long restartActiveMasterSleepTime;
66    private long rollingBatchRestartRSSleepTime;
67    private float rollingBatchRestartRSRatio;
68    private long restartRsHoldingMetaSleepTime;
69    private float compactTableRatio;
70    private float compactRandomRegionRatio;
71    private long decreaseHFileSizeSleepTime;
72    private long rollingBatchSuspendRSSleepTime;
73    private float rollingBatchSuspendtRSRatio;
74  
75    @Override
76    public ChaosMonkey build() {
77  
78      loadProperties();
79      // Actions such as compact/flush a table/region,
80      // move one region around. They are not so destructive,
81      // can be executed more frequently.
82      Action[] actions1 = new Action[] {
83          new CompactTableAction(tableName, compactTableRatio),
84          new CompactRandomRegionOfTableAction(tableName, compactRandomRegionRatio),
85          new FlushTableAction(tableName),
86          new FlushRandomRegionOfTableAction(tableName),
87          new MoveRandomRegionOfTableAction(tableName)
88      };
89  
90      // Actions such as split/merge/snapshot.
91      // They should not cause data loss, or unreliability
92      // such as region stuck in transition.
93      Action[] actions2 = new Action[] {
94          new SplitRandomRegionOfTableAction(tableName),
95          new MergeRandomAdjacentRegionsOfTableAction(tableName),
96          new SnapshotTableAction(tableName),
97          new AddColumnAction(tableName),
98          new RemoveColumnAction(tableName, columnFamilies),
99          new ChangeEncodingAction(tableName),
100         new ChangeCompressionAction(tableName),
101         new ChangeBloomFilterAction(tableName),
102         new ChangeVersionsAction(tableName),
103         new ChangeSplitPolicyAction(tableName),
104     };
105 
106     // Destructive actions to mess things around.
107     Action[] actions3 = new Action[] {
108         new MoveRegionsOfTableAction(moveRegionsSleepTime, moveRegionsMaxTime,
109             tableName),
110         new MoveRandomRegionOfTableAction(moveRandomRegionSleepTime, tableName),
111         new RestartRandomRsAction(restartRandomRSSleepTime),
112         new BatchRestartRsAction(batchRestartRSSleepTime, batchRestartRSRatio),
113         new RestartActiveMasterAction(restartActiveMasterSleepTime),
114         new RollingBatchRestartRsAction(rollingBatchRestartRSSleepTime,
115             rollingBatchRestartRSRatio),
116         new RestartRsHoldingMetaAction(restartRsHoldingMetaSleepTime),
117         new DecreaseMaxHFileSizeAction(decreaseHFileSizeSleepTime, tableName),
118         new SplitAllRegionOfTableAction(tableName),
119       new RollingBatchSuspendResumeRsAction(rollingBatchSuspendRSSleepTime,
120           rollingBatchSuspendtRSRatio)
121     };
122 
123     // Action to log more info for debugging
124     Action[] actions4 = new Action[] {
125         new DumpClusterStatusAction()
126     };
127 
128     return new PolicyBasedChaosMonkey(util,
129         new PeriodicRandomActionPolicy(action1Period, actions1),
130         new PeriodicRandomActionPolicy(action2Period, actions2),
131         new CompositeSequentialPolicy(
132             new DoActionsOncePolicy(action3Period, actions3),
133             new PeriodicRandomActionPolicy(action3Period, actions3)),
134         new PeriodicRandomActionPolicy(action4Period, actions4));
135   }
136 
137   private void loadProperties() {
138 
139       action1Period = Long.parseLong(this.properties.getProperty(
140         MonkeyConstants.PERIODIC_ACTION1_PERIOD,
141         MonkeyConstants.DEFAULT_PERIODIC_ACTION1_PERIOD + ""));
142       action2Period = Long.parseLong(this.properties.getProperty(
143         MonkeyConstants.PERIODIC_ACTION2_PERIOD,
144         MonkeyConstants.DEFAULT_PERIODIC_ACTION2_PERIOD + ""));
145       action3Period = Long.parseLong(this.properties.getProperty(
146         MonkeyConstants.COMPOSITE_ACTION3_PERIOD,
147         MonkeyConstants.DEFAULT_COMPOSITE_ACTION3_PERIOD + ""));
148       action4Period = Long.parseLong(this.properties.getProperty(
149         MonkeyConstants.PERIODIC_ACTION4_PERIOD,
150         MonkeyConstants.DEFAULT_PERIODIC_ACTION4_PERIOD + ""));
151       moveRegionsMaxTime = Long.parseLong(this.properties.getProperty(
152         MonkeyConstants.MOVE_REGIONS_MAX_TIME,
153         MonkeyConstants.DEFAULT_MOVE_REGIONS_MAX_TIME + ""));
154       moveRegionsSleepTime = Long.parseLong(this.properties.getProperty(
155         MonkeyConstants.MOVE_REGIONS_SLEEP_TIME,
156         MonkeyConstants.DEFAULT_MOVE_REGIONS_SLEEP_TIME + ""));
157       moveRandomRegionSleepTime = Long.parseLong(this.properties.getProperty(
158         MonkeyConstants.MOVE_RANDOM_REGION_SLEEP_TIME,
159         MonkeyConstants.DEFAULT_MOVE_RANDOM_REGION_SLEEP_TIME + ""));
160       restartRandomRSSleepTime = Long.parseLong(this.properties.getProperty(
161         MonkeyConstants.RESTART_RANDOM_RS_SLEEP_TIME,
162         MonkeyConstants.DEFAULT_RESTART_RANDOM_RS_SLEEP_TIME + ""));
163       batchRestartRSSleepTime = Long.parseLong(this.properties.getProperty(
164         MonkeyConstants.BATCH_RESTART_RS_SLEEP_TIME,
165         MonkeyConstants.DEFAULT_BATCH_RESTART_RS_SLEEP_TIME + ""));
166       batchRestartRSRatio = Float.parseFloat(this.properties.getProperty(
167         MonkeyConstants.BATCH_RESTART_RS_RATIO,
168         MonkeyConstants.DEFAULT_BATCH_RESTART_RS_RATIO + ""));
169       restartActiveMasterSleepTime = Long.parseLong(this.properties.getProperty(
170         MonkeyConstants.RESTART_ACTIVE_MASTER_SLEEP_TIME,
171         MonkeyConstants.DEFAULT_RESTART_ACTIVE_MASTER_SLEEP_TIME + ""));
172       rollingBatchRestartRSSleepTime = Long.parseLong(this.properties.getProperty(
173         MonkeyConstants.ROLLING_BATCH_RESTART_RS_SLEEP_TIME,
174         MonkeyConstants.DEFAULT_ROLLING_BATCH_RESTART_RS_SLEEP_TIME + ""));
175       rollingBatchRestartRSRatio = Float.parseFloat(this.properties.getProperty(
176         MonkeyConstants.ROLLING_BATCH_RESTART_RS_RATIO,
177         MonkeyConstants.DEFAULT_ROLLING_BATCH_RESTART_RS_RATIO + ""));
178       restartRsHoldingMetaSleepTime = Long.parseLong(this.properties.getProperty(
179         MonkeyConstants.RESTART_RS_HOLDING_META_SLEEP_TIME,
180         MonkeyConstants.DEFAULT_RESTART_RS_HOLDING_META_SLEEP_TIME + ""));
181       compactTableRatio = Float.parseFloat(this.properties.getProperty(
182         MonkeyConstants.COMPACT_TABLE_ACTION_RATIO,
183         MonkeyConstants.DEFAULT_COMPACT_TABLE_ACTION_RATIO + ""));
184       compactRandomRegionRatio = Float.parseFloat(this.properties.getProperty(
185         MonkeyConstants.COMPACT_RANDOM_REGION_RATIO,
186         MonkeyConstants.DEFAULT_COMPACT_RANDOM_REGION_RATIO + ""));
187     decreaseHFileSizeSleepTime = Long.parseLong(this.properties.getProperty(
188         MonkeyConstants.DECREASE_HFILE_SIZE_SLEEP_TIME,
189         MonkeyConstants.DEFAULT_DECREASE_HFILE_SIZE_SLEEP_TIME + ""));
190     rollingBatchSuspendRSSleepTime = Long.parseLong(this.properties.getProperty(
191         MonkeyConstants.ROLLING_BATCH_RESTART_RS_SLEEP_TIME,
192         MonkeyConstants.DEFAULT_ROLLING_BATCH_RESTART_RS_SLEEP_TIME + ""));
193     rollingBatchSuspendtRSRatio = Float.parseFloat(this.properties.getProperty(
194         MonkeyConstants.ROLLING_BATCH_RESTART_RS_RATIO,
195         MonkeyConstants.DEFAULT_ROLLING_BATCH_RESTART_RS_RATIO + ""));
196   }
197 }