首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mnesia bad_object_header误差

Mnesia bad_object_header误差
EN

Stack Overflow用户
提问于 2013-06-24 02:44:11
回答 1查看 555关注 0票数 0

我得到了一个不寻常的错误与一些简单的mnesia代码。这个问题是我的this other question的后续问题,但是现在我有了代码来重现这个问题。

我用的是二郎:

Erlang R16B01 (erts-5.10.2)源smp:4:4 hipe

在Arch Linux上。

如果我有这个密码:

代码语言:javascript
复制
-module(test).

-export([test/0, tryread/0]).

-record(rec, { a, b }).

test() ->
    install(),

    {atomic, ok} = mnesia:transaction(fun() -> mnesia:write({rec, y, y}) end),
    {atomic, ok} = mnesia:transaction(fun() -> mnesia:write({rec, z, z}) end).

tryread() ->
    mnesia:transaction(fun() ->
                               mnesia:read(rec, y)
                       end).

install() ->
    mnesia:create_schema([node()]),

    ok = mnesia:start(),

    {atomic, ok} = mnesia:create_table(rec, [
                                             {attributes,       record_info(fields, rec)},
                                             {disc_only_copies, [node()]},
                                             {type,             set}
                                            ]).

在一个名为test.erl的文件中,我启动erl并输入以下内容:

代码语言:javascript
复制
1> c(test).
{ok,test}
2> test:test().
{atomic,ok}
3> test:tryread().
{atomic,{error,{bad_object_header,"/.../Mnesia.nonode@nohost/rec.DAT"}}}

另外,如果我退出erl并重新启动它并执行mnesia:start(),则会收到以下警告:

dets: file“/./mnesia.nonode@nohost/rec.DAT”未正确关闭,修复.

这对我来说是非常可靠的行为。我可以删除整个数据库,重新运行测试,并获得完全相同的结果。

有一件事是,如果在两个事务之后将对tryread的调用放在test函数中,它就能正常工作。导致错误的是从REPL调用tryread

如果我把我的erlang安装包从R16B01-1降级到R16B-3,我就不会得到这个错误。任何比该版本更新的版本都会产生此错误。

还有其他人能复制这个错误吗?是什么引起的?

EN

回答 1

Stack Overflow用户

发布于 2013-06-24 13:47:53

我不能在我的机器上的R16B01上复制这个。

有些事情需要注意:

  • 您必须调用mnesia :关闭mnesia时要正确停止()。如果您硬退出shell,磁盘上的DETS表将需要修复,这可能就是您正在经历的情况。
  • 您希望通过disc_only_copies复制DETS有什么特殊的原因吗?事件disc_copies要快得多,因为它们将数据集保存在内存中以及磁盘上的磁盘日志中。对于纯粹基于磁盘的存储,在我的经验中,还有其他选择通常比mnesia更好。
  • 我的猜测是,由于某种原因,你最终得到了一个错误的配置方案。猜测可能是有权限的东西。rec.DAT可能被破坏了,但我不知道是什么使它向那个方向倾斜。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17267345

复制
相关文章

相似问题

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