| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.hadoop.fi; |
| |
| import java.util.Random; |
| |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| import org.apache.hadoop.conf.Configuration; |
| |
| /** |
| * This class is responsible for the decision of when a fault |
| * has to be triggered within a class of Hadoop |
| * |
| * Default probability of injection is set to 0%. To change it |
| * one can set the sys. prop. -Dfi.*=<new probability level> |
| * Another way to do so is to set this level through FI config file, |
| * located under src/test/fi-site.conf |
| * |
| * To change the level one has to specify the following sys,prop.: |
| * -Dfi.<name of fault location>=<probability level> in the runtime |
| * Probability level is specified by a float between 0.0 and 1.0 |
| * |
| * <name of fault location> might be represented by a short classname |
| * or otherwise. This decision is left up to the discretion of aspects |
| * developer, but has to be consistent through the code |
| */ |
| public class ProbabilityModel { |
| private static Random generator = new Random(); |
| private static final Log LOG = LogFactory.getLog(ProbabilityModel.class); |
| |
| static final String FPROB_NAME = "fi."; |
| private static final String ALL_PROBABILITIES = FPROB_NAME + "*"; |
| private static final float DEFAULT_PROB = 0.00f; //Default probability is 0% |
| private static final float MAX_PROB = 1.00f; // Max probability is 100% |
| |
| private static Configuration conf = FiConfig.getConfig(); |
| |
| static { |
| // Set new default probability if specified through a system.property |
| // If neither is specified set default probability to DEFAULT_PROB |
| conf.set(ALL_PROBABILITIES, |
| System.getProperty(ALL_PROBABILITIES, |
| conf.get(ALL_PROBABILITIES, Float.toString(DEFAULT_PROB)))); |
| |
| LOG.info(ALL_PROBABILITIES + "=" + conf.get(ALL_PROBABILITIES)); |
| } |
| |
| /** |
| * Simplistic method to check if we have reached the point of injection |
| * @param klassName is the name of the probability level to check. |
| * If a configuration has been set for "fi.myClass" then you can check if the |
| * inject criteria has been reached by calling this method with "myClass" |
| * string as its parameter |
| * @return true if the probability threshold has been reached; false otherwise |
| */ |
| public static boolean injectCriteria(String klassName) { |
| boolean trigger = false; |
| // TODO fix this: make it more sophisticated!!! |
| if (generator.nextFloat() < getProbability(klassName)) { |
| trigger = true; |
| } |
| return trigger; |
| } |
| |
| /** |
| * This primitive checks for arbitrary set of desired probability. If the |
| * level hasn't been set method will return default setting. |
| * The probability expected to be set as an float between 0.0 and 1.0 |
| * @param klass is the name of the resource |
| * @return float representation of configured probability level of |
| * the requested resource or default value if hasn't been set |
| */ |
| protected static float getProbability(final String klass) { |
| String newProbName = FPROB_NAME + klass; |
| |
| String newValue = System.getProperty(newProbName, conf.get(ALL_PROBABILITIES)); |
| if (newValue != null && !newValue.equals(conf.get(newProbName))) |
| conf.set(newProbName, newValue); |
| |
| float ret = conf.getFloat(newProbName, |
| conf.getFloat(ALL_PROBABILITIES, DEFAULT_PROB)); |
| LOG.debug("Request for " + newProbName + " returns=" + ret); |
| // Make sure that probability level is valid. |
| if (ret < DEFAULT_PROB || ret > MAX_PROB) |
| ret = conf.getFloat(ALL_PROBABILITIES, DEFAULT_PROB); |
| |
| return ret; |
| } |
| } |