Improve messaging of disk space doctor check

Summary: When `eden doctor` reports that your machine is low on free disk space, people don't know what to do next and ask for help in support groups. Make the message site-configurable so we can guide users to fixing this problem on their own.

Reviewed By: chadaustin

Differential Revision: D14583025

fbshipit-source-id: 96c6ae3da3879a7a82501c22ebc2fa8ccc4097c2
This commit is contained in:
Matt Glazar 2019-03-25 14:20:53 -07:00 committed by Facebook Github Bot
parent 003414bad9
commit c1c72692a4
2 changed files with 52 additions and 7 deletions

View File

@ -145,13 +145,23 @@ def check_disk_usage(
used = size - avail
used_percent = float(used) / size
message = (
"Eden lazily loads your files and needs enough disk space to "
"store these files when loaded."
)
extra_message = instance.get_config_value(
"doctor.low-disk-space-message", ""
)
if extra_message:
message = f"{message} {extra_message}"
if avail <= prob_error_absolute_space_used_threshold:
tracker.add_problem(
Problem(
f"{eden_mount_pt} "
f"has only {str(avail)} bytes available. "
f"Eden lazily loads your files and needs enough disk "
f"space to store these files when loaded.",
f"{message}",
severity=ProblemSeverity.ERROR,
)
)
@ -160,8 +170,7 @@ def check_disk_usage(
Problem(
f"{eden_mount_pt} "
f"is {used_percent:.2%} full. "
f"Eden lazily loads your files and needs enough disk "
f"space to store these files when loaded.",
f"{message}",
severity=ProblemSeverity.ADVICE,
)
)

View File

@ -9,7 +9,7 @@
import collections
import typing
from typing import List
from typing import List, Optional
from unittest.mock import patch
import eden.cli.doctor as doctor
@ -35,9 +35,12 @@ class DiskUsageTest(DoctorTestBase):
self.addCleanup(lambda: mock_getmountpt_and_deviceid.stop())
mock_getmountpt_and_deviceid.return_value = "/"
def _check_disk_usage(self) -> List[ProblemBase]:
def _check_disk_usage(
self, instance: Optional[FakeEdenInstance] = None
) -> List[ProblemBase]:
problem_collector = ProblemCollector()
instance = FakeEdenInstance(self.make_temporary_directory())
if instance is None:
instance = FakeEdenInstance(self.make_temporary_directory())
doctor.check_filesystems.check_disk_usage(
tracker=problem_collector,
@ -87,6 +90,39 @@ class DiskUsageTest(DoctorTestBase):
problems = self._check_disk_usage()
self.assertEqual(len(problems), 0)
def test_issue_includes_custom_message_from_config(self) -> None:
self._mock_disk_usage(blocks=100_000_000, avail=500_000)
instance = FakeEdenInstance(
self.make_temporary_directory(),
config={
"doctor.low-disk-space-message": "Ask your administrator for help."
},
)
problems = self._check_disk_usage(instance=instance)
self.assertEqual(
problems[0].description(),
"/ has only 512000000 bytes available. "
"Eden lazily loads your files and needs enough disk "
"space to store these files when loaded. Ask your administrator "
"for help.",
)
self._mock_disk_usage(blocks=100_000_000, avail=2_000_000)
instance = FakeEdenInstance(
self.make_temporary_directory(),
config={
"doctor.low-disk-space-message": "Ask your administrator for help."
},
)
problems = self._check_disk_usage(instance=instance)
self.assertEqual(
problems[0].description(),
"/ is 98.00% full. "
"Eden lazily loads your files and needs enough disk "
"space to store these files when loaded. Ask your administrator "
"for help.",
)
class ProblemCollector(ProblemTracker):
problems: List[ProblemBase]