summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Bakken <luke@bakken.io>2021-12-18 08:20:18 -0800
committerLuke Bakken <luke@bakken.io>2021-12-20 08:41:03 -0800
commitfad573cd93d0e539c76cf9e8e4a57d0a76033013 (patch)
tree7ff861e09529a8b232af893cf5df6ec1b80673bb
parente0c4681eba7f5619674939639f540bfc34c89e1f (diff)
downloadrabbitmq-server-git-fad573cd93d0e539c76cf9e8e4a57d0a76033013.tar.gz
Be smarter about extracting the drive letter from a directory on win32
-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 648da9d442..53b8712d6a 100644
--- a/deps/rabbit/src/rabbit_disk_monitor.erl
+++ b/deps/rabbit/src/rabbit_disk_monitor.erl
@@ -232,12 +232,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.
@@ -250,13 +258,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)
@@ -276,12 +289,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;