docs: public void runBenchmark() throws Exception {
          System.out.print(HORIZONTAL_RULE);
          System.out.println(" Setup & Initialization");
          System.out.println(HORIZONTAL_RULE);
  
          // connect to one or more servers, loop until success
          connect(config.servers);
  
          // preload keys if requested
          System.out.println();
          if (config.preload) {
              System.out.println("Preloading data store...");
              for(int i=0; i < config.poolsize; i++) {
                  String keyStr = String.format(processor.KeyFormat, i);
                  byte[] valArr = processor.generateForStore().getStoreValue();
                  if (config.multisingleratio != 0.00) {
                      client.callProcedure(new NullCallback(),
                                           "STORER.upsert",
                                           keyStr,
                                           valArr);
                  }
                  client.callProcedure(new NullCallback(),
                                       "STORE.upsert",
                                       keyStr,
                                       valArr);
              }
              client.drain();
              System.out.println("Preloading complete.\n");
          }
  
          System.out.print(HORIZONTAL_RULE);
          System.out.println(" Starting Benchmark");
          System.out.println(HORIZONTAL_RULE);
  
          // Run the benchmark loop for the requested warmup time
          // The throughput may be throttled depending on client configuration
          System.out.println("Warming up...");
          final long warmupEndTime = System.currentTimeMillis() + (1000l * config.warmup);
          while (warmupEndTime > System.currentTimeMillis()) {
              // Decide whether to perform a GET or PUT operation
              if (rand.nextDouble() < config.getputratio) {
                  // Get a key/value pair using inbuilt select procedure, asynchronously
                  if (rand.nextDouble() < config.multisingleratio) {
                      client.callProcedure(new NullCallback(), "selectR", processor.generateRandomKeyForRetrieval());
                  }
                  else {
                      client.callProcedure(new NullCallback(), "STORE.select", processor.generateRandomKeyForRetrieval());
                  }
              }
              else {
                  String table = rand.nextDouble() < config.multisingleratio ? "STORER" : "STORE";
                  // Put a key/value pair using inbuilt upsert procedure, asynchronously
                  final PayloadProcessor.Pair pair = processor.generateForStore();
                  client.callProcedure(new NullCallback(), table+".upsert", pair.Key, pair.getStoreValue());
              }
          }
  
          // reset the stats after warmup
          fullStatsContext.fetchAndResetBaseline();
          periodicStatsContext.fetchAndResetBaseline();
  
          // print periodic statistics to the console
          benchmarkStartTS = System.currentTimeMillis();
          schedulePeriodicStats();
  
          // Run the benchmark loop for the requested duration
          // The throughput may be throttled depending on client configuration
          System.out.println("\nRunning benchmark...");
          final long benchmarkEndTime = System.currentTimeMillis() + (1000l * config.duration);
          while (benchmarkEndTime > System.currentTimeMillis()) {
              // Decide whether to perform a GET or PUT operation
              if (rand.nextDouble() < config.getputratio) {
                  // Get a key/value pair using inbuilt select procedure, asynchronously
                  if (rand.nextDouble() < config.multisingleratio) {
                      client.callProcedure(new GetCallback(), "selectR", processor.generateRandomKeyForRetrieval());
                  }
                  else {
                      client.callProcedure(new GetCallback(), "STORE.select", processor.generateRandomKeyForRetrieval());
                  }
              }
              else {
                  String table = rand.nextDouble() < config.multisingleratio ? "STORER" : "STORE";
                  // Put a key/value pair using inbuilt upsert procedure, asynchronously
                  final PayloadProcessor.Pair pair = processor.generateForStore();
                  client.callProcedure(new PutCallback(pair), table+".upsert", pair.Key, pair.getStoreValue());
              }
          }
  
          // cancel periodic stats printing
          timer.cancel();
  
          // block until all outstanding txns return
          client.drain();
  
          // print the summary results
          printResults();
  
          // close down the client connections
          client.close();
      }