Xikui Wang has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/1967

Change subject: [NO ISSUE][HYR] Add disk free space to Heartbeat using df
......................................................................

[NO ISSUE][HYR] Add disk free space to Heartbeat using df

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
Considering that using FileUtils.sizeOfDirectory() is too expensive,
here we use the 'df' command and extract the free space in each io
device handler.

Change-Id: Ia52f1b0867227446b0c5bee95ea4abdfb451064a
---
M 
hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IIOManager.java
M 
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/NodeControllerState.java
M 
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/heartbeat/HeartbeatData.java
M 
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NodeControllerService.java
M 
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java
5 files changed, 61 insertions(+), 3 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/67/1967/1

diff --git 
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IIOManager.java
 
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IIOManager.java
index b0cc07a..2be7995 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IIOManager.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IIOManager.java
@@ -59,6 +59,8 @@
 
     public long getSize(IFileHandle fileHandle);
 
+    public long getDiskFreeSpace();
+
     public void deleteWorkspaceFiles() throws HyracksDataException;
 
     /**
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/NodeControllerState.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/NodeControllerState.java
index 8400a59..bf6a7f6 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/NodeControllerState.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/NodeControllerState.java
@@ -139,6 +139,8 @@
 
     private final long[] diskWrites;
 
+    private final long[] freeSpace;
+
     private int rrdPtr;
 
     private int lastHeartbeatDuration;
@@ -204,6 +206,7 @@
 
         diskReads = new long[RRD_SIZE];
         diskWrites = new long[RRD_SIZE];
+        freeSpace = new long[RRD_SIZE];
 
         rrdPtr = 0;
         capacity = reg.getCapacity();
@@ -243,6 +246,7 @@
             ipcMessageBytesReceived[rrdPtr] = hbData.ipcMessageBytesReceived;
             diskReads[rrdPtr] = hbData.diskReads;
             diskWrites[rrdPtr] = hbData.diskWrites;
+            freeSpace[rrdPtr] = hbData.freeSpace;
             rrdPtr = (rrdPtr + 1) % RRD_SIZE;
         }
     }
@@ -279,13 +283,17 @@
         return capacity;
     }
 
+    private int currentRRDIdx() {
+        return (rrdPtr + RRD_SIZE - 1) % RRD_SIZE;
+    }
+
     public synchronized ObjectNode toSummaryJSON()  {
         ObjectMapper om = new ObjectMapper();
         ObjectNode o = om.createObjectNode();
         o.put("node-id", ncConfig.getNodeId());
-        o.put("heap-used", heapUsedSize[(rrdPtr + RRD_SIZE - 1) % RRD_SIZE]);
-        o.put("system-load-average", systemLoadAverage[(rrdPtr + RRD_SIZE - 1) 
% RRD_SIZE]);
-
+        o.put("heap-used", heapUsedSize[currentRRDIdx()]);
+        o.put("system-load-average", systemLoadAverage[currentRRDIdx()]);
+        o.put("free-disk-space", freeSpace[currentRRDIdx()]);
         return o;
     }
 
@@ -344,6 +352,7 @@
             o.putPOJO("ipc-message-bytes-received", ipcMessageBytesReceived);
             o.putPOJO("disk-reads", diskReads);
             o.putPOJO("disk-writes", diskWrites);
+            o.putPOJO("free-disk-space", freeSpace);
         }
 
         return o;
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/heartbeat/HeartbeatData.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/heartbeat/HeartbeatData.java
index 1dbb5b6..c4214fc 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/heartbeat/HeartbeatData.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/heartbeat/HeartbeatData.java
@@ -53,6 +53,7 @@
     public long diskReads;
     public long diskWrites;
     public int numCores;
+    public long freeSpace;
 
     public void readFields(DataInput dis) throws IOException {
         heapInitSize = dis.readLong();
@@ -82,6 +83,7 @@
         diskReads = dis.readLong();
         diskWrites = dis.readLong();
         numCores = dis.readInt();
+        freeSpace = dis.readLong();
 
         int gcCounts = dis.readInt();
         gcCollectionCounts = new long[gcCounts];
@@ -123,6 +125,7 @@
         dos.writeLong(diskReads);
         dos.writeLong(diskWrites);
         dos.writeInt(numCores);
+        dos.writeLong(freeSpace);
 
         dos.writeInt(gcCollectionCounts.length);
         for (int i = 0; i < gcCollectionCounts.length; i++) {
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NodeControllerService.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NodeControllerService.java
index 5601f9c..96d8943 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NodeControllerService.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NodeControllerService.java
@@ -528,6 +528,7 @@
             hbData.diskReads = ioCounter.getReads();
             hbData.diskWrites = ioCounter.getWrites();
             hbData.numCores = Runtime.getRuntime().availableProcessors() - 1; 
// Reserves one core for heartbeats.
+            hbData.freeSpace = ioManager.getDiskFreeSpace();
 
             try {
                 cc.nodeHeartbeat(id, hbData);
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java
index 3da30ab..e0e440f 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java
@@ -18,9 +18,11 @@
  */
 package org.apache.hyracks.control.nc.io;
 
+import java.io.BufferedReader;
 import java.io.File;
 import java.io.FilenameFilter;
 import java.io.IOException;
+import java.io.InputStreamReader;
 import java.nio.ByteBuffer;
 import java.nio.channels.ClosedByInterruptException;
 import java.nio.channels.FileChannel;
@@ -28,9 +30,12 @@
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.Executor;
 
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.FileReference;
@@ -340,6 +345,44 @@
     }
 
     @Override
+    public long getDiskFreeSpace() {
+        long freeSpace = 0;
+        Set<String> diskSet = new HashSet<>();
+        try {
+            for (IODeviceHandle deviceHandle : ioDevices) {
+                Pair<String, Long> deviceFreeSpace = 
getDeviceFreeSpace(deviceHandle.getMount().getAbsolutePath());
+                if (!diskSet.contains(deviceFreeSpace.getLeft())) {
+                    freeSpace += deviceFreeSpace.getRight();
+                    diskSet.add(deviceFreeSpace.getLeft());
+                }
+            }
+        } catch (IOException e) {
+            freeSpace = -1;
+        }
+        return freeSpace;
+    }
+
+    private Pair<String, Long> getDeviceFreeSpace(String path) throws 
IOException {
+        BufferedReader resultReader = exec("df "+path);
+        String line;
+        String[] cols = null;
+        int lineCounter = 0;
+        while ((line = resultReader.readLine())!= null) {
+            if (lineCounter == 1) {
+                cols = line.split(" +");
+                break;
+            }
+            lineCounter++;
+        }
+        return cols == null ? Pair.of("", 0l) : Pair.of(cols[0], 
Long.valueOf(cols[3]));
+    }
+
+    private BufferedReader exec(String command) throws IOException {
+        Process p = Runtime.getRuntime().exec(command);
+        return new BufferedReader(new InputStreamReader(p.getInputStream()));
+    }
+
+    @Override
     public void deleteWorkspaceFiles() throws HyracksDataException {
         for (IODeviceHandle ioDevice : workspaces) {
             File workspaceFolder = new File(ioDevice.getMount(), 
ioDevice.getWorkspace());

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/1967
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia52f1b0867227446b0c5bee95ea4abdfb451064a
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Xikui Wang <[email protected]>

Reply via email to