package dials.datastore; import com.hazelcast.core.HazelcastInstance; import com.hazelcast.core.IMap; import dials.model.FeatureExecutionModel; import dials.model.FeatureModel; import dials.model.FilterModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.math.BigDecimal; public class DialsRepository implements FeatureManipulationActions { private Logger logger = LoggerFactory.getLogger(DialsRepository.class); private IMap<String, FeatureModel> featureMap; public DialsRepository(HazelcastInstance hazelcast) { featureMap = hazelcast.getMap("featureMap"); } public FeatureModel getFeature(String featureName) { return featureMap.get(featureName); } public void putFeature(FeatureModel featureModel) { featureMap.put(featureModel.getFeatureName(), featureModel); } @Override public void disableFeature(String featureName) { FeatureModel feature = getFeature(featureName); feature.setIsEnabled(false); putFeature(feature); } @Override public void registerFeatureAttempt(String featureName, boolean executed) { FeatureModel feature = getFeature(featureName); if (feature != null) { getExecution(feature).registerAttempt(executed); putFeature(feature); } } @Override public void registerFeatureError(String featureName) { FeatureModel feature = getFeature(featureName); if (feature != null) { FeatureExecutionModel execution = getExecution(feature); execution.registerError(); CountTuple tuple = new CountTuple(execution.getExecutions(), execution.getErrors()); if (tuple.getRateOfSuccess().compareTo(new BigDecimal(feature.getKillswitchThreshold())) < 0) { logger.warn("Feature fell below Killswitch Threshold. Disabling."); feature.setIsEnabled(false); } putFeature(feature); } } private FeatureExecutionModel getExecution(FeatureModel feature) { if (feature.getExecution() == null) { FeatureExecutionModel executionModel = new FeatureExecutionModel(); executionModel.setFeatureId(feature.getFeatureId()); executionModel.setAttempts(0); executionModel.setExecutions(0); executionModel.setErrors(0); feature.setExecution(executionModel); } return feature.getExecution(); } @Override public void performDialAdjustment(String featureName, String filterName, String dataKey, String dataValue) { FeatureModel feature = getFeature(featureName); FilterModel filter = feature.getFilter(filterName); filter.updateStaticData(dataKey, dataValue); filter.getDial().registerAttempt(); putFeature(feature); } }