Esempio n. 1
0
  public static void main(String[] args) {

    Monitor timer = MonitorFactory.start("totaltime");
    for (int i = 1; i <= 10; i++) {
      System.out.println(MonitorFactory.add("NIC.bytes.sent", "bytes", i * 1000));
      System.out.println(MonitorFactory.add("negativetest", "neg", -1000.0 * i));
    }

    System.out.println("");
    Monitor m = null;
    m = MonitorFactory.start("purchasesTimeTestNoRange");

    for (int i = 1; i <= 1000000; i++) MonitorFactory.add("purchasesNoRange", "dollars", 1000.0);

    System.out.println("purchasesTimeTestNoRange=" + m.stop().getTotal());

    m = MonitorFactory.start("testTimerTimeTest");
    for (int i = 1; i <= 1000000; i++) MonitorFactory.start("testTimer").stop();

    System.out.println("testTimerTimeTest=" + m.stop().getTotal());
    for (int i = -5; i <= 20; i++) {
      MonitorFactory.add("purchases", "dollars", i * 50);
    }

    System.out.println("");

    System.out.println(MonitorFactory.add("NIC.bytes.received", "bytes", 250.0));
    System.out.println(MonitorFactory.add("NIC.bytes.received", "bytes", 250.0));

    timer.stop();

    for (int i = -5; i < 25; i++) MonitorFactory.add("timetest", "ms.", i * 5);

    System.out.println(MonitorFactory.getMonitor("purchases", "dollars").getHits());
    System.out.println(MonitorFactory.getTimeMonitor("testTimer").getHits());
    // case sensitive so won't print
    System.out.println(MonitorFactory.getTimeMonitor("testtimer").getHits());
    System.out.println("Total time=" + timer.getTotal());

    MonitorFactory.reset();
    MonitorFactory.setRangeDefault("dollars", getTestHolder());
    m = MonitorFactory.start("purchasesTimeTestRange");
    for (int i = 1; i <= 1000000; i++) MonitorFactory.add("purchasesRange", "dollars", 1000.0);

    System.out.println("purchasesTimeTestRange=" + m.stop().getTotal());
    Object[][] data = null;
    MonitorFactory.setRangeDefault("bytes", getTestHolder());
    MonitorFactory.setRangeDefault("cents", getTestHolder());
    MonitorFactory.setRangeDefault("minutes", getTestHolder());
    MonitorFactory.setRangeDefault("MB", getTestHolder());
    MonitorFactory.setRangeDefault("KB", getTestHolder());
    MonitorFactory.setRangeDefault("points", getTestHolder());

    String[] header = MonitorFactory.getComposite("ms.").getHeader();

    data = MonitorFactory.getComposite("ms.").getData();
    header = MonitorFactory.getComposite("ms.").getBasicHeader();

    data = MonitorFactory.getComposite("ms.").getBasicData();
    header = MonitorFactory.getComposite("ms.").getDisplayHeader();

    data = MonitorFactory.getComposite("ms.").getDisplayData();
    MonitorFactory.getComposite("ms.").disable();

    header = MonitorFactory.getComposite("ms.").getHeader();
    data = MonitorFactory.getComposite("ms.").getData();

    System.out.println("header length=" + header.length + ", data length=" + data.length);
    System.out.println("JAMon Version=" + MonitorFactory.getVersion());
  }
  /**
   * @param pages
   * @param workers
   * @param duration
   * @throws Exception
   */
  public void runContentionTest(final int pages, final int workers, final Duration duration)
      throws Exception {
    final PageAccessSynchronizer sync = new PageAccessSynchronizer(Duration.seconds(1));

    final AtomicInteger[] counts = new AtomicInteger[pages];
    for (int i = 0; i < counts.length; i++) {
      counts[i] = new AtomicInteger();
    }

    final AtomicInteger hits = new AtomicInteger();

    final String[] error = new String[1];

    class Worker extends Thread {
      @Override
      public void run() {
        Random random = new Random();
        Time start = Time.now();

        while (start.elapsedSince().lessThan(duration) && error[0] == null) {
          logger.info(
              "{} elapsed: {}, duration: {}",
              new Object[] {Thread.currentThread().getName(), start.elapsedSince(), duration});
          int page1 = random.nextInt(counts.length);
          int page2 = random.nextInt(counts.length);
          int count = 0;
          while (page2 == page1 && count < 100) {
            page2 = random.nextInt(counts.length);
            count++;
          }
          if (page2 == page1) {
            throw new RuntimeException("orly?");
          }
          try {
            sync.lockPage(page1);
            sync.lockPage(page2);
            // have locks, increment the count

            counts[page1].incrementAndGet();
            counts[page2].incrementAndGet();
            hits.incrementAndGet();

            // hold the lock for some time
            try {
              Thread.sleep(50);
            } catch (InterruptedException e) {
              error[0] = "Worker :" + Thread.currentThread().getName() + " interrupted";
            }

            // decrement the counts
            counts[page1].decrementAndGet();
            counts[page2].decrementAndGet();

            // release lock
          } catch (CouldNotLockPageException e) {
            // ignore
          } finally {
            sync.unlockAllPages();
          }
        }
      }
    }

    class Monitor extends Thread {
      volatile boolean stop = false;

      @Override
      public void run() {
        while (!stop && error[0] == null) {
          for (int i = 0; i < counts.length; i++) {
            int count = counts[i].get();

            if (count < 0 || count > 1) {
              error[0] = "Detected count of: " + count + " for page: " + i;
              return;
            }
          }
          try {
            Thread.sleep(1);
          } catch (InterruptedException e) {
            error[0] = "Monitor thread interrupted";
          }
        }
      }
    }

    Monitor monitor = new Monitor();
    monitor.setName("monitor");
    monitor.start();

    Worker[] bots = new Worker[workers];
    for (int i = 0; i < bots.length; i++) {
      bots[i] = new Worker();
      bots[i].setName("worker " + i);
      bots[i].start();
    }

    for (Worker bot : bots) {
      bot.join();
    }

    monitor.stop = true;
    monitor.join();

    assertNull(error[0], error[0]);
    assertTrue(hits.get() >= counts.length);
  }