summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Bakken <luke@bakken.io>2021-12-18 08:20:18 -0800
committermergify-bot <noreply@mergify.com>2021-12-21 14:53:33 +0000
commitd68ff5f0d0bae5a80581984cde975d3729f8e5e4 (patch)
tree53cd6ea2367764192dbf88cd6cc41d5d2e18980e
parent4f85b921ee21371294d7982cd87c828e0727771a (diff)
downloadrabbitmq-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.erl46
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;