package com.couchbase.loadgen.client; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.couchbase.loadgen.Config; import com.couchbase.loadgen.cluster.ClusterManager; import com.couchbase.loadgen.exception.WorkloadException; import com.couchbase.loadgen.generator.ChurnGenerator; import com.couchbase.loadgen.generator.IntegerGenerator; import com.couchbase.loadgen.generator.ScrambledZipfianGenerator; import com.couchbase.loadgen.memcached.SpymemcachedClient; import com.couchbase.loadgen.workloads.MemcachedCoreWorkload; import com.couchbase.loadgen.workloads.Workload; public class Loadgen extends Thread { private static final Logger LOG = LoggerFactory.getLogger(Loadgen.class); private Config cfg; StatsManager sm; ClientThreadPool pool; public Loadgen() { cfg = Config.getConfig(); } public void run() { // Run the client threads int threadcount = ((Integer)Config.getConfig().get(Config.THREAD_COUNT)).intValue(); IntegerGenerator keychooser = getRequestDistribution(); Workload workload = new MemcachedCoreWorkload(keychooser); if (workload != null) { pool = new ClientThreadPool(threadcount, workload, SpymemcachedClient.CLASSNAME); pool.join(); // Cleanup the worker threads workspace try { workload.cleanup(); } catch (WorkloadException e) { e.printStackTrace(System.out); System.exit(0); } } ClusterManager.getManager().finishedLoadGeneration(); LOG.info("Load generation finished"); } private IntegerGenerator getRequestDistribution() { String rdistribution = (String)Config.getConfig().get(Config.REQUEST_DISTRIBUTION); if (rdistribution.equals("zipfian")) { int recordcount = ((Integer)cfg.get(Config.RECORD_COUNT)).intValue(); int opcount = ((Integer)cfg.get(Config.OP_COUNT)).intValue(); double memset = ((Double)cfg.get(Config.MEMSET)).doubleValue(); int expectednewkeys = (int) (((double) opcount) * memset * 2.0); return new ScrambledZipfianGenerator(recordcount + expectednewkeys); } else if (rdistribution.equals("churn")) { return new ChurnGenerator(); } else { LOG.error("Invalid request distribution"); return null; } } public void terminate() { pool.close(); } }