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.ChangeCompressionAction;
25  import org.apache.hadoop.hbase.chaos.actions.ChangeBloomFilterAction;
26  import org.apache.hadoop.hbase.chaos.actions.ChangeEncodingAction;
27  import org.apache.hadoop.hbase.chaos.actions.ChangeVersionsAction;
28  import org.apache.hadoop.hbase.chaos.actions.CompactRandomRegionOfTableAction;
29  import org.apache.hadoop.hbase.chaos.actions.CompactTableAction;
30  import org.apache.hadoop.hbase.chaos.actions.DumpClusterStatusAction;
31  import org.apache.hadoop.hbase.chaos.actions.FlushRandomRegionOfTableAction;
32  import org.apache.hadoop.hbase.chaos.actions.FlushTableAction;
33  import org.apache.hadoop.hbase.chaos.actions.MergeRandomAdjacentRegionsOfTableAction;
34  import org.apache.hadoop.hbase.chaos.actions.MoveRandomRegionOfTableAction;
35  import org.apache.hadoop.hbase.chaos.actions.MoveRegionsOfTableAction;
36  import org.apache.hadoop.hbase.chaos.actions.RemoveColumnAction;
37  import org.apache.hadoop.hbase.chaos.actions.RestartActiveMasterAction;
38  import org.apache.hadoop.hbase.chaos.actions.RestartRandomRsAction;
39  import org.apache.hadoop.hbase.chaos.actions.RestartRsHoldingMetaAction;
40  import org.apache.hadoop.hbase.chaos.actions.RollingBatchRestartRsAction;
41  import org.apache.hadoop.hbase.chaos.actions.SnapshotTableAction;
42  import org.apache.hadoop.hbase.chaos.actions.SplitRandomRegionOfTableAction;
43  import org.apache.hadoop.hbase.chaos.monkies.ChaosMonkey;
44  import org.apache.hadoop.hbase.chaos.monkies.PolicyBasedChaosMonkey;
45  import org.apache.hadoop.hbase.chaos.policies.CompositeSequentialPolicy;
46  import org.apache.hadoop.hbase.chaos.policies.DoActionsOncePolicy;
47  import org.apache.hadoop.hbase.chaos.policies.PeriodicRandomActionPolicy;
48  
49  public class SlowDeterministicMonkeyFactory extends MonkeyFactory {
50  
51    private long action1Period;
52    private long action2Period;
53    private long action3Period;
54    private long action4Period;
55    private long moveRegionsMaxTime;
56    private long moveRegionsSleepTime;
57    private long moveRandomRegionSleepTime;
58    private long restartRandomRSSleepTime;
59    private long batchRestartRSSleepTime;
60    private float batchRestartRSRatio;
61    private long restartActiveMasterSleepTime;
62    private long rollingBatchRestartRSSleepTime;
63    private float rollingBatchRestartRSRatio;
64    private long restartRsHoldingMetaSleepTime;
65    private float compactTableRatio;
66    private float compactRandomRegionRatio;
67  
68    @Override
69    public ChaosMonkey build() {
70  
71      loadProperties();
72      // Actions such as compact/flush a table/region,
73      // move one region around. They are not so destructive,
74      // can be executed more frequently.
75      Action[] actions1 = new Action[] {
76          new CompactTableAction(tableName, compactTableRatio),
77          new CompactRandomRegionOfTableAction(tableName, compactRandomRegionRatio),
78          new FlushTableAction(tableName),
79          new FlushRandomRegionOfTableAction(tableName),
80          new MoveRandomRegionOfTableAction(tableName)
81      };
82  
83      // Actions such as split/merge/snapshot.
84      // They should not cause data loss, or unreliability
85      // such as region stuck in transition.
86      Action[] actions2 = new Action[] {
87          new SplitRandomRegionOfTableAction(tableName),
88          new MergeRandomAdjacentRegionsOfTableAction(tableName),
89          new SnapshotTableAction(tableName),
90          new AddColumnAction(tableName),
91          new RemoveColumnAction(tableName, columnFamilies),
92          new ChangeEncodingAction(tableName),
93          new ChangeCompressionAction(tableName),
94          new ChangeBloomFilterAction(tableName),
95          new ChangeVersionsAction(tableName)
96      };
97  
98      // Destructive actions to mess things around.
99      Action[] actions3 = new Action[] {
100         new MoveRegionsOfTableAction(moveRegionsSleepTime, moveRegionsMaxTime,
101             tableName),
102         new MoveRandomRegionOfTableAction(moveRandomRegionSleepTime, tableName),
103         new RestartRandomRsAction(restartRandomRSSleepTime),
104         new BatchRestartRsAction(batchRestartRSSleepTime, batchRestartRSRatio),
105         new RestartActiveMasterAction(restartActiveMasterSleepTime),
106         new RollingBatchRestartRsAction(rollingBatchRestartRSSleepTime,
107             rollingBatchRestartRSRatio),
108         new RestartRsHoldingMetaAction(restartRsHoldingMetaSleepTime)
109     };
110 
111     // Action to log more info for debugging
112     Action[] actions4 = new Action[] {
113         new DumpClusterStatusAction()
114     };
115 
116     return new PolicyBasedChaosMonkey(util,
117         new PeriodicRandomActionPolicy(action1Period, actions1),
118         new PeriodicRandomActionPolicy(action2Period, actions2),
119         new CompositeSequentialPolicy(
120             new DoActionsOncePolicy(action3Period, actions3),
121             new PeriodicRandomActionPolicy(action3Period, actions3)),
122         new PeriodicRandomActionPolicy(action4Period, actions4));
123   }
124 
125   private void loadProperties() {
126 
127       action1Period = Long.parseLong(this.properties.getProperty(
128         MonkeyConstants.PERIODIC_ACTION1_PERIOD,
129         MonkeyConstants.DEFAULT_PERIODIC_ACTION1_PERIOD + ""));
130       action2Period = Long.parseLong(this.properties.getProperty(
131         MonkeyConstants.PERIODIC_ACTION2_PERIOD,
132         MonkeyConstants.DEFAULT_PERIODIC_ACTION2_PERIOD + ""));
133       action3Period = Long.parseLong(this.properties.getProperty(
134         MonkeyConstants.COMPOSITE_ACTION3_PERIOD,
135         MonkeyConstants.DEFAULT_COMPOSITE_ACTION3_PERIOD + ""));
136       action4Period = Long.parseLong(this.properties.getProperty(
137         MonkeyConstants.PERIODIC_ACTION4_PERIOD,
138         MonkeyConstants.DEFAULT_PERIODIC_ACTION4_PERIOD + ""));
139       moveRegionsMaxTime = Long.parseLong(this.properties.getProperty(
140         MonkeyConstants.MOVE_REGIONS_MAX_TIME,
141         MonkeyConstants.DEFAULT_MOVE_REGIONS_MAX_TIME + ""));
142       moveRegionsSleepTime = Long.parseLong(this.properties.getProperty(
143         MonkeyConstants.MOVE_REGIONS_SLEEP_TIME,
144         MonkeyConstants.DEFAULT_MOVE_REGIONS_SLEEP_TIME + ""));
145       moveRandomRegionSleepTime = Long.parseLong(this.properties.getProperty(
146         MonkeyConstants.MOVE_RANDOM_REGION_SLEEP_TIME,
147         MonkeyConstants.DEFAULT_MOVE_RANDOM_REGION_SLEEP_TIME + ""));
148       restartRandomRSSleepTime = Long.parseLong(this.properties.getProperty(
149         MonkeyConstants.RESTART_RANDOM_RS_SLEEP_TIME,
150         MonkeyConstants.DEFAULT_RESTART_RANDOM_RS_SLEEP_TIME + ""));
151       batchRestartRSSleepTime = Long.parseLong(this.properties.getProperty(
152         MonkeyConstants.BATCH_RESTART_RS_SLEEP_TIME,
153         MonkeyConstants.DEFAULT_BATCH_RESTART_RS_SLEEP_TIME + ""));
154       restartActiveMasterSleepTime = Long.parseLong(this.properties.getProperty(
155         MonkeyConstants.RESTART_ACTIVE_MASTER_SLEEP_TIME,
156         MonkeyConstants.DEFAULT_RESTART_ACTIVE_MASTER_SLEEP_TIME + ""));
157       rollingBatchRestartRSSleepTime = Long.parseLong(this.properties.getProperty(
158         MonkeyConstants.ROLLING_BATCH_RESTART_RS_SLEEP_TIME,
159         MonkeyConstants.DEFAULT_ROLLING_BATCH_RESTART_RS_SLEEP_TIME + ""));
160       rollingBatchRestartRSRatio = Float.parseFloat(this.properties.getProperty(
161         MonkeyConstants.ROLLING_BATCH_RESTART_RS_RATIO,
162         MonkeyConstants.DEFAULT_ROLLING_BATCH_RESTART_RS_RATIO + ""));
163       restartRsHoldingMetaSleepTime = Long.parseLong(this.properties.getProperty(
164         MonkeyConstants.RESTART_RS_HOLDING_META_SLEEP_TIME,
165         MonkeyConstants.DEFAULT_RESTART_RS_HOLDING_META_SLEEP_TIME + ""));
166       compactTableRatio = Float.parseFloat(this.properties.getProperty(
167         MonkeyConstants.COMPACT_TABLE_ACTION_RATIO,
168         MonkeyConstants.DEFAULT_COMPACT_TABLE_ACTION_RATIO + ""));
169       compactRandomRegionRatio = Float.parseFloat(this.properties.getProperty(
170         MonkeyConstants.COMPACT_RANDOM_REGION_RATIO,
171         MonkeyConstants.DEFAULT_COMPACT_RANDOM_REGION_RATIO + ""));
172   }
173 }