【问题标题】:Random bad_object_header mnesia/dets error随机 bad_object_header mnesia/dets 错误
【发布时间】:2013-06-06 13:39:51
【问题描述】:

我在使用 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 来解决的。希望这个错误很快就会被解决。

【问题讨论】:

    标签: erlang mnesia dets


    【解决方案1】:

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

    【讨论】:

      【解决方案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

      【讨论】:

      • 我在考虑尝试完全卸载并重新安装 erlang 包。你已经试过了吗?
      • 不,我没有。但我做了一个完整的文件检查,以确保它不是损坏的文件,它没有帮助。顺便说一句,我正在使用来自 Debian Sid 的 Erlang 1:16.b.1-dfsg-4。
      • 我们有同样的错误,有一个dets。它绝对是 erlang R16B01 上的 erlang 回归,用 R15B03 和 R16B03 测试,没有问题。
      猜你喜欢
      • 2013-06-20
      • 2011-09-05
      • 2015-12-20
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 2018-06-14
      • 2016-05-23
      相关资源
      最近更新 更多