Exemple #1
0
 public void run() {
   try {
     if (null == logger) {
       throw new NullPointerException("must call setLogger");
     }
     logger.info("starting");
     monitor();
     yield();
   } catch (Exception e) {
     if (e instanceof ExecutionException) {
       logger.logException("fatal execution error", e.getCause());
     } else {
       logger.logException("fatal error", e);
     }
     // stop the world
     System.exit(-1);
   } finally {
     pool.shutdownNow();
     running = false;
     logger.info(
         "exiting after "
             + timer.getEventCount()
             + "/"
             + taskCount
             + ", "
             + timer.getProgressMessage());
   }
 }
Exemple #2
0
  public void checkThrottle() {
    // optional throttling
    if (!config.isThrottled()) {
      return;
    }

    long sleepMillis;
    double throttledEventsPerSecond = config.getThrottledEventsPerSecond();
    boolean isEvents = (throttledEventsPerSecond > 0);
    int throttledBytesPerSecond = isEvents ? 0 : config.getThrottledBytesPerSecond();
    logger.fine(
        "throttling "
            + (isEvents
                // events
                ? (timer.getEventsPerSecond() + " tps to " + throttledEventsPerSecond + " tps")
                // bytes
                : (timer.getBytesPerSecond() + " B/sec to " + throttledBytesPerSecond + " B/sec")));
    // call the methods every time
    while ((throttledEventsPerSecond > 0 && (throttledEventsPerSecond < timer.getEventsPerSecond()))
        || (throttledBytesPerSecond > 0 && (throttledBytesPerSecond < timer.getBytesPerSecond()))) {
      if (isEvents) {
        sleepMillis =
            (long)
                Math.ceil(
                    Timer.MILLISECONDS_PER_SECOND
                        * ((timer.getEventCount() / throttledEventsPerSecond)
                            - timer.getDurationSeconds()));
      } else {
        sleepMillis =
            (long)
                Math.ceil(
                    Timer.MILLISECONDS_PER_SECOND
                        * ((timer.getBytes() / throttledBytesPerSecond)
                            - timer.getDurationSeconds()));
      }
      sleepMillis = Math.max(sleepMillis, 1);
      logger.finer("sleeping " + sleepMillis);
      try {
        Thread.sleep(sleepMillis);
      } catch (InterruptedException e) {
        // reset interrupt status and continue
        Thread.interrupted();
        logger.logException("interrupted", e);
      }
    }
    logger.fine(
        "throttled to "
            + (isEvents
                ? (timer.getEventsPerSecond() + " tps")
                : (timer.getBytesPerSecond() + " B/sec")));
  }
Exemple #3
0
 public void incrementTaskCount() {
   // logger.info("incrementing " + taskCount);
   if (taskCountFinal) {
     // get the stack trace to track this down
     logger.logException("BUG!", new SyncException("increment to final task count"));
     return;
   }
   taskCount++;
 }
Exemple #4
0
 /** @param _count */
 public void setFinalTaskCount(long _count) {
   synchronized (taskCountMutex) {
     if (taskCountFinal) {
       // get the stack trace to track this down
       throw new FatalException("BUG!", new SyncException("setter on final task count " + _count));
     }
     if (_count != taskCount) {
       // get the stack trace to track this down
       throw new FatalException(
           "BUG!", new SyncException("setter on final task count " + _count + " != " + taskCount));
     }
     logger.fine("setting " + _count);
     taskCountFinal = true;
   }
 }
Exemple #5
0
  /** @throws ExecutionException */
  protected void monitor() throws ExecutionException {
    int displayMillis = DISPLAY_MILLIS;
    int futureMillis = FUTURE_MILLIS;
    int sleepMillis = SLEEP_MILLIS;
    Future<TimedEvent[]> future = null;
    /* Initialize lastFutureMillis so that we do not get
     * warnings on slow queue startup.
     */
    long currentMillis = System.currentTimeMillis();
    long lastDisplayMillis = 0;
    long lastFutureMillis = currentMillis;
    TimedEvent[] lastEvent = null;

    logger.finest(
        "looping every "
            + sleepMillis
            + ", core="
            + pool.getCorePoolSize()
            + ", active="
            + pool.getActiveCount()
            + ", tasks="
            + taskCount);

    timer = new Timer();

    // run until all futures have been checked
    do {
      // try to avoid thread starvation
      yield();

      // check completed tasks
      // sometimes this goes so fast that we never leave the loop,
      // so progress is never displayed... so limit the number of loops.
      do {
        try {
          future = completionService.poll(SLEEP_MILLIS, TimeUnit.MILLISECONDS);
          if (null != future) {
            // record result, or throw exception
            lastFutureMillis = System.currentTimeMillis();
            try {
              lastEvent = future.get();
              if (null == lastEvent) {
                throw new FatalException("unexpected null event");
              }
              for (int i = 0; i < lastEvent.length; i++) {
                // discard events to reduce memory utilization
                if (null != lastEvent[i]) {
                  timer.add(lastEvent[i], false);
                }
              }
            } catch (ExecutionException e) {
              if (fatalErrors) {
                throw e;
              }
              Throwable cause = e.getCause();
              if (null != cause && cause instanceof FatalException) {
                throw (FatalException) cause;
              }
              logger.logException("non-fatal", e);
              timer.incrementEventCount(false);
            }
          }
        } catch (InterruptedException e) {
          // reset interrupt status and continue
          Thread.interrupted();
          logger.logException("interrupted in poll() or get()", e);
          continue;
        }

        currentMillis = System.currentTimeMillis();
        if (currentMillis - lastDisplayMillis > displayMillis) {
          lastDisplayMillis = currentMillis;
          logger.finer(
              "thread count: core="
                  + pool.getCorePoolSize()
                  + ", active="
                  + pool.getActiveCount()
                  + ", tasks="
                  + taskCount);
          if (null != lastEvent) {
            logger.info(
                ""
                    + timer.getEventCount()
                    + "/"
                    + taskCount
                    + ", "
                    + timer.getProgressMessage(false)
                    + ", "
                    + lastEvent[0].getDescription());

            if (config.doPrintCurrRate()) {
              String currMsg = timer.getCurrProgressMessage();
              if (currMsg != null) logger.info(currMsg);
            }
          }
        }

      } while (null != future);

      logger.finer(
          "running = "
              + running
              + ", terminated = "
              + pool.isTerminated()
              + ", last future = "
              + lastFutureMillis);
      // currentMillis has already been set recently
      if (currentMillis - lastFutureMillis > futureMillis) {
        logger.warning("no futures received in over " + futureMillis + " ms");
        break;
      }
    } while (running && !pool.isTerminated());
    // NB - caller will set running to false to ensure exit
  }
Exemple #6
0
 public void halt(Throwable t) {
   logger.logException("halting", t);
   running = false;
   pool.shutdownNow();
 }