首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随机bad_object_header内存/dets错误

随机bad_object_header内存/dets错误
EN

Stack Overflow用户
提问于 2013-06-11 03:51:36
回答 2查看 630关注 0票数 1

我有一个关于健忘症的奇怪的错误。我有大约10个mnesia正在记录的表,通常它工作得很好。然而,在我的代码中的某个地方,每当我试图从一个特定表中读取(尝试从其他表中读取就可以了)时,我就会得到一个DETS错误。

我将我的代码简化为

代码语言:javascript
复制
{atomic, ok} = mnesia:transaction(fun() ->
                                          [Entry] = mnesia:read(table_name, Key),
                                          ok
                                  end)

我在事务周围有一个try/catch块,我得到的错误是:

代码语言:javascript
复制
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很快就能解决。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-11 15:05:07

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

票数 0
EN

Stack Overflow用户

发布于 2013-07-25 18:20:19

我有时也会遇到同样的错误。这是因为我在一两个月前升级了我的Debian服务器。

下面是我的错误:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17031683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档