diff options
author | Luke Bakken <luke@bakken.io> | 2021-12-18 08:20:18 -0800 |
---|---|---|
committer | mergify-bot <noreply@mergify.com> | 2021-12-21 14:53:33 +0000 |
commit | d68ff5f0d0bae5a80581984cde975d3729f8e5e4 (patch) | |
tree | 53cd6ea2367764192dbf88cd6cc41d5d2e18980e | |
parent | 4f85b921ee21371294d7982cd87c828e0727771a (diff) | |
download | rabbitmq-server-git-d68ff5f0d0bae5a80581984cde975d3729f8e5e4.tar.gz |
Be smarter about extracting the drive letter from a directory on win32
(cherry picked from commit fad573cd93d0e539c76cf9e8e4a57d0a76033013)
(cherry picked from commit b5079a5a8b5bc0fa275ad8335458a6739ceb7dd9)
-rw-r--r-- | deps/rabbit/src/rabbit_disk_monitor.erl | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/deps/rabbit/src/rabbit_disk_monitor.erl b/deps/rabbit/src/rabbit_disk_monitor.erl index 3a11952421..059e1fb68f 100644 --- a/deps/rabbit/src/rabbit_disk_monitor.erl +++ b/deps/rabbit/src/rabbit_disk_monitor.erl @@ -231,12 +231,20 @@ get_disk_free(Dir, {unix, _}) -> Df = os:find_executable("df"), parse_free_unix(run_cmd(Df ++ " -kP " ++ Dir)); get_disk_free(Dir, {win32, _}) -> - case win32_get_disk_free_fsutil(Dir) of - {ok, Free0} -> Free0; + % Dir: + % "c:/Users/username/AppData/Roaming/RabbitMQ/db/rabbit2@username-z01-mnesia" + case win32_get_drive_letter(Dir) of error -> - case win32_get_disk_free_pwsh(Dir) of - {ok, Free1} -> Free1; - _ -> exit(could_not_determine_disk_free) + rabbit_log:warning("Mnesia directory is not in the expected format (C:): '~p'", [Dir]), + exit(could_not_determine_disk_free); + DriveLetter -> + case win32_get_disk_free_fsutil(DriveLetter) of + {ok, Free0} -> Free0; + error -> + case win32_get_disk_free_pwsh(DriveLetter) of + {ok, Free1} -> Free1; + _ -> exit(could_not_determine_disk_free) + end end end. @@ -249,13 +257,18 @@ parse_free_unix(Str) -> _ -> exit({unparseable, Str}) end. -win32_get_disk_free_fsutil(Dir) -> - % Dir: - % "c:/Users/username/AppData/Roaming/RabbitMQ/db/rabbit2@username-z01-mnesia" - Drive = string:slice(Dir, 0, 2), +win32_get_drive_letter([DriveLetter, $:, $/ | _]) when + (DriveLetter >= $a andalso DriveLetter =< $z) orelse + (DriveLetter >= $A andalso DriveLetter =< $Z) -> + DriveLetter; +win32_get_drive_letter(_) -> + error. - % Drive: c: - FsutilCmd = "fsutil.exe volume diskfree " ++ Drive, +win32_get_disk_free_fsutil(DriveLetter) when + (DriveLetter >= $a andalso DriveLetter =< $z) orelse + (DriveLetter >= $A andalso DriveLetter =< $Z) -> + % DriveLetter $c + FsutilCmd = "fsutil.exe volume diskfree " ++ [DriveLetter] ++ ":", % C:\windows\system32>fsutil volume diskfree c: % Total free bytes : 812,733,878,272 (756.9 GB) @@ -275,12 +288,11 @@ win32_get_disk_free_fsutil(Dir) -> end end. - -win32_get_disk_free_pwsh(Dir) -> - % Dir: - % "c:/Users/username/AppData/Roaming/RabbitMQ/db/rabbit2@username-z01-mnesia" - Drive = string:slice(Dir, 0, 1), - PoshCmd = "powershell.exe -NoLogo -NoProfile -NonInteractive -Command (Get-PSDrive " ++ Drive ++ ").Free", +win32_get_disk_free_pwsh(DriveLetter) when + (DriveLetter >= $a andalso DriveLetter =< $z) orelse + (DriveLetter >= $A andalso DriveLetter =< $Z) -> + % DriveLetter $c + PoshCmd = "powershell.exe -NoLogo -NoProfile -NonInteractive -Command (Get-PSDrive " ++ [DriveLetter] ++ ").Free", case run_cmd(PoshCmd) of {error, timeout} -> error; |