Changed way Guard works, Sped up code
[iotcloud.git] / version2 / src / java / iotcloud / Test.java
index 24af2f8cbf3ecc745e6856ac17f40b12d61b8b5e..60f9a25e4ab4a79b3c4004b8a3360ca5ceb36c4e 100644 (file)
@@ -8,137 +8,1096 @@ package iotcloud;
 
 public class Test {
 
-       public static final  int NUMBER_OF_TESTS = 20000; //66
+       public static final  int NUMBER_OF_TESTS = 1000;
 
-       public static void main(String[] args) {
+       public static void main(String[] args)  throws ServerException {
                if (args[0].equals("2")) {
                        test2();
                } else if (args[0].equals("3")) {
                        test3();
                } else if (args[0].equals("4")) {
                        test4();
+               } else if (args[0].equals("5")) {
+                       test5();
+               } else if (args[0].equals("6")) {
+                       test6();
+               } else if (args[0].equals("7")) {
+                       test7();
                }
+               // else if (args[0].equals("8")) {
+               //      test8();
+               // } else if (args[0].equals("9")) {
+               //      test9();
+               // }
        }
 
+       // static void test9()  throws ServerException {
+       //      // Setup the 2 clients
+       //      Table t1 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 321);
+       //      t1.initTable();
+       //      Table t2 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 351);
+       //      t2.update();
+
+
+       //      // Make the Keys
+       //      System.out.println("Setting up keys");
+       //      for (int i = 0; i < NUMBER_OF_TESTS; i++) {
+       //              String a = "a" + i;
+       //              String b = "b" + i;
+       //              String c = "c" + i;
+       //              String d = "d" + i;
+       //              IoTString ia = new IoTString(a);
+       //              IoTString ib = new IoTString(b);
+       //              IoTString ic = new IoTString(c);
+       //              IoTString id = new IoTString(d);
+       //              t1.createNewKey(ia, 321);
+       //              t1.createNewKey(ib, 351);
+       //              t2.createNewKey(ic, 321);
+       //              t2.createNewKey(id, 351);
+       //      }
+
+       //      for (int i = 0; i < NUMBER_OF_TESTS; i++) {
+       //              String a = "a" + i;
+       //              String b = "b" + i;
+       //              String c = "c" + i;
+       //              String d = "d" + i;
+       //              IoTString ia = new IoTString(a);
+       //              IoTString ib = new IoTString(b);
+       //              IoTString ic = new IoTString(c);
+       //              IoTString id = new IoTString(d);
+       //              t1.createNewKey(ia, 1000);
+       //              t1.createNewKey(ib, 1000);
+       //              t2.createNewKey(ic, 1000);
+       //              t2.createNewKey(id, 1000);
+       //      }
+
+       //      System.out.println("Updating Clients...");
+       //      t1.update();
+       //      t2.update();
+       //      t1.update();
+       //      t2.update();
+
+       //      boolean foundError = false;
+
+       //      System.out.println("Checking Key-Values...");
+       //      for (int i = 0; i < NUMBER_OF_TESTS; i++) {
+
+       //              String keyA = "a" + i;
+       //              String keyB = "b" + i;
+       //              String keyC = "c" + i;
+       //              String keyD = "d" + i;
+
+       //              IoTString iKeyA = new IoTString(keyA);
+       //              IoTString iKeyB = new IoTString(keyB);
+       //              IoTString iKeyC = new IoTString(keyC);
+       //              IoTString iKeyD = new IoTString(keyD);
+
+
+       //              Long testValA1 = t1.getArbitrator(iKeyA);
+       //              Long testValB1 = t1.getArbitrator(iKeyB);
+       //              Long testValC1 = t1.getArbitrator(iKeyC);
+       //              Long testValD1 = t1.getArbitrator(iKeyD);
+
+       //              Long testValA2 = t2.getArbitrator(iKeyA);
+       //              Long testValB2 = t2.getArbitrator(iKeyB);
+       //              Long testValC2 = t2.getArbitrator(iKeyC);
+       //              Long testValD2 = t2.getArbitrator(iKeyD);
+
+       //              if ((testValA1 == null) || (testValA1 != 321)) {
+       //                      System.out.println("Key-Value t1 incorrect: " + keyA + "    " + testValA1);
+       //                      foundError = true;
+       //              }
+
+       //              if ((testValB1 == null) || (testValB1 != 351)) {
+       //                      System.out.println("Key-Value t1 incorrect: " + keyB + "    " + testValB1);
+       //                      foundError = true;
+       //              }
+
+       //              if ((testValC1 == null) || (testValC1 != 321)) {
+       //                      System.out.println("Key-Value t1 incorrect: " + keyC + "    " + testValC1);
+       //                      foundError = true;
+       //              }
+
+       //              if ((testValD1 == null) || (testValD1 != 351)) {
+       //                      System.out.println("Key-Value t1 incorrect: " + keyD + "    " + testValD1);
+       //                      foundError = true;
+       //              }
+
+       //              if ((testValA2 == null) || (testValA2 != 321)) {
+       //                      System.out.println("Key-Value t2 incorrect: " + keyA + "    " + testValA2);
+       //                      foundError = true;
+       //              }
+
+       //              if ((testValB2 == null) || (testValB2 != 351)) {
+       //                      System.out.println("Key-Value t2 incorrect: " + keyB + "    " + testValB2);
+       //                      foundError = true;
+       //              }
+
+       //              if ((testValC2 == null) || (testValC2 != 321)) {
+       //                      System.out.println("Key-Value t2 incorrect: " + keyC + "    " + testValC2);
+       //                      foundError = true;
+       //              }
+
+       //              if ((testValD2 == null) || (testValD2 != 351)) {
+       //                      System.out.println("Key-Value t2 incorrect: " + keyD + "    " + testValD2);
+       //                      foundError = true;
+       //              }
+       //      }
+
+       //      if (foundError) {
+       //              System.out.println("Found Errors...");
+       //      } else {
+       //              System.out.println("No Errors Found...");
+       //      }
+       // }
+
+       // static void test8()  throws ServerException {
+
+       //      boolean foundError = false;
+
+       //      // Setup the 2 clients
+       //      Table t1 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 321);
+       //      t1.initTable();
+       //      Table t2 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 351);
+       //      t2.update();
+
+       //      // t1.rebuild();
+       //      // t2.rebuild();
+
+       //      // Make the Keys
+       //      System.out.println("Setting up keys");
+       //      for (int i = 0; i < NUMBER_OF_TESTS; i++) {
+       //              String a = "a" + i;
+       //              String b = "b" + i;
+       //              String c = "c" + i;
+       //              String d = "d" + i;
+       //              IoTString ia = new IoTString(a);
+       //              IoTString ib = new IoTString(b);
+       //              IoTString ic = new IoTString(c);
+       //              IoTString id = new IoTString(d);
+       //              t1.createNewKey(ia, 321);
+       //              t1.createNewKey(ib, 351);
+       //              t2.createNewKey(ic, 321);
+       //              t2.createNewKey(id, 351);
+       //      }
+
+
+       //      // Do Updates for the keys
+       //      System.out.println("Setting Key-Values...");
+
+
+       //      String keyA0 = "a0";
+       //      String keyB0 = "b0";
+       //      String keyC0 = "c0";
+       //      String keyD0 = "d0";
+       //      String valueA0 = "a0";
+       //      String valueB0 = "b0";
+       //      String valueC0 = "c0";
+       //      String valueD0 = "d0";
+
+       //      IoTString iKeyA0 = new IoTString(keyA0);
+       //      IoTString iKeyB0 = new IoTString(keyB0);
+       //      IoTString iKeyC0 = new IoTString(keyC0);
+       //      IoTString iKeyD0 = new IoTString(keyD0);
+       //      IoTString iValueA0 = new IoTString(valueA0);
+       //      IoTString iValueB0 = new IoTString(valueB0);
+       //      IoTString iValueC0 = new IoTString(valueC0);
+       //      IoTString iValueD0 = new IoTString(valueD0);
+
+       //      t1.startTransaction();
+       //      t1.addKV( iKeyA0, iValueA0);
+       //      t1.commitTransaction();
+
+       //      t1.startTransaction();
+       //      t1.addKV(iKeyB0, iValueB0);
+       //      t1.commitTransaction();
+
+       //      t2.startTransaction();
+       //      t2.addKV(iKeyC0, iValueC0);
+       //      t2.commitTransaction();
+
+       //      t2.startTransaction();
+       //      t2.addKV(iKeyD0, iValueD0);
+       //      t2.commitTransaction();
+
+       //      for (int i = 1; i < NUMBER_OF_TESTS; i++) {
+       //              String keyB = "b" + i;
+       //              String valueB = "b" + i;
+       //              IoTString iKeyB = new IoTString(keyB);
+       //              IoTString iValueB = new IoTString(valueB);
+
+       //              String keyBOld = "b" + (i - 1);
+       //              String valueBOld = "b" + (i - 1);
+       //              IoTString iKeyBOld = new IoTString(keyBOld);
+       //              IoTString iValueBOld = new IoTString(valueBOld);
+
+
+       //              t1.startTransaction();
+       //              t1.addGuard(new Guard(new IoTString(Guard.createExpression(iKeyBOld, iValueBOld, Guard.Equal))));
+       //              t1.addKV(iKeyB, iValueB);
+       //              t1.commitTransaction();
+       //      }
+
+       //      System.out.println("Checking Key-Values...");
+       //      for (int i = 0; i < NUMBER_OF_TESTS; i++) {
+
+       //              String keyB = "b" + i;
+       //              String valueB = "b" + i;
+
+       //              IoTString iKeyB = new IoTString(keyB);
+       //              IoTString iValueB = new IoTString(valueB);
+
+       //              IoTString testValB1 = t1.getSpeculative(iKeyB);
+
+       //              if ((testValB1 == null) || (testValB1.equals(iValueB) == false)) {
+       //                      System.out.println("Key-Value t1 incorrect: " + keyB);
+       //                      foundError = true;
+
+       //              }
+       //      }
+
+
+       //      System.out.println("Updating Clients...");
+       //      t1.update();
+       //      t2.update();
+       //      t1.update();
+       //      t2.update();
+
+       //      System.out.println("Checking Key-Values...");
+       //      for (int i = 0; i < NUMBER_OF_TESTS; i++) {
+
+       //              String keyA = "a" + i;
+       //              String keyB = "b" + i;
+       //              String keyC = "c" + i;
+       //              String keyD = "d" + i;
+       //              String valueA = "a" + i;
+       //              String valueB = "b" + i;
+       //              String valueC = "c" + i;
+       //              String valueD = "d" + i;
+
+       //              IoTString iKeyA = new IoTString(keyA);
+       //              IoTString iKeyB = new IoTString(keyB);
+       //              IoTString iKeyC = new IoTString(keyC);
+       //              IoTString iKeyD = new IoTString(keyD);
+       //              IoTString iValueA = new IoTString(valueA);
+       //              IoTString iValueB = new IoTString(valueB);
+       //              IoTString iValueC = new IoTString(valueC);
+       //              IoTString iValueD = new IoTString(valueD);
+
+
+       //              IoTString testValA1 = t1.getCommitted(iKeyA);
+       //              IoTString testValB1 = t1.getCommitted(iKeyB);
+       //              IoTString testValC1 = t1.getCommitted(iKeyC);
+       //              IoTString testValD1 = t1.getCommitted(iKeyD);
+
+       //              IoTString testValA2 = t2.getCommitted(iKeyA);
+       //              IoTString testValB2 = t2.getCommitted(iKeyB);
+       //              IoTString testValC2 = t2.getCommitted(iKeyC);
+       //              IoTString testValD2 = t2.getCommitted(iKeyD);
+
+
+       //              if (i == 0) {
+       //                      if ((testValA1 == null) || (testValA1.equals(iValueA) == false)) {
+       //                              System.out.println("Key-Value t1 incorrect: " + keyA);
+       //                              foundError = true;
+       //                      }
+
+       //                      if ((testValB1 == null) || (testValB1.equals(iValueB) == false)) {
+       //                              System.out.println("Key-Value t1 incorrect: " + keyB);
+       //                              foundError = true;
+       //                      }
+
+       //                      if ((testValC1 == null) || (testValC1.equals(iValueC) == false)) {
+       //                              System.out.println("Key-Value t1 incorrect: " + keyC);
+       //                              foundError = true;
+       //                      }
+
+       //                      if ((testValD1 == null) || (testValD1.equals(iValueD) == false)) {
+       //                              System.out.println("Key-Value t1 incorrect: " + keyD);
+       //                              foundError = true;
+       //                      }
+
+
+       //                      if ((testValA2 == null) || (testValA2.equals(iValueA) == false)) {
+       //                              System.out.println("Key-Value t2 incorrect: " + keyA + "    " + testValA2);
+       //                              foundError = true;
+       //                      }
+
+       //                      if ((testValB2 == null) || (testValB2.equals(iValueB) == false)) {
+       //                              System.out.println("Key-Value t2 incorrect: " + keyB + "    " + testValB2);
+       //                              foundError = true;
+       //                      }
+
+       //                      if ((testValC2 == null) || (testValC2.equals(iValueC) == false)) {
+       //                              System.out.println("Key-Value t2 incorrect: " + keyC + "    " + testValC2);
+       //                              foundError = true;
+       //                      }
+
+       //                      if ((testValD2 == null) || (testValD2.equals(iValueD) == false)) {
+       //                              System.out.println("Key-Value t2 incorrect: " + keyD + "    " + testValD2);
+       //                              foundError = true;
+       //                      }
+       //              } else {
+       //                      if (testValA1 != null) {
+       //                              System.out.println("Key-Value t1 incorrect: " + keyA);
+       //                              foundError = true;
+       //                      }
+
+       //                      if (testValB1 != null) {
+       //                              System.out.println("Key-Value t1 incorrect: " + keyB);
+       //                              foundError = true;
+       //                      }
+
+       //                      if (testValC1 != null) {
+       //                              System.out.println("Key-Value t1 incorrect: " + keyC);
+       //                              foundError = true;
+       //                      }
+
+       //                      if (testValD1 != null) {
+       //                              System.out.println("Key-Value t1 incorrect: " + keyD);
+       //                              foundError = true;
+       //                      }
+
+       //                      if (testValA2 != null) {
+       //                              System.out.println("Key-Value t2 incorrect: " + keyA + "    " + testValA2);
+       //                              foundError = true;
+       //                      }
+
+       //                      if (testValB2 != null) {
+       //                              System.out.println("Key-Value t2 incorrect: " + keyB + "    " + testValB2);
+       //                              foundError = true;
+       //                      }
+
+       //                      if (testValC2 != null) {
+       //                              System.out.println("Key-Value t2 incorrect: " + keyC + "    " + testValC2);
+       //                              foundError = true;
+       //                      }
+
+       //                      if (testValD2 != null) {
+       //                              System.out.println("Key-Value t2 incorrect: " + keyD + "    " + testValD2);
+       //                              foundError = true;
+       //                      }
+       //              }
+       //      }
+
+       //      if (foundError) {
+       //              System.out.println("Found Errors...");
+       //      } else {
+       //              System.out.println("No Errors Found...");
+       //      }
+       // }
+
+       // static void test7()  throws ServerException {
+
+       //      long startTime = 0;
+       //      long endTime = 0;
+
+       //      // Setup the 2 clients
+       //      Table t1 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 321);
+       //      t1.initTable();
+       //      Table t2 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 351);
+       //      t2.update();
+
+       //      // t1.rebuild();
+       //      // t2.rebuild();
+
+       //      // Make the Keys
+       //      System.out.println("Setting up keys");
+       //      startTime = System.currentTimeMillis();
+       //      for (int i = 0; i < NUMBER_OF_TESTS; i++) {
+       //              String a = "a" + i;
+       //              String b = "b" + i;
+       //              String c = "c" + i;
+       //              String d = "d" + i;
+       //              IoTString ia = new IoTString(a);
+       //              IoTString ib = new IoTString(b);
+       //              IoTString ic = new IoTString(c);
+       //              IoTString id = new IoTString(d);
+       //              t1.createNewKey(ia, 321);
+       //              t1.createNewKey(ib, 351);
+       //              t2.createNewKey(ic, 321);
+       //              t2.createNewKey(id, 351);
+       //      }
+       //      endTime = System.currentTimeMillis();
+
+       //      System.out.println("Time Taken: " + (double)   ((endTime - startTime) / 1000.0)    );
+       //      System.out.println("Time Taken Per Key: " + (double)  (((endTime - startTime) / 1000.0) / (NUMBER_OF_TESTS * 4))   );
+       //      System.out.println();
+
+
+       //      // Do Updates for the keys
+       //      System.out.println("Setting Key-Values...");
+       //      startTime = System.currentTimeMillis();
+
+
+
+       //      String keyA0 = "a0";
+       //      String keyB0 = "b0";
+       //      String keyC0 = "c0";
+       //      String keyD0 = "d0";
+       //      String valueA0 = "a0";
+       //      String valueB0 = "b0";
+       //      String valueC0 = "c0";
+       //      String valueD0 = "d0";
+
+       //      IoTString iKeyA0 = new IoTString(keyA0);
+       //      IoTString iKeyB0 = new IoTString(keyB0);
+       //      IoTString iKeyC0 = new IoTString(keyC0);
+       //      IoTString iKeyD0 = new IoTString(keyD0);
+       //      IoTString iValueA0 = new IoTString(valueA0);
+       //      IoTString iValueB0 = new IoTString(valueB0);
+       //      IoTString iValueC0 = new IoTString(valueC0);
+       //      IoTString iValueD0 = new IoTString(valueD0);
+
+       //      t1.startTransaction();
+       //      t1.addKV( iKeyA0, iValueA0);
+       //      t1.commitTransaction();
+
+       //      t1.startTransaction();
+       //      t1.addKV(iKeyB0, iValueB0);
+       //      t1.commitTransaction();
+
+       //      t2.startTransaction();
+       //      t2.addKV(iKeyC0, iValueC0);
+       //      t2.commitTransaction();
+
+       //      t2.startTransaction();
+       //      t2.addKV(iKeyD0, iValueD0);
+       //      t2.commitTransaction();
+
+       //      for (int i = 1; i < NUMBER_OF_TESTS; i++) {
+       //              String keyB = "b" + i;
+       //              String valueB = "b" + i;
+       //              IoTString iKeyB = new IoTString(keyB);
+       //              IoTString iValueB = new IoTString(valueB);
+
+       //              String keyBOld = "b" + (i - 1);
+       //              String valueBOld = "b" + (i - 2);
+       //              IoTString iKeyBOld = new IoTString(keyBOld);
+       //              IoTString iValueBOld = new IoTString(valueBOld);
+
+
+       //              t1.startTransaction();
+       //              t1.addGuard(new Guard(new IoTString(Guard.createExpression(iKeyBOld, iValueBOld, Guard.Equal))));
+       //              t1.addKV(iKeyB, iValueB);
+       //              t1.commitTransaction();
+       //      }
+
+       //      for (int i = 1; i < NUMBER_OF_TESTS; i++) {
+       //              String keyC = "c" + i;
+       //              String valueC = "c" + i;
+       //              IoTString iKeyC = new IoTString(keyC);
+       //              IoTString iValueC = new IoTString(valueC);
+
+       //              String keyCOld = "c" + (i - 1);
+       //              String valueCOld = "c" + (i - 2);
+       //              IoTString iKeyCOld = new IoTString(keyCOld);
+       //              IoTString iValueCOld = new IoTString(valueCOld);
+
+
+       //              t2.startTransaction();
+       //              t2.addGuard(new Guard(new IoTString(Guard.createExpression(iKeyCOld, iValueCOld, Guard.Equal))));
+       //              t2.addKV(iKeyC, iValueC);
+       //              t2.commitTransaction();
+       //      }
+
+       //      for (int i = 1; i < NUMBER_OF_TESTS; i++) {
+       //              String keyA = "a" + i;
+       //              String keyD = "d" + i;
+       //              String valueA = "a" + i;
+       //              String valueD = "d" + i;
+
+       //              IoTString iKeyA = new IoTString(keyA);
+       //              IoTString iKeyD = new IoTString(keyD);
+       //              IoTString iValueA = new IoTString(valueA);
+       //              IoTString iValueD = new IoTString(valueD);
+
+
+       //              String keyAOld = "a" + (i - 1);
+       //              String keyDOld = "d" + (i - 1);
+       //              String valueAOld = "a" + (i - 2);
+       //              String valueDOld = "d" + (i - 2);
+       //              IoTString iKeyAOld = new IoTString(keyAOld);
+       //              IoTString iKeyDOld = new IoTString(keyDOld);
+       //              IoTString iValueAOld = new IoTString(valueAOld);
+       //              IoTString iValueDOld = new IoTString(valueDOld);
+
+
+       //              t1.startTransaction();
+       //              t1.addGuard(new Guard(new IoTString(Guard.createExpression(iKeyAOld, iValueAOld, Guard.Equal))));
+       //              t1.addKV(iKeyA, iValueA);
+       //              t1.commitTransaction();
+
+       //              t2.startTransaction();
+       //              t2.addGuard(new Guard(new IoTString(Guard.createExpression(iKeyDOld, iValueDOld, Guard.Equal))));
+       //              t2.addKV(iKeyD, iValueD);
+       //              t2.commitTransaction();
+       //      }
+
+       //      endTime = System.currentTimeMillis();
+
+       //      System.out.println("Time Taken: " + (double)   ((endTime - startTime) / 1000.0)    );
+       //      System.out.println("Time Taken Per Update: " + (double)  (((endTime - startTime) / 1000.0) / (NUMBER_OF_TESTS * 4))   );
+       //      System.out.println();
+
+
+       //      System.out.println("Updating Clients...");
+       //      t1.update();
+       //      t2.update();
+       //      t1.update();
+       //      t2.update();
+
+       //      boolean foundError = false;
+
+       //      System.out.println("Checking Key-Values...");
+       //      for (int i = 0; i < NUMBER_OF_TESTS; i++) {
+
+       //              String keyA = "a" + i;
+       //              String keyB = "b" + i;
+       //              String keyC = "c" + i;
+       //              String keyD = "d" + i;
+       //              String valueA = "a" + i;
+       //              String valueB = "b" + i;
+       //              String valueC = "c" + i;
+       //              String valueD = "d" + i;
+
+       //              IoTString iKeyA = new IoTString(keyA);
+       //              IoTString iKeyB = new IoTString(keyB);
+       //              IoTString iKeyC = new IoTString(keyC);
+       //              IoTString iKeyD = new IoTString(keyD);
+       //              IoTString iValueA = new IoTString(valueA);
+       //              IoTString iValueB = new IoTString(valueB);
+       //              IoTString iValueC = new IoTString(valueC);
+       //              IoTString iValueD = new IoTString(valueD);
+
+
+       //              IoTString testValA1 = t1.getCommitted(iKeyA);
+       //              IoTString testValB1 = t1.getCommitted(iKeyB);
+       //              IoTString testValC1 = t1.getCommitted(iKeyC);
+       //              IoTString testValD1 = t1.getCommitted(iKeyD);
+
+       //              IoTString testValA2 = t2.getCommitted(iKeyA);
+       //              IoTString testValB2 = t2.getCommitted(iKeyB);
+       //              IoTString testValC2 = t2.getCommitted(iKeyC);
+       //              IoTString testValD2 = t2.getCommitted(iKeyD);
+
+
+       //              if (i == 0) {
+       //                      if ((testValA1 == null) || (testValA1.equals(iValueA) == false)) {
+       //                              System.out.println("Key-Value t1 incorrect: " + keyA);
+       //                              foundError = true;
+       //                      }
+
+       //                      if ((testValB1 == null) || (testValB1.equals(iValueB) == false)) {
+       //                              System.out.println("Key-Value t1 incorrect: " + keyB);
+       //                              foundError = true;
+       //                      }
+
+       //                      if ((testValC1 == null) || (testValC1.equals(iValueC) == false)) {
+       //                              System.out.println("Key-Value t1 incorrect: " + keyC);
+       //                              foundError = true;
+       //                      }
+
+       //                      if ((testValD1 == null) || (testValD1.equals(iValueD) == false)) {
+       //                              System.out.println("Key-Value t1 incorrect: " + keyD);
+       //                              foundError = true;
+       //                      }
+
+
+       //                      if ((testValA2 == null) || (testValA2.equals(iValueA) == false)) {
+       //                              System.out.println("Key-Value t2 incorrect: " + keyA + "    " + testValA2);
+       //                              foundError = true;
+       //                      }
+
+       //                      if ((testValB2 == null) || (testValB2.equals(iValueB) == false)) {
+       //                              System.out.println("Key-Value t2 incorrect: " + keyB + "    " + testValB2);
+       //                              foundError = true;
+       //                      }
+
+       //                      if ((testValC2 == null) || (testValC2.equals(iValueC) == false)) {
+       //                              System.out.println("Key-Value t2 incorrect: " + keyC + "    " + testValC2);
+       //                              foundError = true;
+       //                      }
+
+       //                      if ((testValD2 == null) || (testValD2.equals(iValueD) == false)) {
+       //                              System.out.println("Key-Value t2 incorrect: " + keyD + "    " + testValD2);
+       //                              foundError = true;
+       //                      }
+       //              } else {
+       //                      if (testValA1 != null) {
+       //                              System.out.println("Key-Value t1 incorrect: " + keyA);
+       //                              foundError = true;
+       //                      }
+
+       //                      if (testValB1 != null) {
+       //                              System.out.println("Key-Value t1 incorrect: " + keyB);
+       //                              foundError = true;
+       //                      }
+
+       //                      if (testValC1 != null) {
+       //                              System.out.println("Key-Value t1 incorrect: " + keyC);
+       //                              foundError = true;
+       //                      }
+
+       //                      if (testValD1 != null) {
+       //                              System.out.println("Key-Value t1 incorrect: " + keyD);
+       //                              foundError = true;
+       //                      }
+
+       //                      if (testValA2 != null) {
+       //                              System.out.println("Key-Value t2 incorrect: " + keyA + "    " + testValA2);
+       //                              foundError = true;
+       //                      }
+
+       //                      if (testValB2 != null) {
+       //                              System.out.println("Key-Value t2 incorrect: " + keyB + "    " + testValB2);
+       //                              foundError = true;
+       //                      }
+
+       //                      if (testValC2 != null) {
+       //                              System.out.println("Key-Value t2 incorrect: " + keyC + "    " + testValC2);
+       //                              foundError = true;
+       //                      }
+
+       //                      if (testValD2 != null) {
+       //                              System.out.println("Key-Value t2 incorrect: " + keyD + "    " + testValD2);
+       //                              foundError = true;
+       //                      }
+       //              }
+       //      }
+
+       //      if (foundError) {
+       //              System.out.println("Found Errors...");
+       //      } else {
+       //              System.out.println("No Errors Found...");
+       //      }
+       // }
+
+       static void test7() throws ServerException {
+
+               long startTime = 0;
+               long endTime = 0;
+               boolean foundError = false;
+
+               // Setup the 2 clients
+               Table t1 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 321);
+               t1.initTable();
+               Table t2 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 351);
+               t2.update();
+
+               startTime = System.currentTimeMillis();
+               // Make the Keys
+               System.out.println("Setting up keys");
+               for (int i = 0; i < 4; i++) {
+                       String a = "a" + i;
+                       String b = "b" + i;
+                       String c = "c" + i;
+                       String d = "d" + i;
+                       IoTString ia = new IoTString(a);
+                       IoTString ib = new IoTString(b);
+                       IoTString ic = new IoTString(c);
+                       IoTString id = new IoTString(d);
+                       t1.createNewKey(ia, 321);
+                       t1.createNewKey(ib, 351);
+                       t2.createNewKey(ic, 321);
+                       t2.createNewKey(id, 351);
+               }
+               endTime = System.currentTimeMillis();
+               System.out.println("Time Taken: " + (double)   ((endTime - startTime) / 1000.0)    );
+               System.out.println("Time Taken Per Key: " + (double)  (((endTime - startTime) / 1000.0) / (4))   );
+               System.out.println();
+
+               // Do Updates for the keys
+               System.out.println("Setting Key-Values...");
+
+               startTime = System.currentTimeMillis();
+               System.out.println("Setting b...");
+               for (int t = 0; t < NUMBER_OF_TESTS; t++) {
+                       for (int i = 0; i < 4; i++) {
+                               String keyB = "b" + i;
+                               String valueB = "b" + (i + t);
+
+                               IoTString iKeyB = new IoTString(keyB);
+                               IoTString iValueB = new IoTString(valueB);
+
+                               t1.startTransaction();
+                               t1.getSpeculativeAtomic(iKeyB);
+                               t1.addKV(iKeyB, iValueB);
+                               t1.commitTransaction();
+                       }
+               }
+               endTime = System.currentTimeMillis();
+               System.out.println("Time Taken: " + (double)   ((endTime - startTime) / 1000.0)    );
+               System.out.println("Time Taken Per Key: " + (double)  (((endTime - startTime) / 1000.0) / (4 * NUMBER_OF_TESTS))   );
+               System.out.println();
 
 
-       static void test5() {
-               Table t1 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 321);
-               t1.rebuild();
-               System.out.println(t1);
-
-               // // Print the results
-               // for (int i = 0; i < NUMBER_OF_TESTS; i++) {
-               //      String a = "a" + i;
-               //      String b = "b" + i;
-               //      IoTString ia = new IoTString(a);
-               //      IoTString ib = new IoTString(b);
-
-               //      System.out.println(ib + " -> " + t1.getCommitted(ib));
-               //      System.out.println(ia + " -> " + t2.getCommitted(ia));
-               //      System.out.println();
-               // }
-       }
 
-       static Thread buildThreadTest4(String prefix, Table t) {
-               return new Thread() {
-                       public void run() {
-                               for (int i = 0; i < (NUMBER_OF_TESTS * 3); i++) {
+               System.out.println("Checking b");
+               for (int i = 0; i < 4; i++) {
 
-                                       int num = i % NUMBER_OF_TESTS;
-                                       String key = prefix + num;
-                                       String value = prefix + (num + 2000);
-                                       IoTString iKey = new IoTString(key);
-                                       IoTString iValue = new IoTString(value);
+                       String keyB = "b" + i;
+                       String valueB = "b" + (i + NUMBER_OF_TESTS - 1);
+                       IoTString iKeyB = new IoTString(keyB);
+                       IoTString iValueB = new IoTString(valueB);
 
-                                       t.startTransaction();
-                                       t.addKV(iKey, iValue);
-                                       t.commitTransaction();
-                               }
+                       IoTString testValB1 = t1.getSpeculative(iKeyB);
+                       IoTString testValB2 = t2.getSpeculative(iKeyB);
+
+                       if ((testValB1 == null) || (testValB1.equals(iValueB) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyB + "    " + testValB1);
+                               foundError = true;
                        }
-               };
-       }
 
-       static void test4() {
-               Table t1 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 321);
-               Table t2 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 351);
-               t1.rebuild();
-               t2.rebuild();
+                       if ((testValB2 != null)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyB + "    " + testValB2);
+                               foundError = true;
+                       }
+               }
+
+               startTime = System.currentTimeMillis();
+               System.out.println("Setting c...");
+               for (int t = 0; t < NUMBER_OF_TESTS; t++) {
+                       for (int i = 0; i < 4; i++) {
+                               String keyC = "c" + i;
+                               String valueC = "c" + (i + t);
+
+                               IoTString iKeyC = new IoTString(keyC);
+                               IoTString iValueC = new IoTString(valueC);
+
+                               t2.startTransaction();
+                               t2.getSpeculativeAtomic(iKeyC);
+                               t2.addKV(iKeyC, iValueC);
+                               t2.commitTransaction();
+                       }
+               }
+               endTime = System.currentTimeMillis();
+               System.out.println("Time Taken: " + (double)   ((endTime - startTime) / 1000.0)    );
+               System.out.println("Time Taken Per Key: " + (double)  (((endTime - startTime) / 1000.0) / (4 * NUMBER_OF_TESTS))   );
+               System.out.println();
+
+
+               System.out.println("Checking c");
+               for (int i = 0; i < 4; i++) {
+                       String keyC = "c" + i;
+                       String valueC = "c" + (i + NUMBER_OF_TESTS - 1);
+                       IoTString iKeyC = new IoTString(keyC);
+                       IoTString iValueC = new IoTString(valueC);
+
+                       IoTString testValC1 = t1.getSpeculative(iKeyC);
+                       IoTString testValC2 = t2.getSpeculative(iKeyC);
+
+                       if ((testValC1 != null)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyC + "   " + testValC1);
+                               foundError = true;
+                       }
 
-               Thread thr1 = buildThreadTest4("b", t1);
-               Thread thr2 = buildThreadTest4("a", t2);
-               thr1.start();
-               thr2.start();
-               try {
-                       thr1.join();
-                       thr2.join();
-               } catch (Exception e) {
-                       e.printStackTrace();
+                       if ((testValC2 == null) || (testValC2.equals(iValueC) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyC + "   " + testValC2);
+                               foundError = true;
+                       }
                }
 
+               System.out.println("Setting a and b...");
+               for (int t = 0; t < NUMBER_OF_TESTS; t++) {
+                       for (int i = 0; i < 4; i++) {
+                               String keyA = "a" + i;
+                               String keyD = "d" + i;
+                               String valueA = "a" + (i + t);
+                               String valueD = "d" + (i + t);
+
+                               IoTString iKeyA = new IoTString(keyA);
+                               IoTString iKeyD = new IoTString(keyD);
+                               IoTString iValueA = new IoTString(valueA);
+                               IoTString iValueD = new IoTString(valueD);
+
+                               t1.startTransaction();
+                               t1.addKV(iKeyA, iValueA);
+                               t1.commitTransaction();
+
+                               t2.startTransaction();
+                               t2.addKV(iKeyD, iValueD);
+                               t2.commitTransaction();
+                       }
+               }
+
+               System.out.println("Updating Clients...");
                t1.update();
                t2.update();
-               // t1.update();
+               t1.update();
+               t2.update();
+
+               System.out.println("Checking Key-Values...");
+               for (int i = 0; i < 4; i++) {
+
+                       String keyA = "a" + i;
+                       String keyB = "b" + i;
+                       String keyC = "c" + i;
+                       String keyD = "d" + i;
+                       String valueA = "a" + (i + NUMBER_OF_TESTS - 1);
+                       String valueB = "b" + (i + NUMBER_OF_TESTS - 1);
+                       String valueC = "c" + (i + NUMBER_OF_TESTS - 1);
+                       String valueD = "d" + (i + NUMBER_OF_TESTS - 1);
+
+                       IoTString iKeyA = new IoTString(keyA);
+                       IoTString iKeyB = new IoTString(keyB);
+                       IoTString iKeyC = new IoTString(keyC);
+                       IoTString iKeyD = new IoTString(keyD);
+                       IoTString iValueA = new IoTString(valueA);
+                       IoTString iValueB = new IoTString(valueB);
+                       IoTString iValueC = new IoTString(valueC);
+                       IoTString iValueD = new IoTString(valueD);
+
+
+                       IoTString testValA1 = t1.getCommitted(iKeyA);
+                       IoTString testValB1 = t1.getCommitted(iKeyB);
+                       IoTString testValC1 = t1.getCommitted(iKeyC);
+                       IoTString testValD1 = t1.getCommitted(iKeyD);
+
+                       IoTString testValA2 = t2.getCommitted(iKeyA);
+                       IoTString testValB2 = t2.getCommitted(iKeyB);
+                       IoTString testValC2 = t2.getCommitted(iKeyC);
+                       IoTString testValD2 = t2.getCommitted(iKeyD);
+
+                       if ((testValA1 == null) || (testValA1.equals(iValueA) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyA + "    " + testValA1);
+                               foundError = true;
+                       }
+
+                       if ((testValB1 == null) || (testValB1.equals(iValueB) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyB + "    " + testValB1);
+                               foundError = true;
+                       }
+
+                       if ((testValC1 == null) || (testValC1.equals(iValueC) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyC + "    " + testValC1);
+                               foundError = true;
+                       }
+
+                       if ((testValD1 == null) || (testValD1.equals(iValueD) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyD + "    " + testValD1);
+                               foundError = true;
+                       }
+
+                       if ((testValA2 == null) || (testValA2.equals(iValueA) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyA + "    " + testValA2);
+                               foundError = true;
+                       }
+
+                       if ((testValB2 == null) || (testValB2.equals(iValueB) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyB + "    " + testValB2);
+                               foundError = true;
+                       }
+
+                       if ((testValC2 == null) || (testValC2.equals(iValueC) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyC + "    " + testValC2);
+                               foundError = true;
+                       }
+
+                       if ((testValD2 == null) || (testValD2.equals(iValueD) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyD + "    " + testValD2);
+                               foundError = true;
+                       }
+               }
+
+               if (foundError) {
+                       System.out.println("Found Errors...");
+               } else {
+                       System.out.println("No Errors Found...");
+               }
+       }
+
+       static void test6()  throws ServerException {
+               long startTime = 0;
+               long endTime = 0;
 
-               // Print the results
+               // Setup the 2 clients
+               Table t1 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 321);
+               t1.initTable();
+               Table t2 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 351);
+               t2.update();
+
+
+               // Make the Keys
+               System.out.println("Setting up keys");
+               startTime = System.currentTimeMillis();
                for (int i = 0; i < NUMBER_OF_TESTS; i++) {
                        String a = "a" + i;
                        String b = "b" + i;
+                       String c = "c" + i;
+                       String d = "d" + i;
                        IoTString ia = new IoTString(a);
                        IoTString ib = new IoTString(b);
-
-                       System.out.println(ib + " -> " + t1.getCommitted(ib));
-                       System.out.println(ia + " -> " + t2.getCommitted(ia));
-                       System.out.println();
+                       IoTString ic = new IoTString(c);
+                       IoTString id = new IoTString(d);
+                       t1.createNewKey(ia, 321);
+                       t1.createNewKey(ib, 351);
+                       t2.createNewKey(ic, 321);
+                       t2.createNewKey(id, 351);
                }
-       }
+               endTime = System.currentTimeMillis();
+
 
-       static void test3() {
-               Table t1 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 321);
-               Table t2 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 351);
-               t1.rebuild();
-               t2.rebuild();
+
+               System.out.println("Time Taken: " + (double)   ((endTime - startTime) / 1000.0)    );
+               System.out.println("Time Taken Per Key: " + (double)  (((endTime - startTime) / 1000.0) / (NUMBER_OF_TESTS * 4))   );
+               System.out.println();
 
 
+               // Do Updates for the keys
+               System.out.println("Setting Key-Values...");
+               startTime = System.currentTimeMillis();
                for (int i = 0; i < NUMBER_OF_TESTS; i++) {
-                       String key = "a" + i;
-                       String value = "a" + (i + 1000);
-                       IoTString iKey = new IoTString(key);
-                       IoTString iValue = new IoTString(value);
+                       String keyA = "a" + i;
+                       String keyB = "b" + i;
+                       String keyC = "c" + i;
+                       String keyD = "d" + i;
+                       String valueA = "a" + i;
+                       String valueB = "b" + i;
+                       String valueC = "c" + i;
+                       String valueD = "d" + i;
+
+                       IoTString iKeyA = new IoTString(keyA);
+                       IoTString iKeyB = new IoTString(keyB);
+                       IoTString iKeyC = new IoTString(keyC);
+                       IoTString iKeyD = new IoTString(keyD);
+                       IoTString iValueA = new IoTString(valueA);
+                       IoTString iValueB = new IoTString(valueB);
+                       IoTString iValueC = new IoTString(valueC);
+                       IoTString iValueD = new IoTString(valueD);
 
                        t1.startTransaction();
-                       t1.addKV(iKey, iValue);
+                       t1.getCommittedAtomic(iKeyA);
+                       t1.addKV(iKeyA, iValueA);
                        t1.commitTransaction();
-               }
 
-               for (int i = 0; i < NUMBER_OF_TESTS; i++) {
-                       String key = "b" + i;
-                       String value = "b" + (i + 1000);
-                       IoTString iKey = new IoTString(key);
-                       IoTString iValue = new IoTString(value);
+                       t1.startTransaction();
+                       t1.getCommittedAtomic(iKeyB);
+                       t1.addKV(iKeyB, iValueB);
+                       t1.commitTransaction();
 
                        t2.startTransaction();
-                       t2.addKV(iKey, iValue);
+                       t2.getCommittedAtomic(iKeyC);
+                       t2.addKV(iKeyC, iValueC);
+                       t2.commitTransaction();
+
+                       t2.startTransaction();
+                       t2.getCommittedAtomic(iKeyD);
+                       t2.addKV(iKeyD, iValueD);
                        t2.commitTransaction();
                }
+               endTime = System.currentTimeMillis();
+
+               System.out.println("Time Taken: " + (double)   ((endTime - startTime) / 1000.0)    );
+               System.out.println("Time Taken Per Update: " + (double)  (((endTime - startTime) / 1000.0) / (NUMBER_OF_TESTS * 4))   );
+               System.out.println();
+
 
-               // Make sure t1 sees the new updates from t2
+               System.out.println("Updating Clients...");
                t1.update();
+               t2.update();
+               t1.update();
+               t2.update();
+
+               boolean foundError = false;
 
-               // Print the results
+               System.out.println("Checking Key-Values...");
                for (int i = 0; i < NUMBER_OF_TESTS; i++) {
-                       String a = "a" + i;
-                       String b = "b" + i;
-                       IoTString ia = new IoTString(a);
-                       IoTString ib = new IoTString(b);
 
-                       System.out.println(ib + " -> " + t1.getCommitted(ib));
-                       System.out.println(ia + " -> " + t2.getCommitted(ia));
-                       System.out.println();
+                       String keyA = "a" + i;
+                       String keyB = "b" + i;
+                       String keyC = "c" + i;
+                       String keyD = "d" + i;
+                       String valueA = "a" + i;
+                       String valueB = "b" + i;
+                       String valueC = "c" + i;
+                       String valueD = "d" + i;
+
+                       IoTString iKeyA = new IoTString(keyA);
+                       IoTString iKeyB = new IoTString(keyB);
+                       IoTString iKeyC = new IoTString(keyC);
+                       IoTString iKeyD = new IoTString(keyD);
+                       IoTString iValueA = new IoTString(valueA);
+                       IoTString iValueB = new IoTString(valueB);
+                       IoTString iValueC = new IoTString(valueC);
+                       IoTString iValueD = new IoTString(valueD);
+
+
+                       IoTString testValA1 = t1.getCommitted(iKeyA);
+                       IoTString testValB1 = t1.getCommitted(iKeyB);
+                       IoTString testValC1 = t1.getCommitted(iKeyC);
+                       IoTString testValD1 = t1.getCommitted(iKeyD);
+
+                       IoTString testValA2 = t2.getCommitted(iKeyA);
+                       IoTString testValB2 = t2.getCommitted(iKeyB);
+                       IoTString testValC2 = t2.getCommitted(iKeyC);
+                       IoTString testValD2 = t2.getCommitted(iKeyD);
+
+                       if ((testValA1 == null) || (testValA1.equals(iValueA) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyA);
+                               foundError = true;
+                       }
+
+                       if ((testValB1 == null) || (testValB1.equals(iValueB) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyB);
+                               foundError = true;
+                       }
+
+                       if ((testValC1 == null) || (testValC1.equals(iValueC) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyC);
+                               foundError = true;
+                       }
+
+                       if ((testValD1 == null) || (testValD1.equals(iValueD) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyD);
+                               foundError = true;
+                       }
+
+
+                       if ((testValA2 == null) || (testValA2.equals(iValueA) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyA + "    " + testValA2);
+                               foundError = true;
+                       }
+
+                       if ((testValB2 == null) || (testValB2.equals(iValueB) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyB + "    " + testValB2);
+                               foundError = true;
+                       }
+
+                       if ((testValC2 == null) || (testValC2.equals(iValueC) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyC + "    " + testValC2);
+                               foundError = true;
+                       }
+
+                       if ((testValD2 == null) || (testValD2.equals(iValueD) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyD + "    " + testValD2);
+                               foundError = true;
+                       }
+               }
+
+               if (foundError) {
+                       System.out.println("Found Errors...");
+               } else {
+                       System.out.println("No Errors Found...");
                }
+
+               // System.out.println();
+               // System.out.println();
+               // System.out.println();
+               // t1.printSlots();
+               // System.out.println();
+               // System.out.println();
+               // System.out.println();
+               // t2.printSlots();
        }
 
-       static void test2() {
+       static void test5() throws ServerException {
+
+               long startTime = 0;
+               long endTime = 0;
+               boolean foundError = false;
+
+               // Setup the 2 clients
                Table t1 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 321);
                t1.initTable();
                Table t2 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 351);
@@ -147,268 +1106,733 @@ public class Test {
 
                // Make the Keys
                System.out.println("Setting up keys");
-               for (int i = 0; i < NUMBER_OF_TESTS; i++) {
+               for (int i = 0; i < 4; i++) {
                        String a = "a" + i;
                        String b = "b" + i;
+                       String c = "c" + i;
+                       String d = "d" + i;
                        IoTString ia = new IoTString(a);
                        IoTString ib = new IoTString(b);
+                       IoTString ic = new IoTString(c);
+                       IoTString id = new IoTString(d);
                        t1.createNewKey(ia, 321);
-                       t1.createNewKey(ib, 321);
+                       t1.createNewKey(ib, 351);
+                       t2.createNewKey(ic, 321);
+                       t2.createNewKey(id, 351);
                }
+               endTime = System.currentTimeMillis();
 
-               // System.out.println("=========t1 live" + t1.liveslotcount + "     thresh: " + t1.resizethreshold);
-               // System.out.println("=========t2 live" + t2.liveslotcount + "     thresh: " + t2.resizethreshold);
-               // System.out.println();
 
 
+               System.out.println("Time Taken: " + (double)   ((endTime - startTime) / 1000.0)    );
+               System.out.println("Time Taken Per Key: " + (double)  (((endTime - startTime) / 1000.0) / (4))   );
+               System.out.println();
+
 
                // Do Updates for the keys
-               System.out.println("Writing Keys a...");
-               for (int i = 0; i < NUMBER_OF_TESTS; i++) {
-                       System.out.println(i);
+               System.out.println("Setting Key-Values...");
 
-                       String key = "a" + i;
-                       String value = "a" + (i + 10000);
-                       IoTString iKey = new IoTString(key);
-                       IoTString iValue = new IoTString(value);
+               for (int t = 0; t < NUMBER_OF_TESTS; t++) {
+                       for (int i = 0; i < 4; i++) {
+                               String keyB = "b" + i;
+                               String valueB = "b" + (i + t);
 
+                               IoTString iKeyB = new IoTString(keyB);
+                               IoTString iValueB = new IoTString(valueB);
 
-                       t1.startTransaction();
-                       t1.addKV(iKey, iValue);
-                       t1.commitTransaction();
+                               t1.startTransaction();
+                               t1.addKV(iKeyB, iValueB);
+                               t1.commitTransaction();
+                       }
                }
 
-               // Do Updates for the keys
-               System.out.println("Writing Keys a...");
-               for (int i = 0; i < NUMBER_OF_TESTS; i++) {
-                       System.out.println(i);
+               for (int i = 0; i < 4; i++) {
 
-                       String key = "a" + i;
-                       String value = "a" + (i + 10000);
-                       IoTString iKey = new IoTString(key);
-                       IoTString iValue = new IoTString(value);
+                       String keyB = "b" + i;
+                       String valueB = "b" + (i + NUMBER_OF_TESTS - 1);
+                       IoTString iKeyB = new IoTString(keyB);
+                       IoTString iValueB = new IoTString(valueB);
 
-                       t1.startTransaction();
-                       t1.addKV(iKey, iValue);
-                       t1.commitTransaction();
-               }
+                       IoTString testValB1 = t1.getSpeculative(iKeyB);
+                       IoTString testValB2 = t2.getSpeculative(iKeyB);
 
+                       if ((testValB1 == null) || (testValB1.equals(iValueB) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyB);
+                               foundError = true;
+                       }
 
-               t2.update();
-               System.out.println("Writing Keys b...");
-               for (int i = 0; i < NUMBER_OF_TESTS; i++) {
-                       System.out.println(i);
+                       if ((testValB2 != null)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyB);
+                               foundError = true;
+                       }
+               }
 
-                       String key = "b" + i;
-                       String value = "b" + (i + 10000);
-                       IoTString iKey = new IoTString(key);
-                       IoTString iValue = new IoTString(value);
+               for (int t = 0; t < NUMBER_OF_TESTS; t++) {
+                       for (int i = 0; i < 4; i++) {
+                               String keyC = "c" + i;
+                               String valueC = "c" + (i + t);
 
+                               IoTString iKeyC = new IoTString(keyC);
+                               IoTString iValueC = new IoTString(valueC);
 
-                       t2.startTransaction();
-                       t2.addKV(iKey, iValue);
-                       t2.commitTransaction();
+                               t2.startTransaction();
+                               t2.addKV(iKeyC, iValueC);
+                               t2.commitTransaction();
+                       }
                }
 
+               for (int i = 0; i < 4; i++) {
+                       String keyC = "c" + i;
+                       String valueC = "c" + (i + NUMBER_OF_TESTS - 1);
+                       IoTString iKeyC = new IoTString(keyC);
+                       IoTString iValueC = new IoTString(valueC);
 
-               // Do Updates for the keys
-               System.out.println("Writing Keys a...");
-               for (int i = 0; i < NUMBER_OF_TESTS; i += 2) {
-                       System.out.println(i);
+                       IoTString testValC1 = t1.getSpeculative(iKeyC);
+                       IoTString testValC2 = t2.getSpeculative(iKeyC);
 
-                       String key = "a" + i;
-                       String value = "a" + (i + 10000);
-                       IoTString iKey = new IoTString(key);
-                       IoTString iValue = new IoTString(value);
+                       if ((testValC1 != null)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyC + "   " + testValC1);
+                               foundError = true;
+                       }
 
-                       t1.startTransaction();
-                       t1.addKV(iKey, iValue);
-                       t1.commitTransaction();
+                       if ((testValC2 == null) || (testValC2.equals(iValueC) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyC + "   " + testValC2);
+                               foundError = true;
+                       }
                }
 
+               for (int t = 0; t < NUMBER_OF_TESTS; t++) {
+                       for (int i = 0; i < 4; i++) {
+                               String keyA = "a" + i;
+                               String keyD = "d" + i;
+                               String valueA = "a" + (i + t);
+                               String valueD = "d" + (i + t);
+
+                               IoTString iKeyA = new IoTString(keyA);
+                               IoTString iKeyD = new IoTString(keyD);
+                               IoTString iValueA = new IoTString(valueA);
+                               IoTString iValueD = new IoTString(valueD);
+
+                               t1.startTransaction();
+                               t1.addKV(iKeyA, iValueA);
+                               t1.commitTransaction();
+
+                               t2.startTransaction();
+                               t2.addKV(iKeyD, iValueD);
+                               t2.commitTransaction();
+                       }
+               }
 
+               System.out.println("Updating Clients...");
+               t1.update();
+               t2.update();
                t1.update();
                t2.update();
 
-               System.out.println("Checking a keys...");
-               for (int i = 0; i < NUMBER_OF_TESTS; i++) {
 
-                       String key = "a" + i;
-                       String value = "a" + (i + 10000);
-                       IoTString iKey = new IoTString(key);
-                       IoTString iValue = new IoTString(value);
+               System.out.println("Checking Key-Values...");
+               for (int i = 0; i < 4; i++) {
+
+                       String keyA = "a" + i;
+                       String keyB = "b" + i;
+                       String keyC = "c" + i;
+                       String keyD = "d" + i;
+                       String valueA = "a" + (i + NUMBER_OF_TESTS - 1);
+                       String valueB = "b" + (i + NUMBER_OF_TESTS - 1);
+                       String valueC = "c" + (i + NUMBER_OF_TESTS - 1);
+                       String valueD = "d" + (i + NUMBER_OF_TESTS - 1);
+
+                       IoTString iKeyA = new IoTString(keyA);
+                       IoTString iKeyB = new IoTString(keyB);
+                       IoTString iKeyC = new IoTString(keyC);
+                       IoTString iKeyD = new IoTString(keyD);
+                       IoTString iValueA = new IoTString(valueA);
+                       IoTString iValueB = new IoTString(valueB);
+                       IoTString iValueC = new IoTString(valueC);
+                       IoTString iValueD = new IoTString(valueD);
+
+
+                       IoTString testValA1 = t1.getCommitted(iKeyA);
+                       IoTString testValB1 = t1.getCommitted(iKeyB);
+                       IoTString testValC1 = t1.getCommitted(iKeyC);
+                       IoTString testValD1 = t1.getCommitted(iKeyD);
+
+                       IoTString testValA2 = t2.getCommitted(iKeyA);
+                       IoTString testValB2 = t2.getCommitted(iKeyB);
+                       IoTString testValC2 = t2.getCommitted(iKeyC);
+                       IoTString testValD2 = t2.getCommitted(iKeyD);
+
+                       if ((testValA1 == null) || (testValA1.equals(iValueA) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyA + "    " + testValA1);
+                               foundError = true;
+                       }
+
+                       if ((testValB1 == null) || (testValB1.equals(iValueB) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyB + "    " + testValB1);
+                               foundError = true;
+                       }
+
+                       if ((testValC1 == null) || (testValC1.equals(iValueC) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyC + "    " + testValC1);
+                               foundError = true;
+                       }
+
+                       if ((testValD1 == null) || (testValD1.equals(iValueD) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyD + "    " + testValD1);
+                               foundError = true;
+                       }
 
-                       IoTString testVal = t1.getCommitted(iKey);
 
-                       if ((testVal == null) || (testVal.equals(iValue) == false)) {
-                               System.out.println("Key val incorrect: " + key);
+                       if ((testValA2 == null) || (testValA2.equals(iValueA) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyA + "    " + testValA2);
+                               foundError = true;
                        }
 
-                       key = "b" + i;
-                       value = "b" + (i + 10000);
-                       iKey = new IoTString(key);
-                       iValue = new IoTString(value);
+                       if ((testValB2 == null) || (testValB2.equals(iValueB) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyB + "    " + testValB2);
+                               foundError = true;
+                       }
 
-                       testVal = t1.getCommitted(iKey);
+                       if ((testValC2 == null) || (testValC2.equals(iValueC) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyC + "    " + testValC2);
+                               foundError = true;
+                       }
 
-                       if ((testVal == null) || (testVal.equals(iValue) == false)) {
-                               System.out.println("Key val incorrect: " + key);
+                       if ((testValD2 == null) || (testValD2.equals(iValueD) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyD + "    " + testValD2);
+                               foundError = true;
                        }
                }
 
-               System.out.println("Checking b keys...");
-               for (int i = 0; i < NUMBER_OF_TESTS; i++) {
+               if (foundError) {
+                       System.out.println("Found Errors...");
+               } else {
+                       System.out.println("No Errors Found...");
+               }
+       }
 
-                       String key = "a" + i;
-                       String value = "a" + (i + 10000);
-                       IoTString iKey = new IoTString(key);
-                       IoTString iValue = new IoTString(value);
+       static void test4() throws ServerException {
 
-                       IoTString testVal = t2.getCommitted(iKey);
+               long startTime = 0;
+               long endTime = 0;
 
-                       if ((testVal == null) || (testVal.equals(iValue) == false)) {
-                               System.out.println("Key val incorrect: " + key);
+               // Setup the 2 clients
+               Table t1 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 321);
+               t1.initTable();
+               Table t2 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 351);
+               t2.update();
+
+
+               // Make the Keys
+               System.out.println("Setting up keys");
+               startTime = System.currentTimeMillis();
+               for (int i = 0; i < 4; i++) {
+                       String a = "a" + i;
+                       String b = "b" + i;
+                       String c = "c" + i;
+                       String d = "d" + i;
+                       IoTString ia = new IoTString(a);
+                       IoTString ib = new IoTString(b);
+                       IoTString ic = new IoTString(c);
+                       IoTString id = new IoTString(d);
+                       t1.createNewKey(ia, 321);
+                       t1.createNewKey(ib, 351);
+                       t2.createNewKey(ic, 321);
+                       t2.createNewKey(id, 351);
+               }
+               endTime = System.currentTimeMillis();
+
+
+
+               System.out.println("Time Taken: " + (double)   ((endTime - startTime) / 1000.0)    );
+               System.out.println("Time Taken Per Key: " + (double)  (((endTime - startTime) / 1000.0) / (NUMBER_OF_TESTS * 4))   );
+               System.out.println();
+
+
+               // Do Updates for the keys
+               System.out.println("Setting Key-Values...");
+               startTime = System.currentTimeMillis();
+               for (int t = 0; t < NUMBER_OF_TESTS; t++) {
+                       for (int i = 0; i < 4; i++) {
+                               String keyA = "a" + i;
+                               String keyB = "b" + i;
+                               String keyC = "c" + i;
+                               String keyD = "d" + i;
+                               String valueA = "a" + i;
+                               String valueB = "b" + i;
+                               String valueC = "c" + i;
+                               String valueD = "d" + i;
+
+                               IoTString iKeyA = new IoTString(keyA);
+                               IoTString iKeyB = new IoTString(keyB);
+                               IoTString iKeyC = new IoTString(keyC);
+                               IoTString iKeyD = new IoTString(keyD);
+                               IoTString iValueA = new IoTString(valueA);
+                               IoTString iValueB = new IoTString(valueB);
+                               IoTString iValueC = new IoTString(valueC);
+                               IoTString iValueD = new IoTString(valueD);
+
+                               t1.startTransaction();
+                               t1.addKV(iKeyA, iValueA);
+                               t1.commitTransaction();
+
+                               t1.startTransaction();
+                               t1.addKV(iKeyB, iValueB);
+                               t1.commitTransaction();
+
+                               t2.startTransaction();
+                               t2.addKV(iKeyC, iValueC);
+                               t2.commitTransaction();
+
+                               t2.startTransaction();
+                               t2.addKV(iKeyD, iValueD);
+                               t2.commitTransaction();
+                       }
+               }
+               endTime = System.currentTimeMillis();
+
+               System.out.println("Time Taken: " + (double)   ((endTime - startTime) / 1000.0)    );
+               System.out.println("Time Taken Per Update: " + (double)  (((endTime - startTime) / 1000.0) / (NUMBER_OF_TESTS * 16))   );
+               System.out.println();
+
+
+               System.out.println("Updating Clients...");
+               t1.update();
+               t2.update();
+               t1.update();
+               t2.update();
+
+               boolean foundError = false;
+
+               System.out.println("Checking Key-Values...");
+               for (int i = 0; i < 4; i++) {
+
+                       String keyA = "a" + i;
+                       String keyB = "b" + i;
+                       String keyC = "c" + i;
+                       String keyD = "d" + i;
+                       String valueA = "a" + i;
+                       String valueB = "b" + i;
+                       String valueC = "c" + i;
+                       String valueD = "d" + i;
+
+                       IoTString iKeyA = new IoTString(keyA);
+                       IoTString iKeyB = new IoTString(keyB);
+                       IoTString iKeyC = new IoTString(keyC);
+                       IoTString iKeyD = new IoTString(keyD);
+                       IoTString iValueA = new IoTString(valueA);
+                       IoTString iValueB = new IoTString(valueB);
+                       IoTString iValueC = new IoTString(valueC);
+                       IoTString iValueD = new IoTString(valueD);
+
+
+                       IoTString testValA1 = t1.getCommitted(iKeyA);
+                       IoTString testValB1 = t1.getCommitted(iKeyB);
+                       IoTString testValC1 = t1.getCommitted(iKeyC);
+                       IoTString testValD1 = t1.getCommitted(iKeyD);
+
+                       IoTString testValA2 = t2.getCommitted(iKeyA);
+                       IoTString testValB2 = t2.getCommitted(iKeyB);
+                       IoTString testValC2 = t2.getCommitted(iKeyC);
+                       IoTString testValD2 = t2.getCommitted(iKeyD);
+
+                       if ((testValA1 == null) || (testValA1.equals(iValueA) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyA);
+                               foundError = true;
+                       }
+
+                       if ((testValB1 == null) || (testValB1.equals(iValueB) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyB);
+                               foundError = true;
+                       }
+
+                       if ((testValC1 == null) || (testValC1.equals(iValueC) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyC);
+                               foundError = true;
                        }
 
-                       key = "b" + i;
-                       value = "b" + (i + 10000);
-                       iKey = new IoTString(key);
-                       iValue = new IoTString(value);
+                       if ((testValD1 == null) || (testValD1.equals(iValueD) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyD);
+                               foundError = true;
+                       }
+
+
+                       if ((testValA2 == null) || (testValA2.equals(iValueA) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyA + "    " + testValA2);
+                               foundError = true;
+                       }
 
-                       testVal = t2.getCommitted(iKey);
+                       if ((testValB2 == null) || (testValB2.equals(iValueB) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyB + "    " + testValB2);
+                               foundError = true;
+                       }
 
-                       if ((testVal == null) || (testVal.equals(iValue) == false)) {
-                               System.out.println("Key val incorrect: " + key);
+                       if ((testValC2 == null) || (testValC2.equals(iValueC) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyC + "    " + testValC2);
+                               foundError = true;
                        }
+
+                       if ((testValD2 == null) || (testValD2.equals(iValueD) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyD + "    " + testValD2);
+                               foundError = true;
+                       }
+               }
+
+               if (foundError) {
+                       System.out.println("Found Errors...");
+               } else {
+                       System.out.println("No Errors Found...");
                }
+       }
+
+       static void test3() throws ServerException {
 
+               long startTime = 0;
+               long endTime = 0;
+               boolean foundError = false;
+
+               // Setup the 2 clients
+               Table t1 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 321);
+               t1.initTable();
+               Table t2 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 351);
+               t2.update();
+
+
+               // Make the Keys
+               System.out.println("Setting up keys");
+               startTime = System.currentTimeMillis();
+               for (int i = 0; i < NUMBER_OF_TESTS; i++) {
+                       String a = "a" + i;
+                       String b = "b" + i;
+                       String c = "c" + i;
+                       String d = "d" + i;
+                       IoTString ia = new IoTString(a);
+                       IoTString ib = new IoTString(b);
+                       IoTString ic = new IoTString(c);
+                       IoTString id = new IoTString(d);
+                       t1.createNewKey(ia, 321);
+                       t1.createNewKey(ib, 351);
+                       t2.createNewKey(ic, 321);
+                       t2.createNewKey(id, 351);
+               }
+               endTime = System.currentTimeMillis();
 
 
 
+               System.out.println("Time Taken: " + (double)   ((endTime - startTime) / 1000.0)    );
+               System.out.println("Time Taken Per Key: " + (double)  (((endTime - startTime) / 1000.0) / (NUMBER_OF_TESTS * 4))   );
                System.out.println();
+
+
+               // Do Updates for the keys
+               System.out.println("Setting Key-Values...");
+               startTime = System.currentTimeMillis();
+               for (int i = 0; i < NUMBER_OF_TESTS; i++) {
+                       String keyB = "b" + i;
+                       String valueB = "b" + i;
+
+                       IoTString iKeyB = new IoTString(keyB);
+                       IoTString iValueB = new IoTString(valueB);
+
+                       t1.startTransaction();
+                       t1.addKV(iKeyB, iValueB);
+                       t1.commitTransaction();
+               }
+
+               for (int i = 0; i < NUMBER_OF_TESTS; i++) {
+                       String keyC = "c" + i;
+                       String valueC = "c" + i;
+
+                       IoTString iKeyC = new IoTString(keyC);
+                       IoTString iValueC = new IoTString(valueC);
+
+                       t2.startTransaction();
+                       t2.addKV(iKeyC, iValueC);
+                       t2.commitTransaction();
+               }
+
+               for (int i = 0; i < NUMBER_OF_TESTS; i++) {
+                       String keyA = "a" + i;
+                       String keyD = "d" + i;
+                       String valueA = "a" + i;
+                       String valueD = "d" + i;
+
+                       IoTString iKeyA = new IoTString(keyA);
+                       IoTString iKeyD = new IoTString(keyD);
+                       IoTString iValueA = new IoTString(valueA);
+                       IoTString iValueD = new IoTString(valueD);
+
+                       t1.startTransaction();
+                       t1.addKV(iKeyA, iValueA);
+                       t1.commitTransaction();
+
+                       t2.startTransaction();
+                       t2.addKV(iKeyD, iValueD);
+                       t2.commitTransaction();
+               }
+               endTime = System.currentTimeMillis();
+
+               System.out.println("Time Taken: " + (double)   ((endTime - startTime) / 1000.0)    );
+               System.out.println("Time Taken Per Update: " + (double)  (((endTime - startTime) / 1000.0) / (NUMBER_OF_TESTS * 4))   );
                System.out.println();
-               System.out.println("Update");
-               // Make sure t1 sees the new updates from t2
+
+
+               System.out.println("Updating Clients...");
                t1.update();
                t2.update();
                t1.update();
-               System.out.println();
-               System.out.println();
-               System.out.println();
-               System.out.println();
-               System.out.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
-               System.out.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
-               System.out.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
                t2.update();
-               System.out.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
-               System.out.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
-               System.out.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
 
 
-               // System.out.println("=========t1 live" + t1.liveslotcount + "     thresh: " + t1.resizethreshold + "   commits: " + t1.commitedTable.size() + "   uncommits: " + t1.uncommittedTransactionsList.size());
-               // System.out.println("=========t2 live" + t2.liveslotcount + "     thresh: " + t2.resizethreshold + "   commits: " + t2.commitedTable.size() + "   uncommits: " + t2.uncommittedTransactionsList.size() );
-               System.out.println();
+               System.out.println("Checking Key-Values...");
+               for (int i = 0; i < NUMBER_OF_TESTS; i++) {
 
-               t1.printSlots();
-               System.out.println();
-               System.out.println();
-               System.out.println();
-               System.out.println();
-               t2.printSlots();
-               System.out.println();
+                       String keyA = "a" + i;
+                       String keyB = "b" + i;
+                       String keyC = "c" + i;
+                       String keyD = "d" + i;
+                       String valueA = "a" + i;
+                       String valueB = "b" + i;
+                       String valueC = "c" + i;
+                       String valueD = "d" + i;
+
+                       IoTString iKeyA = new IoTString(keyA);
+                       IoTString iKeyB = new IoTString(keyB);
+                       IoTString iKeyC = new IoTString(keyC);
+                       IoTString iKeyD = new IoTString(keyD);
+                       IoTString iValueA = new IoTString(valueA);
+                       IoTString iValueB = new IoTString(valueB);
+                       IoTString iValueC = new IoTString(valueC);
+                       IoTString iValueD = new IoTString(valueD);
+
+
+                       IoTString testValA1 = t1.getCommitted(iKeyA);
+                       IoTString testValB1 = t1.getCommitted(iKeyB);
+                       IoTString testValC1 = t1.getCommitted(iKeyC);
+                       IoTString testValD1 = t1.getCommitted(iKeyD);
+
+                       IoTString testValA2 = t2.getCommitted(iKeyA);
+                       IoTString testValB2 = t2.getCommitted(iKeyB);
+                       IoTString testValC2 = t2.getCommitted(iKeyC);
+                       IoTString testValD2 = t2.getCommitted(iKeyD);
+
+                       if ((testValA1 == null) || (testValA1.equals(iValueA) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyA);
+                               foundError = true;
+                       }
 
+                       if ((testValB1 == null) || (testValB1.equals(iValueB) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyB);
+                               foundError = true;
+                       }
 
+                       if ((testValC1 == null) || (testValC1.equals(iValueC) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyC);
+                               foundError = true;
+                       }
 
-               // // Do Updates for the keys
-               // System.out.println("Writing Keys a (actual)");
-               // for (int i = 0; i < NUMBER_OF_TESTS; i++) {
-               //      String key = "a" + i;
-               //      String value = "a" + i;
-               //      IoTString iKey = new IoTString(key);
-               //      IoTString iValue = new IoTString(value);
+                       if ((testValD1 == null) || (testValD1.equals(iValueD) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyD);
+                               foundError = true;
+                       }
 
-               //      t1.startTransaction();
-               //      t1.addKV(iKey, iValue);
-               //      t1.commitTransaction();
-               // }
 
-               // System.out.println("=========t1 live" + t1.liveslotcount + "     thresh: " + t1.resizethreshold + "   commits: " + t1.commitedTable.size() + "   uncommits: " + t1.uncommittedTransactionsList.size());
-               // System.out.println("=========t2 live" + t2.liveslotcount + "     thresh: " + t2.resizethreshold + "   commits: " + t2.commitedTable.size() + "   uncommits: " + t2.uncommittedTransactionsList.size());
-               // System.out.println();
+                       if ((testValA2 == null) || (testValA2.equals(iValueA) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyA + "    " + testValA2);
+                               foundError = true;
+                       }
 
+                       if ((testValB2 == null) || (testValB2.equals(iValueB) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyB + "    " + testValB2);
+                               foundError = true;
+                       }
 
+                       if ((testValC2 == null) || (testValC2.equals(iValueC) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyC + "    " + testValC2);
+                               foundError = true;
+                       }
 
-               // System.out.println("Writing Keys b (actual)");
-               // for (int i = 0; i < NUMBER_OF_TESTS; i++) {
-               //      String key = "b" + i;
-               //      String value = "b" + i;
-               //      IoTString iKey = new IoTString(key);
-               //      IoTString iValue = new IoTString(value);
+                       if ((testValD2 == null) || (testValD2.equals(iValueD) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyD + "    " + testValD2);
+                               foundError = true;
+                       }
+               }
 
-               //      t2.startTransaction();
-               //      t2.addKV(iKey, iValue);
-               //      t2.commitTransaction();
-               // }
+               if (foundError) {
+                       System.out.println("Found Errors...");
+               } else {
+                       System.out.println("No Errors Found...");
+               }
+       }
 
-               // System.out.println("=========t1 live" + t1.liveslotcount + "     thresh: " + t1.resizethreshold + "   commits: " + t1.commitedTable.size() + "   uncommits: " + t1.uncommittedTransactionsList.size() );
-               // System.out.println("=========t2 live" + t2.liveslotcount + "     thresh: " + t2.resizethreshold + "   commits: " + t2.commitedTable.size() + "   uncommits: " + t2.uncommittedTransactionsList.size() );
-               // System.out.println();
+       static void test2() throws ServerException {
 
+               long startTime = 0;
+               long endTime = 0;
 
-               // // Do Updates for the keys
-               // System.out.println("Writing Keys a (actual)");
-               // for (int i = 0; i < NUMBER_OF_TESTS; i++) {
-               //      String key = "a" + i;
-               //      String value = "a" + i;
-               //      IoTString iKey = new IoTString(key);
-               //      IoTString iValue = new IoTString(value);
+               // Setup the 2 clients
+               Table t1 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 321);
+               t1.initTable();
+               Table t2 = new Table("http://127.0.0.1/test.iotcloud/", "reallysecret", 351);
+               t2.update();
 
-               //      t1.startTransaction();
-               //      t1.addKV(iKey, iValue);
-               //      t1.commitTransaction();
-               // }
+               // Make the Keys
+               System.out.println("Setting up keys");
+               startTime = System.currentTimeMillis();
+               for (int i = 0; i < NUMBER_OF_TESTS; i++) {
+                       String a = "a" + i;
+                       String b = "b" + i;
+                       String c = "c" + i;
+                       String d = "d" + i;
+                       IoTString ia = new IoTString(a);
+                       IoTString ib = new IoTString(b);
+                       IoTString ic = new IoTString(c);
+                       IoTString id = new IoTString(d);
+                       t1.createNewKey(ia, 321);
+                       t1.createNewKey(ib, 351);
+                       t2.createNewKey(ic, 321);
+                       t2.createNewKey(id, 351);
+               }
+               endTime = System.currentTimeMillis();
 
-               // System.out.println("=========t1 live" + t1.liveslotcount + "     thresh: " + t1.resizethreshold + "   commits: " + t1.commitedTable.size() + "   uncommits: " + t1.uncommittedTransactionsList.size());
-               // System.out.println("=========t2 live" + t2.liveslotcount + "     thresh: " + t2.resizethreshold + "   commits: " + t2.commitedTable.size() + "   uncommits: " + t2.uncommittedTransactionsList.size());
-               // System.out.println();
 
 
+               System.out.println("Time Taken: " + (double)   ((endTime - startTime) / 1000.0)    );
+               System.out.println("Time Taken Per Key: " + (double)  (((endTime - startTime) / 1000.0) / (NUMBER_OF_TESTS * 4))   );
+               System.out.println();
 
-               // System.out.println("Writing Keys b (actual)");
-               // for (int i = 0; i < NUMBER_OF_TESTS; i++) {
-               //      String key = "b" + i;
-               //      String value = "b" + i;
-               //      IoTString iKey = new IoTString(key);
-               //      IoTString iValue = new IoTString(value);
 
-               //      t2.startTransaction();
-               //      t2.addKV(iKey, iValue);
-               //      t2.commitTransaction();
-               // }
+               // Do Updates for the keys
+               System.out.println("Setting Key-Values...");
+               startTime = System.currentTimeMillis();
+               for (int i = 0; i < NUMBER_OF_TESTS; i++) {
+                       String keyA = "a" + i;
+                       String keyB = "b" + i;
+                       String keyC = "c" + i;
+                       String keyD = "d" + i;
+                       String valueA = "a" + i;
+                       String valueB = "b" + i;
+                       String valueC = "c" + i;
+                       String valueD = "d" + i;
+
+                       IoTString iKeyA = new IoTString(keyA);
+                       IoTString iKeyB = new IoTString(keyB);
+                       IoTString iKeyC = new IoTString(keyC);
+                       IoTString iKeyD = new IoTString(keyD);
+                       IoTString iValueA = new IoTString(valueA);
+                       IoTString iValueB = new IoTString(valueB);
+                       IoTString iValueC = new IoTString(valueC);
+                       IoTString iValueD = new IoTString(valueD);
 
-               // System.out.println("=========t1 live" + t1.liveslotcount + "     thresh: " + t1.resizethreshold + "   commits: " + t1.commitedTable.size() + "   uncommits: " + t1.uncommittedTransactionsList.size() );
-               // System.out.println("=========t2 live" + t2.liveslotcount + "     thresh: " + t2.resizethreshold + "   commits: " + t2.commitedTable.size() + "   uncommits: " + t2.uncommittedTransactionsList.size() );
-               // System.out.println();
+                       t1.startTransaction();
+                       t1.addKV(iKeyA, iValueA);
+                       t1.commitTransaction();
 
-               // t1.printSlots();
-               // System.out.println();
-               // t2.printSlots();
+                       t1.startTransaction();
+                       t1.addKV(iKeyB, iValueB);
+                       t1.commitTransaction();
+
+                       t2.startTransaction();
+                       t2.addKV(iKeyC, iValueC);
+                       t2.commitTransaction();
 
+                       t2.startTransaction();
+                       t2.addKV(iKeyD, iValueD);
+                       t2.commitTransaction();
+               }
+               endTime = System.currentTimeMillis();
 
+               System.out.println("Time Taken: " + (double)   ((endTime - startTime) / 1000.0)    );
+               System.out.println("Time Taken Per Update: " + (double)  (((endTime - startTime) / 1000.0) / (NUMBER_OF_TESTS * 4))   );
+               System.out.println();
 
-               // Make sure t1 sees the new updates from t2
-               // t1.update();
 
-               // // Print the results
-               // for (int i = NUMBER_OF_TESTS - 10; i < NUMBER_OF_TESTS; i++) {
-               // String a = "a" + i;
-               // String b = "b" + i;
-               // IoTString ia = new IoTString(a);
-               //      IoTString ib = new IoTString(b);
+               System.out.println("Updating Clients...");
+               t1.update();
+               t2.update();
+               t1.update();
+               t2.update();
 
-               //      System.out.println(ib + " -> " + t1.getCommitted(ib));
-               //      System.out.println(ia + " -> " + t2.getCommitted(ia));
-               //      System.out.println();
-               // }
+               boolean foundError = false;
+
+               System.out.println("Checking Key-Values...");
+               for (int i = 0; i < NUMBER_OF_TESTS; i++) {
+
+                       String keyA = "a" + i;
+                       String keyB = "b" + i;
+                       String keyC = "c" + i;
+                       String keyD = "d" + i;
+                       String valueA = "a" + i;
+                       String valueB = "b" + i;
+                       String valueC = "c" + i;
+                       String valueD = "d" + i;
+
+                       IoTString iKeyA = new IoTString(keyA);
+                       IoTString iKeyB = new IoTString(keyB);
+                       IoTString iKeyC = new IoTString(keyC);
+                       IoTString iKeyD = new IoTString(keyD);
+                       IoTString iValueA = new IoTString(valueA);
+                       IoTString iValueB = new IoTString(valueB);
+                       IoTString iValueC = new IoTString(valueC);
+                       IoTString iValueD = new IoTString(valueD);
+
+
+                       IoTString testValA1 = t1.getCommitted(iKeyA);
+                       IoTString testValB1 = t1.getCommitted(iKeyB);
+                       IoTString testValC1 = t1.getCommitted(iKeyC);
+                       IoTString testValD1 = t1.getCommitted(iKeyD);
+
+                       IoTString testValA2 = t2.getCommitted(iKeyA);
+                       IoTString testValB2 = t2.getCommitted(iKeyB);
+                       IoTString testValC2 = t2.getCommitted(iKeyC);
+                       IoTString testValD2 = t2.getCommitted(iKeyD);
+
+                       if ((testValA1 == null) || (testValA1.equals(iValueA) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyA);
+                               foundError = true;
+                       }
+
+                       if ((testValB1 == null) || (testValB1.equals(iValueB) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyB);
+                               foundError = true;
+                       }
+
+                       if ((testValC1 == null) || (testValC1.equals(iValueC) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyC);
+                               foundError = true;
+                       }
+
+                       if ((testValD1 == null) || (testValD1.equals(iValueD) == false)) {
+                               System.out.println("Key-Value t1 incorrect: " + keyD);
+                               foundError = true;
+                       }
+
+
+                       if ((testValA2 == null) || (testValA2.equals(iValueA) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyA + "    " + testValA2);
+                               foundError = true;
+                       }
+
+                       if ((testValB2 == null) || (testValB2.equals(iValueB) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyB + "    " + testValB2);
+                               foundError = true;
+                       }
+
+                       if ((testValC2 == null) || (testValC2.equals(iValueC) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyC + "    " + testValC2);
+                               foundError = true;
+                       }
+
+                       if ((testValD2 == null) || (testValD2.equals(iValueD) == false)) {
+                               System.out.println("Key-Value t2 incorrect: " + keyD + "    " + testValD2);
+                               foundError = true;
+                       }
+               }
+
+               if (foundError) {
+                       System.out.println("Found Errors...");
+               } else {
+                       System.out.println("No Errors Found...");
+               }
        }
 }