我和mnesia有一个非常奇怪的错误。我有大约10张桌子,mnesia正在录制,通常它工作正常。但是,在我的代码中的某个位置,每当我尝试从特定表中读取时(尝试从其他表读取都没问题)我得到了DETS错误。
我将代码缩减为
{atomic, ok} = mnesia:transaction(fun() ->
[Entry] = mnesia:read(table_name, Key),
ok
end)
我在事务周围有一个try
/ catch
块,我得到的错误就是这样:
error:{badmatch,
{aborted,
{{badmatch,
{error,
{bad_object_header,
"/path/to/table_name.DAT"}}},
[{callback,
'-handle/2-fun-0-',
1,
[{file,
"src/src.erl"},
{line,
234}]},
{mnesia_tm,
apply_fun,
3,
[{file,
"mnesia_tm.erl"},
{line,
830}]},
{mnesia_tm,
execute_transaction,
5,
[{file,
"mnesia_tm.erl"},
{line,
810}]},
]}}}
不幸的是,我不能用一个简短的例子重现错误。即使我从REPL调用该函数,它也不会出错。它只会在我的实际代码中发生错误。但每次都确实可靠。
如果我取出mnesia:read
行,一切正常。我试过重新构建模式和表,这没有帮助。这真的很奇怪,因为我的代码后来成功使用了表。只有在这个地方使用它才会失败。
可能出现什么问题?
我进行了更多的实验,似乎错误只发生在这些事务中的两个几乎同时发生(在不同的进程中)。是不是mnesia意味着以这种方式使用?
原来,通过将我在Arch Linux上的erlang安装从R16B-6降级到R16B-3来解决问题。希望很快就能解决这个问题。
答案 0 :(得分:0)
症状意味着要在文件的特定部分读取的文件操作耗尽内存,或者您尝试从文件中的非现有位置读取。因此,如果你没有内存不足(你应该注意到),那么DETS处理该文件可能存在竞争条件。
答案 1 :(得分:0)
我不时有同样的错误。这是因为我在一两个月前在我的Debian服务器上进行了升级。
这是我的错误:
Error in process <0.84.0> on node 'yaws@overnux' with exit value: {{case_clause,{error,{bad_object_header,"/var/www/d-lan/db/d_lan_downloads_count.dets"}}},[{d_lan_db,loop,0,[]},{string,strip,1,[]}]}
我认为这是一个Erlang回归,因为我很长一段时间没有更改代码,而且在升级之前它运行良好。
我只使用DETS,而不是Mnesia。我无法同时访问该文件。
这是我的代码,非常简单:https://github.com/Ummon/D-LAN/blob/website/modules/erl/d_lan_db.erl#L103