随机bad_object_header mnesia / dets错误

时间:2013-06-10 19:51:36

标签: erlang mnesia dets

我和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

原来,通过将我在Arch Linux上的erlang安装从R16B-6降级到R16B-3来解决问题。希望很快就能解决这个问题。

2 个答案:

答案 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