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]>