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.policies;
20  
21  import org.apache.commons.lang.math.RandomUtils;
22  import org.apache.hadoop.hbase.util.Threads;
23  
24  /** A policy which does stuff every time interval. */
25  public abstract class PeriodicPolicy extends Policy {
26    private long periodMs;
27  
28    public PeriodicPolicy(long periodMs) {
29      this.periodMs = periodMs;
30    }
31  
32    @Override
33    public void run() {
34      // Add some jitter.
35      int jitter = RandomUtils.nextInt((int) periodMs);
36      LOG.info("Sleeping for " + jitter + " to add jitter");
37      Threads.sleep(jitter);
38  
39      while (!isStopped()) {
40        long start = System.currentTimeMillis();
41        runOneIteration();
42  
43        if (isStopped()) return;
44        long sleepTime = periodMs - (System.currentTimeMillis() - start);
45        if (sleepTime > 0) {
46          LOG.info("Sleeping for: " + sleepTime);
47          Threads.sleep(sleepTime);
48        }
49      }
50    }
51  
52    protected abstract void runOneIteration();
53  
54    @Override
55    public void init(PolicyContext context) throws Exception {
56      super.init(context);
57      LOG.info("Using ChaosMonkey Policy: " + this.getClass() + ", period: " + periodMs);
58    }
59  }