/**
   * This test performs the following:<br>
   * 1)create server<br>
   * 2)initialize proxy object and create region for client<br>
   * 3)perform a PUT on client by acquiring Connection through proxy<br>
   * 4)stop server monitor threads in client to ensure that server treats this as dead client <br>
   * 5)wait for some time to allow server to clean up the dead client artifacts<br>
   * 6)again perform a PUT on client through same Connection and verify after the put that the
   * Connection object used was new one.
   */
  @Test
  public void testDeadClientRemovalByServer() throws Exception {
    PORT = createServer();
    createProxyAndRegionForClient();
    //    String connection2String = null;
    StatisticsType st = this.system.findType("CacheServerStats");
    final Statistics s = this.system.findStatisticsByType(st)[0];
    assertEquals(0, s.getInt("currentClients"));
    assertEquals(0, s.getInt("currentClientConnections"));
    this.system
        .getLogWriter()
        .info(
            "beforeAcquireConnection clients="
                + s.getInt("currentClients")
                + " cnxs="
                + s.getInt("currentClientConnections"));
    Connection connection1 = proxy.acquireConnection();
    this.system
        .getLogWriter()
        .info(
            "afterAcquireConnection clients="
                + s.getInt("currentClients")
                + " cnxs="
                + s.getInt("currentClientConnections"));
    this.system.getLogWriter().info("acquired connection " + connection1);
    WaitCriterion ev =
        new WaitCriterion() {
          public boolean done() {
            return s.getInt("currentClients") != 0;
          }

          public String description() {
            return null;
          }
        };
    Wait.waitForCriterion(ev, 20 * 1000, 200, true);

    assertEquals(1, s.getInt("currentClients"));
    assertEquals(1, s.getInt("currentClientConnections"));
    //    String connection1String = connection1.toString();
    ServerRegionProxy srp = new ServerRegionProxy("region1", proxy);
    srp.putOnForTestsOnly(connection1, "key-1", "value-1", new EventID(new byte[] {1}, 1, 1), null);
    this.system.getLogWriter().info("did put 1");
    // proxy.testfinalizeServerConnectionMonitor();
    ev =
        new WaitCriterion() {
          public boolean done() {
            return s.getInt("currentClients") == 0;
          }

          public String description() {
            return null;
          }
        };
    Wait.waitForCriterion(ev, TIME_BETWEEN_PINGS * 5, 200, true);

    {
      this.system
          .getLogWriter()
          .info(
              "currentClients="
                  + s.getInt("currentClients")
                  + " currentClientConnections="
                  + s.getInt("currentClientConnections"));
      assertEquals(0, s.getInt("currentClients"));
      assertEquals(0, s.getInt("currentClientConnections"));
    }
    addExceptions();
    // the connection should now fail since the server timed it out
    try {
      srp.putOnForTestsOnly(connection1, "key-1", "fail", new EventID(new byte[] {1}, 1, 2), null);
      fail("expected EOF");
    } catch (ServerConnectivityException expected) {
    }
    // The rest of this test no longer works.
    //     connection1.finalizeConnection();
    //     proxy.release();

    //     connection1 = proxy.acquireConnection();
    //     connection2String = connection1.toString();
    //     this.system.getLogWriter().info("connection is now " + connection2String);

    //     if (connection1String.equals(connection2String)) {
    //       fail("New connection object was not obtained");
    //     }
    //     connection1.putObject("region1", "key-1", "value-2", new EventID(new byte[] {1},1,3),
    // null);
    //     this.system.getLogWriter().info("did put 2");
    //     assertEquals(1, s.getInt("currentClients"));
    //     assertEquals(1, s.getInt("currentClientConnections"));

    //     // now lets see what happens when we close our connection
    //     // note we use a nasty close which just closes the socket instead
    //     // of sending a nice message to the server telling him we are going away
    //     ((ConnectionImpl)connection1).finalizeConnection();
    //     {
    //       int retry = (TIME_BETWEEN_PINGS*5) / 100;
    //       while (s.getInt("currentClients") > 0 && retry-- > 0) {
    //         Thread.sleep(100);
    //       }
    //       this.system.getLogWriter().info("currentClients="
    //                                       + s.getInt("currentClients")
    //                                       + " currentClientConnections="
    //                                       + s.getInt("currentClientConnections"));
    //       assertEquals(0, s.getInt("currentClients"));
    //       assertEquals(0, s.getInt("currentClientConnections"));
    //     }
  }
 public void addVolumeCheck(long total, long free, long time) {
   stats.setLong(volumeSizeId, total);
   stats.setLong(volumeFreeSpaceId, free);
   stats.incLong(volumeFreeSpaceChecksId, 1);
   stats.incLong(volumeFreeSpaceTimeId, time);
 }