package com.bazaarvoice.ostrich.perftest.utils; import com.bazaarvoice.ostrich.ServiceEndPoint; import com.bazaarvoice.ostrich.metrics.Metrics; import com.bazaarvoice.ostrich.perftest.core.Service; import com.bazaarvoice.ostrich.pool.ServiceCache; import com.codahale.metrics.Meter; import com.codahale.metrics.MetricRegistry; import com.google.common.collect.ImmutableList; import java.util.List; public class ChaosRunner { private final ServiceCache<Service<String, String>> _serviceCache; private final int _chaosWorkers; private final Meter _chaosMeter, _stableMeter; private final int _chaosInterval; public ChaosRunner(ServiceCache<Service<String, String>> serviceCache, Arguments arguments, MetricRegistry metricRegistry) { _serviceCache = serviceCache; _chaosWorkers = arguments.getChaosWorkers(); Metrics.InstanceMetrics _metrics = Metrics.forInstance(metricRegistry, this, "ChaosRunner"); _chaosMeter = _metrics.meter("Chaos"); _stableMeter = _metrics.meter("Stable"); _chaosInterval = arguments.getChaosInterval(); } public List<Thread> generateChaosWorkers() { ImmutableList.Builder<Thread> chaosWorkersBuilder = ImmutableList.builder(); for(int i=0; i<_chaosWorkers; i++) { Runnable runnable = new Runnable() { @Override public void run() { while(!Thread.interrupted()) { try { int sleepTime = Utilities.getRandomInt(_chaosInterval); Utilities.sleepForSeconds(sleepTime); String hashName = HashFunction.getRandomHashName(); ServiceEndPoint endPoint = Utilities.buildServiceEndPoint(hashName); _serviceCache.evict(endPoint); _chaosMeter.mark(); Utilities.sleepForSeconds(_chaosInterval - sleepTime); _serviceCache.register(endPoint); _stableMeter.mark(); } catch(Exception ignored) { ignored.printStackTrace(); } } } }; chaosWorkersBuilder.add(new Thread(runnable)); } return chaosWorkersBuilder.build(); } }