Roman Mohr has uploaded a new change for review. Change subject: sampling: Handle numa nodes with zero memory assigned ......................................................................
sampling: Handle numa nodes with zero memory assigned Fix zero division when a numa node has zero memory assigned and report a memory usage of 100% instead. One case where this can happen is when the server is not set up correcly. Bug-Url: https://bugzilla.redhat.com/1247058 Change-Id: I6be69e715e9b4a0cc8ded744b0bcc192a466c6c8 Signed-off-by: Roman Mohr <[email protected]> Reviewed-on: https://gerrit.ovirt.org/44121 Continuous-Integration: Jenkins CI Reviewed-by: Francesco Romani <[email protected]> (cherry picked from commit bd5c78f548cb52f1b7ff2ddeababe9ef95e055ef) --- M tests/samplingTests.py M vdsm/virt/sampling.py 2 files changed, 52 insertions(+), 2 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/50/44550/1 diff --git a/tests/samplingTests.py b/tests/samplingTests.py index 433cb43..5216b7d 100644 --- a/tests/samplingTests.py +++ b/tests/samplingTests.py @@ -349,6 +349,52 @@ expected) +class NumaNodeMemorySampleTests(TestCaseBase): + + def _monkeyPatchedMemorySample(self, freeMemory, totalMemory): + node_id, cpu_id = 0, 0 + + def fakeMemoryStats(): + return { + 'free': freeMemory, + 'total': totalMemory + } + + def fakeNumaTopology(): + return { + node_id: { + 'cpus': [cpu_id] + } + } + + return MonkeyPatchScope([(caps, 'getNumaTopology', + fakeNumaTopology), + (caps, 'getUMAHostMemoryStats', + fakeMemoryStats)]) + + def testMemoryStatsWithZeroMemoryAsString(self): + expected = {0: {'memPercent': 100, 'memFree': '0'}} + + with self._monkeyPatchedMemorySample(freeMemory='0', totalMemory='0'): + memorySample = sampling.NumaNodeMemorySample() + self.assertEqual(memorySample.nodesMemSample, expected) + + def testMemoryStatsWithZeroMemoryAsInt(self): + expected = {0: {'memPercent': 100, 'memFree': '0'}} + + with self._monkeyPatchedMemorySample(freeMemory='0', totalMemory=0): + memorySample = sampling.NumaNodeMemorySample() + self.assertEqual(memorySample.nodesMemSample, expected) + + def testMemoryStats(self): + expected = {0: {'memPercent': 40, 'memFree': '600'}} + + with self._monkeyPatchedMemorySample(freeMemory='600', + totalMemory='1000'): + memorySample = sampling.NumaNodeMemorySample() + self.assertEqual(memorySample.nodesMemSample, expected) + + class StatsCacheTests(TestCaseBase): FAKE_CLOCK_STEP = 1 diff --git a/vdsm/virt/sampling.py b/vdsm/virt/sampling.py index f17a5b3..8619a80 100644 --- a/vdsm/virt/sampling.py +++ b/vdsm/virt/sampling.py @@ -179,8 +179,12 @@ else: memInfo = caps.getMemoryStatsByNumaCell(int(nodeIndex)) nodeMemSample['memFree'] = memInfo['free'] - nodeMemSample['memPercent'] = 100 - \ - int(100.0 * int(memInfo['free']) / int(memInfo['total'])) + # in case the numa node has zero memory assigned, report the whole + # memory as used + nodeMemSample['memPercent'] = 100 + if int(memInfo['total']) != 0: + nodeMemSample['memPercent'] = 100 - \ + int(100.0 * int(memInfo['free']) / int(memInfo['total'])) self.nodesMemSample[nodeIndex] = nodeMemSample -- To view, visit https://gerrit.ovirt.org/44550 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I6be69e715e9b4a0cc8ded744b0bcc192a466c6c8 Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: ovirt-3.6 Gerrit-Owner: Roman Mohr <[email protected]> _______________________________________________ vdsm-patches mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches
