@Override public int doWork() { try { setupProcedureStore(); ExecutorService executor = Executors.newFixedThreadPool(numThreads); Future<?>[] futures = new Future<?>[numThreads]; // Start worker threads. long start = System.currentTimeMillis(); for (int i = 0; i < numThreads; i++) { futures[i] = executor.submit(this.new Worker(start)); } boolean failure = false; try { for (Future<?> future : futures) { long timeout = start + WORKER_THREADS_TIMEOUT_SEC * 1000 - System.currentTimeMillis(); failure |= (future.get(timeout, TimeUnit.MILLISECONDS).equals(EXIT_FAILURE)); } } catch (Exception e) { System.err.println("Exception in worker thread."); e.printStackTrace(); return EXIT_FAILURE; } executor.shutdown(); if (failure) { return EXIT_FAILURE; } long timeTaken = System.currentTimeMillis() - start; System.out.println("******************************************"); System.out.println("Num threads : " + numThreads); System.out.println("Num procedures : " + numProcs); System.out.println("Sync type : " + syncType); System.out.println("Time taken : " + (timeTaken / 1000.0f) + "sec"); System.out.println("******************************************"); return EXIT_SUCCESS; } catch (IOException e) { e.printStackTrace(); return EXIT_FAILURE; } finally { tearDownProcedureStore(); } }
// TODO: Can also collect #procs, time taken by each thread to measure fairness. @Override public Integer call() throws IOException { while (true) { if (workersFailed.get()) { return EXIT_FAILURE; } long procId = procIds.getAndIncrement(); if (procId >= numProcs) { break; } if (procId != 0 && procId % 10000 == 0) { long ms = System.currentTimeMillis() - start; System.out.println("Wrote " + procId + " procedures in " + StringUtils.humanTimeDiff(ms)); } try { if (procId > 0 && procId % numProcsPerWal == 0) { store.rollWriterForTesting(); System.out.println( "Starting new log : " + store.getActiveLogs().get(store.getActiveLogs().size() - 1)); } } catch (IOException ioe) { // Ask other threads to quit too. workersFailed.set(true); System.err.println("Exception when rolling log file. Current procId = " + procId); ioe.printStackTrace(); return EXIT_FAILURE; } ProcedureTestingUtility.TestProcedure proc = new ProcedureTestingUtility.TestProcedure(procId); proc.setData(serializedState); store.insert(proc, null); store.update(proc); } return EXIT_SUCCESS; }