1

我对 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,问题得到了解决。希望这个错误很快就会被解决。

4

2 回答 2

0

症状意味着在文件的特定部分读取的文件操作内存不足,或者您试图从文件中不存在的位置读取。因此,如果您没有用完内存(您应该已经注意到),那么 DETS 在处理该文件时可能存在竞争条件。

于 2013-06-11T07:05:06.987 回答
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

于 2013-07-25T10:20:18.750 回答