[erlang-questions] Mnesia deleting log file

Michael Schmidt Michael.K.Schmidt@REDACTED
Wed Nov 22 22:16:05 CET 2017


I agree—setting dump_log_in_place to false makes extremely unlikely for mnesia to fail in this way.  Both JFFS2 and UBIFS ensure that rename is atomic, even when power is pulled.

For desktop applications, the culprit is likely the VM being killed, not the whole system crashing.  Thus the rename was either executed or not;  either way we have a complete DAT file.

There is always a chance of things like this happening:  http://www.linux-mtd.infradead.org/doc/ubifs.html#L_unstable_bits, but this shouldn’t happen on most hardware.

Note that the default for dump_log_time_threshold is 3 minutes.  Speed vs Safety is always a trade-off, but many people will be surprised to lose data in a crash 2 minutes after saving.


From: Jesper Louis Andersen [mailto:jesper.louis.andersen@REDACTED]
Sent: Wednesday, November 22, 2017 7:54 AM
To: Michael Schmidt <Michael.K.Schmidt@REDACTED>
Cc: Arun <arunp@REDACTED>; erlang-questions@REDACTED
Subject: Re: [erlang-questions] Mnesia deleting log file

This thread makes we wonder about the following section in the Mnesia documentation:

"If a power failure occurs during the dump, this can cause the randomly accessed DAT files to become corrupt. If the parameter is set to false, Mnesia copies the DAT files and target the dump to the new temporary files. If the dump is successful, the temporary files are renamed to their normal DAT suffixes. The possibility for unrecoverable inconsistencies in the data files becomes much smaller with this strategy. However, the actual dumping of the transaction log becomes considerably slower. The system designer must decide whether speed or safety is the higher priority."
In UNIX(Posix) a rename(2) call is atomic. The worst case, which is an OS crash might leave you with a temporary file and the target file, hardlinked as if ln() was called, but the move itself is atomic, even under OS crashes. Of course, this assumes you correctly wrote your temporary file, fsync()'ed the file and then performed the rename() as you should.
With that information in mind, what is the scenario which can make mnesia fail if the dump_log_update_in_place is set to false? There may be a window, but the operating system cannot be the provider of this window at all, unless it is incorrectly implemented or configured[1]. Hence my question.
[1] The primary concern are write caches on disks which can have a write hole unless they have proper (working!) battery backup of their cache or are able to write their memory to a small solid state part of the chip. Or if you are using ZFS where copy-on-write semantics completely eliminates the write hole.


On Wed, Nov 22, 2017 at 2:29 PM Michael Schmidt <Michael.K.Schmidt@REDACTED<mailto:Michael.K.Schmidt@REDACTED>> wrote:
Hi Arun,

If you happen to reboot when Mnesia is writing out its logfile, it can become corrupt (and lose data).  We fight this issue on embedded devices a lot.

Look “Configuration Parameters” section here:
http://erlang.org/doc/man/mnesia.html#id69584

You will want to set dump_log_update_in_place to false.  This will make it write out the table to a new file, and rename it the very end.

One other option to look at is dump_log_time_threshold to change how often items are flushed to disk.  For configuration data, you can likely set this to a few seconds.

These options can be set via the sys.config file as well

Mike

From: erlang-questions-bounces@REDACTED<mailto:erlang-questions-bounces@REDACTED> [mailto:erlang-questions-bounces@REDACTED<mailto:erlang-questions-bounces@REDACTED>] On Behalf Of Arun
Sent: Tuesday, November 21, 2017 10:16 PM
To: erlang-questions@REDACTED<mailto:erlang-questions@REDACTED>
Subject: [erlang-questions] Mnesia deleting log file


Dear all,

I've a program written in erlang which uses Mnesia application as the database application. I've a table created by name "configuration_table" which stores

certain configurations that need to be persistent. Occasionally, whenever I restart my program the following error is thrown by mnesia and I end up losing

all the persistent configurations.

I've searched about this problem in the erlang documentation and all it tells is "Node not running". What could be the probable cause for this problem

and how do I fix it?

Mnesia('test@REDACTED<mailto:ommp82_plus@REDACTED>'): Data may be missing, Corrupt logfile deleted: "/home/utl/mnesia_database/configuration_table.DCL", {node_not_running,
'test@REDACTED<mailto:ommp82_plus@REDACTED>'}

______________________________________________________________________
This email has been scanned by the Symantec Email Security.cloud service.
______________________________________________________________________
_______________________________________________
erlang-questions mailing list
erlang-questions@REDACTED<mailto:erlang-questions@REDACTED>
http://erlang.org/mailman/listinfo/erlang-questions

______________________________________________________________________
This email has been scanned by the Symantec Email Security.cloud service.
______________________________________________________________________
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20171122/1fd57055/attachment.htm>


More information about the erlang-questions mailing list