public void run() { operations.initTimers(); try { SimpleClient sclient = null; ThriftClient tclient = null; JavaDriverClient jclient = null; switch (settings.mode.api) { case JAVA_DRIVER_NATIVE: jclient = settings.getJavaDriverClient(); break; case SIMPLE_NATIVE: sclient = settings.getSimpleNativeClient(); break; case THRIFT: case THRIFT_SMART: tclient = settings.getThriftClient(); break; default: throw new IllegalStateException(); } while (true) { Operation op = operations.next(); if (!op.ready(workManager, rateLimiter)) break; try { switch (settings.mode.api) { case JAVA_DRIVER_NATIVE: op.run(jclient); break; case SIMPLE_NATIVE: op.run(sclient); break; case THRIFT: case THRIFT_SMART: default: op.run(tclient); } } catch (Exception e) { if (output == null) { System.err.println(e.getMessage()); success = false; System.exit(-1); } e.printStackTrace(output); success = false; workManager.stop(); metrics.cancel(); return; } } } finally { done.countDown(); operations.closeTimers(); } }
private StressMetrics run( OpDistributionFactory operations, int threadCount, long opCount, long duration, RateLimiter rateLimiter, TimeUnit durationUnits, PrintStream output) { output.println( String.format( "Running %s with %d threads %s", operations.desc(), threadCount, durationUnits != null ? duration + " " + durationUnits.toString().toLowerCase() : opCount > 0 ? "for " + opCount + " iteration" : "until stderr of mean < " + settings.command.targetUncertainty)); final WorkManager workManager; if (opCount < 0) workManager = new WorkManager.ContinuousWorkManager(); else workManager = new WorkManager.FixedWorkManager(opCount); final StressMetrics metrics = new StressMetrics(output, settings.log.intervalMillis, settings); final CountDownLatch done = new CountDownLatch(threadCount); final Consumer[] consumers = new Consumer[threadCount]; for (int i = 0; i < threadCount; i++) { consumers[i] = new Consumer( operations, done, workManager, metrics, rateLimiter, settings.samples.liveCount / threadCount); } // starting worker threadCount for (int i = 0; i < threadCount; i++) consumers[i].start(); metrics.start(); if (durationUnits != null) { Uninterruptibles.sleepUninterruptibly(duration, durationUnits); workManager.stop(); } else if (opCount <= 0) { try { metrics.waitUntilConverges( settings.command.targetUncertainty, settings.command.minimumUncertaintyMeasurements, settings.command.maximumUncertaintyMeasurements); } catch (InterruptedException e) { } workManager.stop(); } try { done.await(); metrics.stop(); } catch (InterruptedException e) { } if (metrics.wasCancelled()) return null; metrics.summarise(); boolean success = true; for (Consumer consumer : consumers) success &= consumer.success; if (!success) return null; return metrics; }