001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package org.apache.hadoop.hbase.chaos.policies; 019 020import java.util.concurrent.ThreadLocalRandom; 021import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; 022import org.apache.hadoop.hbase.util.Threads; 023 024/** A policy which does stuff every time interval. */ 025public abstract class PeriodicPolicy extends Policy { 026 private long periodMs; 027 028 public PeriodicPolicy(long periodMs) { 029 this.periodMs = periodMs; 030 } 031 032 @Override 033 public void run() { 034 // Add some jitter. 035 int jitter = ThreadLocalRandom.current().nextInt((int) periodMs); 036 LOG.info("Sleeping for {} ms to add jitter", jitter); 037 Threads.sleep(jitter); 038 039 while (!isStopped()) { 040 long start = EnvironmentEdgeManager.currentTime(); 041 runOneIteration(); 042 043 if (isStopped()) return; 044 long sleepTime = periodMs - (EnvironmentEdgeManager.currentTime() - start); 045 if (sleepTime > 0) { 046 LOG.info("Sleeping for {} ms", sleepTime); 047 Threads.sleep(sleepTime); 048 } 049 } 050 } 051 052 protected abstract void runOneIteration(); 053 054 @Override 055 public void init(PolicyContext context) throws Exception { 056 super.init(context); 057 LOG.info("Using ChaosMonkey Policy {}, period={} ms", this.getClass(), periodMs); 058 } 059}