protected void stopSlave(String name) throws InterruptedException {
   ServerRunner sr = slaveRunners.get(name);
   if (sr == null) {
     throw new RuntimeException("Slave does not exist!");
   } else {
     sr.stop();
   }
 }
 protected void startMaster() throws Exception {
   master = new TPCMaster(NUMSLAVES, new KVCache(1, 4));
   SocketServer clientSocketServer = new SocketServer(hostname, CLIENTPORT);
   clientSocketServer.addHandler(new TPCClientHandler(master));
   masterClientRunner = new ServerRunner(clientSocketServer, "masterClient");
   masterClientRunner.start();
   SocketServer slaveSocketServer = new SocketServer(hostname, SLAVEPORT);
   slaveSocketServer.addHandler(new TPCRegistrationHandler(master));
   masterSlaveRunner = new ServerRunner(slaveSocketServer, "masterSlave");
   masterSlaveRunner.start();
   Thread.sleep(100);
 }
  @After
  public void tearDown() throws InterruptedException {
    masterClientRunner.stop();
    masterSlaveRunner.stop();

    for (ServerRunner slaveRunner : slaveRunners.values()) {
      slaveRunner.stop();
    }

    client = null;
    master = null;
    slaveRunners = null;
  }
  protected void startSlave(long slaveID) throws Exception {
    String name = new Long(slaveID).toString();
    ServerRunner sr = slaveRunners.get(slaveID);
    if (sr != null) {
      sr.start();
      return;
    }

    SocketServer ss = new SocketServer(InetAddress.getLocalHost().getHostAddress(), 0);
    KVServer slaveKvs = new KVServer(100, 10);
    String logPath = "bin/log." + slaveID + "@" + ss.getHostname();
    TPCLog log = new TPCLog(logPath, slaveKvs);
    TPCMasterHandler handler = new TPCMasterHandler(slaveID, slaveKvs, log);
    ss.addHandler(handler);
    ServerRunner slaveRunner = new ServerRunner(ss, name);
    slaveRunner.start();
    slaveRunners.put(name, slaveRunner);

    handler.registerWithMaster(InetAddress.getLocalHost().getHostAddress(), ss);
  }