我有一个关于健忘症的奇怪的错误。我有大约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行,一切都会正常工作。我尝试过重新构建模式和表,但没有任何帮助。这真的很奇怪,因为我的代码随后成功地使用表。只有当它在这个地方使用时,它才会失败。
会出什么问题呢?
更新
我做了更多的实验,似乎只有当其中两个事务几乎同时发生(在不同的进程中)时,才会发生错误。健忘症不就是这样用的吗?
更新2
原来,通过将我在Arch Linux上的erlang安装从R16B-6降级到R16B-3,这个问题得到了修复。希望这个bug很快就能解决。
发布于 2013-06-11 15:05:07
这些症状意味着在文件的特定部分读取的文件操作耗尽了内存,或者您试图从文件中不存在的位置读取。因此,如果您没有耗尽内存(您应该已经注意到了),则很可能是DETS在处理该文件时存在竞争条件。
发布于 2013-07-25 18:20:19
我有时也会遇到同样的错误。这是因为我在一两个月前升级了我的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
https://stackoverflow.com/questions/17031683
复制相似问题