Beispiel #1
0
    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();
      }
    }
Beispiel #2
0
  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;
  }