YARN-8444: NodeResourceMonitor crashes on bad swapFree value. Contributed by Jim Brennan.
(cherry picked from commit 6432128622
)
This commit is contained in:
parent
6b5b58a495
commit
1974dfa44d
|
@ -216,6 +216,21 @@ public class SysInfoLinux extends SysInfo {
|
||||||
readProcMemInfoFile(false);
|
readProcMemInfoFile(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Wrapper for Long.parseLong() that returns zero if the value is
|
||||||
|
* invalid. Under some circumstances, swapFree in /proc/meminfo can
|
||||||
|
* go negative, reported as a very large decimal value.
|
||||||
|
*/
|
||||||
|
private long safeParseLong(String strVal) {
|
||||||
|
long parsedVal;
|
||||||
|
try {
|
||||||
|
parsedVal = Long.parseLong(strVal);
|
||||||
|
} catch (NumberFormatException nfe) {
|
||||||
|
parsedVal = 0;
|
||||||
|
}
|
||||||
|
return parsedVal;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Read /proc/meminfo, parse and compute memory information.
|
* Read /proc/meminfo, parse and compute memory information.
|
||||||
* @param readAgain if false, read only on the first time
|
* @param readAgain if false, read only on the first time
|
||||||
|
@ -252,9 +267,9 @@ public class SysInfoLinux extends SysInfo {
|
||||||
} else if (mat.group(1).equals(SWAPTOTAL_STRING)) {
|
} else if (mat.group(1).equals(SWAPTOTAL_STRING)) {
|
||||||
swapSize = Long.parseLong(mat.group(2));
|
swapSize = Long.parseLong(mat.group(2));
|
||||||
} else if (mat.group(1).equals(MEMFREE_STRING)) {
|
} else if (mat.group(1).equals(MEMFREE_STRING)) {
|
||||||
ramSizeFree = Long.parseLong(mat.group(2));
|
ramSizeFree = safeParseLong(mat.group(2));
|
||||||
} else if (mat.group(1).equals(SWAPFREE_STRING)) {
|
} else if (mat.group(1).equals(SWAPFREE_STRING)) {
|
||||||
swapSizeFree = Long.parseLong(mat.group(2));
|
swapSizeFree = safeParseLong(mat.group(2));
|
||||||
} else if (mat.group(1).equals(INACTIVE_STRING)) {
|
} else if (mat.group(1).equals(INACTIVE_STRING)) {
|
||||||
inactiveSize = Long.parseLong(mat.group(2));
|
inactiveSize = Long.parseLong(mat.group(2));
|
||||||
} else if (mat.group(1).equals(INACTIVEFILE_STRING)) {
|
} else if (mat.group(1).equals(INACTIVEFILE_STRING)) {
|
||||||
|
|
|
@ -161,6 +161,36 @@ public class TestSysInfoLinux {
|
||||||
"DirectMap2M: 2027520 kB\n" +
|
"DirectMap2M: 2027520 kB\n" +
|
||||||
"DirectMap1G: 132120576 kB\n";
|
"DirectMap1G: 132120576 kB\n";
|
||||||
|
|
||||||
|
static final String MEMINFO_FORMAT3 =
|
||||||
|
"MemTotal: %d kB\n" +
|
||||||
|
"MemFree: %s kB\n" +
|
||||||
|
"Buffers: 138244 kB\n" +
|
||||||
|
"Cached: 947780 kB\n" +
|
||||||
|
"SwapCached: 142880 kB\n" +
|
||||||
|
"Active: 3229888 kB\n" +
|
||||||
|
"Inactive: %d kB\n" +
|
||||||
|
"SwapTotal: %d kB\n" +
|
||||||
|
"SwapFree: %s kB\n" +
|
||||||
|
"Dirty: 122012 kB\n" +
|
||||||
|
"Writeback: 0 kB\n" +
|
||||||
|
"AnonPages: 2710792 kB\n" +
|
||||||
|
"Mapped: 24740 kB\n" +
|
||||||
|
"Slab: 132528 kB\n" +
|
||||||
|
"SReclaimable: 105096 kB\n" +
|
||||||
|
"SUnreclaim: 27432 kB\n" +
|
||||||
|
"PageTables: 11448 kB\n" +
|
||||||
|
"NFS_Unstable: 0 kB\n" +
|
||||||
|
"Bounce: 0 kB\n" +
|
||||||
|
"CommitLimit: 4125904 kB\n" +
|
||||||
|
"Committed_AS: 4143556 kB\n" +
|
||||||
|
"VmallocTotal: 34359738367 kB\n" +
|
||||||
|
"VmallocUsed: 1632 kB\n" +
|
||||||
|
"VmallocChunk: 34359736375 kB\n" +
|
||||||
|
"HugePages_Total: %d\n" +
|
||||||
|
"HugePages_Free: 0\n" +
|
||||||
|
"HugePages_Rsvd: 0\n" +
|
||||||
|
"Hugepagesize: 2048 kB";
|
||||||
|
|
||||||
static final String CPUINFO_FORMAT =
|
static final String CPUINFO_FORMAT =
|
||||||
"processor : %s\n" +
|
"processor : %s\n" +
|
||||||
"vendor_id : AuthenticAMD\n" +
|
"vendor_id : AuthenticAMD\n" +
|
||||||
|
@ -384,6 +414,36 @@ public class TestSysInfoLinux {
|
||||||
(nrHugePages * 2048) + swapTotal));
|
(nrHugePages * 2048) + swapTotal));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test parsing /proc/meminfo
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void parsingProcMemFileWithBadValues() throws IOException {
|
||||||
|
long memTotal = 4058864L;
|
||||||
|
long memFree = 0L; // bad value should return 0
|
||||||
|
long inactive = 567732L;
|
||||||
|
long swapTotal = 2096472L;
|
||||||
|
long swapFree = 0L; // bad value should return 0
|
||||||
|
int nrHugePages = 10;
|
||||||
|
String badFreeValue = "18446744073709551596";
|
||||||
|
File tempFile = new File(FAKE_MEMFILE);
|
||||||
|
tempFile.deleteOnExit();
|
||||||
|
FileWriter fWriter = new FileWriter(FAKE_MEMFILE);
|
||||||
|
fWriter.write(String.format(MEMINFO_FORMAT3,
|
||||||
|
memTotal, badFreeValue, inactive, swapTotal, badFreeValue, nrHugePages));
|
||||||
|
|
||||||
|
fWriter.close();
|
||||||
|
assertEquals(plugin.getAvailablePhysicalMemorySize(),
|
||||||
|
1024L * (memFree + inactive));
|
||||||
|
assertEquals(plugin.getAvailableVirtualMemorySize(),
|
||||||
|
1024L * (memFree + inactive + swapFree));
|
||||||
|
assertEquals(plugin.getPhysicalMemorySize(),
|
||||||
|
1024L * (memTotal - (nrHugePages * 2048)));
|
||||||
|
assertEquals(plugin.getVirtualMemorySize(),
|
||||||
|
1024L * (memTotal - (nrHugePages * 2048) + swapTotal));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCoreCounts() throws IOException {
|
public void testCoreCounts() throws IOException {
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue