add IO counters in the client library
diff --git a/hyracks/hyracks-client/src/main/java/edu/uci/ics/hyracks/client/stats/Counters.java b/hyracks/hyracks-client/src/main/java/edu/uci/ics/hyracks/client/stats/Counters.java
index 8560ddd..7a75b2a 100644
--- a/hyracks/hyracks-client/src/main/java/edu/uci/ics/hyracks/client/stats/Counters.java
+++ b/hyracks/hyracks-client/src/main/java/edu/uci/ics/hyracks/client/stats/Counters.java
@@ -23,4 +23,8 @@
     public static final String NETWORK_IO_READ = "net-payload-bytes-read";
 
     public static final String NETWORK_IO_WRITE = "net-payload-bytes-written";
+
+    public static final String DISK_READ = "disk-reads";
+
+    public static final String DISK_WRITE = "disk-writes";
 }
diff --git a/hyracks/hyracks-client/src/main/java/edu/uci/ics/hyracks/client/stats/impl/ClientCounterContext.java b/hyracks/hyracks-client/src/main/java/edu/uci/ics/hyracks/client/stats/impl/ClientCounterContext.java
index 532cd1e..cd785a0 100644
--- a/hyracks/hyracks-client/src/main/java/edu/uci/ics/hyracks/client/stats/impl/ClientCounterContext.java
+++ b/hyracks/hyracks-client/src/main/java/edu/uci/ics/hyracks/client/stats/impl/ClientCounterContext.java
@@ -39,7 +39,7 @@
  */
 public class ClientCounterContext implements ICounterContext {
     private static String[] RESET_COUNTERS = { Counters.NETWORK_IO_READ, Counters.NETWORK_IO_WRITE,
-            Counters.MEMORY_USAGE };
+            Counters.MEMORY_USAGE, Counters.DISK_READ, Counters.DISK_WRITE };
     private static String[] AGG_COUNTERS = { Counters.SYSTEM_LOAD };
     private static int UPDATE_INTERVAL = 10000;
 
diff --git a/hyracks/hyracks-client/src/test/java/edu/uci/ics/hyracks/client/stats/ClientCounterContextTest.java b/hyracks/hyracks-client/src/test/java/edu/uci/ics/hyracks/client/stats/ClientCounterContextTest.java
index 5fe77f2..8394daf 100644
--- a/hyracks/hyracks-client/src/test/java/edu/uci/ics/hyracks/client/stats/ClientCounterContextTest.java
+++ b/hyracks/hyracks-client/src/test/java/edu/uci/ics/hyracks/client/stats/ClientCounterContextTest.java
@@ -34,7 +34,7 @@
             wait(20000);
         }
         String[] counters = { Counters.MEMORY_USAGE, Counters.NETWORK_IO_READ, Counters.NETWORK_IO_WRITE,
-                Counters.SYSTEM_LOAD };
+                Counters.SYSTEM_LOAD, Counters.DISK_READ, Counters.DISK_WRITE };
         for (String counterName : counters) {
             ICounter counter = ccContext.getCounter(counterName, false);
             System.out.println(counter.get());
diff --git a/hyracks/hyracks-control/hyracks-control-nc/src/main/java/edu/uci/ics/hyracks/control/nc/io/profiling/IOCounterLinux.java b/hyracks/hyracks-control/hyracks-control-nc/src/main/java/edu/uci/ics/hyracks/control/nc/io/profiling/IOCounterLinux.java
index 5713ef1..6c0caf0 100644
--- a/hyracks/hyracks-control/hyracks-control-nc/src/main/java/edu/uci/ics/hyracks/control/nc/io/profiling/IOCounterLinux.java
+++ b/hyracks/hyracks-control/hyracks-control-nc/src/main/java/edu/uci/ics/hyracks/control/nc/io/profiling/IOCounterLinux.java
@@ -22,6 +22,8 @@
 
 public class IOCounterLinux implements IIOCounter {
     public static final String COMMAND = "iostat";
+    public static final String COMMAND2 = "cat /proc/self/io";
+    public static final int PAGE_SIZE = 4096;
 
     @Override
     public long getReads() {
@@ -29,17 +31,28 @@
             long reads = extractColumn(4);
             return reads;
         } catch (Exception e) {
-            return 0;
+            try {
+                long reads = extractRow(4);
+                return reads / PAGE_SIZE;
+            } catch (Exception e2) {
+                return 0;
+            }
         }
     }
 
     @Override
     public long getWrites() {
         try {
-            long reads = extractColumn(5);
-            return reads;
+            long writes = extractColumn(5);
+            return writes;
         } catch (Exception e) {
-            return 0;
+            try {
+                long writes = extractRow(5);
+                long cancelledWrites = extractRow(6);
+                return (writes - cancelledWrites) / PAGE_SIZE;
+            } catch (Exception e2) {
+                return 0;
+            }
         }
     }
 
@@ -47,7 +60,7 @@
         BufferedReader reader = exec(COMMAND);
         String line = null;
         boolean device = false;
-        long reads = 0;
+        long ios = 0;
         while ((line = reader.readLine()) != null) {
             if (line.contains("Blk_read")) {
                 device = true;
@@ -58,14 +71,38 @@
                 while (tokenizer.hasMoreTokens()) {
                     String column = tokenizer.nextToken();
                     if (i == columnIndex) {
-                        reads += Long.parseLong(column);
+                        ios += Long.parseLong(column);
                     }
                     i++;
                 }
             }
         }
         reader.close();
-        return reads;
+        return ios;
+    }
+
+    private long extractRow(int rowIndex) throws IOException {
+        BufferedReader reader = exec(COMMAND2);
+        String line = null;
+        long ios = 0;
+        int i = 0;
+        while ((line = reader.readLine()) != null) {
+            if (i == rowIndex) {
+                StringTokenizer tokenizer = new StringTokenizer(line);
+                int j = 0;
+                while (tokenizer.hasMoreTokens()) {
+                    String column = tokenizer.nextToken();
+                    if (j == 1) {
+                        ios = Long.parseLong(column);
+                        break;
+                    }
+                    j++;
+                }
+            }
+            i++;
+        }
+        reader.close();
+        return ios;
     }
 
     private BufferedReader exec(String command) throws IOException {