随机bad_object_header的Mnesia / dets的错误(Random bad_ob

2019-10-18 05:40发布

我有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的这种方式来使用吗?

更新2

原来,问题得到了解决由R16B-6降级我的Arch Linux的二郎安装R16B-3。 希望这个bug会很快冰释前嫌。

Answer 1:

这些症状意味着要么该文件操作,在文件的特定部分读取内存用完或者您正在从文件中的一个不存在的位置读取。 所以,如果你不运行的内存(你应该已经注意到了),很可能存在通过DETS该文件的处理中的竞争条件。



Answer 2:

我已经得到了同样的错误,不时。 因为我一两个月前做了一个升级我的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



文章来源: Random bad_object_header mnesia/dets error