From 7a2da8a21c947503591b19c9ec2a262b7b2fb581 Mon Sep 17 00:00:00 2001 From: Mikael Pettersson Date: Sun, 31 May 2015 11:38:41 +0200 Subject: mnesia: don't delete log file on emfile error If the VM runs into the process' file descriptor limit when mnesia tries to open (not create) a disk_log file, the open fails with an emfile error. Mnesia misinterprets this as a corrupt file, deletes it, tries to create a new empty disk_log file, which also fails. The end result is a corrupt database on disk. Check for emfile errors and error out immediately without deleting the file in those cases. --- lib/mnesia/src/mnesia_log.erl | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib') diff --git a/lib/mnesia/src/mnesia_log.erl b/lib/mnesia/src/mnesia_log.erl index d2fd04a60b..eda6be4e25 100644 --- a/lib/mnesia/src/mnesia_log.erl +++ b/lib/mnesia/src/mnesia_log.erl @@ -349,6 +349,8 @@ open_log(Name, Header, Fname, Exists, Repair, Mode) -> mnesia_lib:important("Data may be missing, log ~p repaired: Lost ~p bytes~n", [Fname, BadBytes]), Log; + {error, Reason = {file_error, _Fname, emfile}} -> + fatal("Cannot open log file ~p: ~p~n", [Fname, Reason]); {error, Reason} when Repair == true -> file:delete(Fname), mnesia_lib:important("Data may be missing, Corrupt logfile deleted: ~p, ~p ~n", -- cgit v1.2.3