我得到了一个不寻常的错误与一些简单的mnesia代码。这个问题是我的this other question的后续问题,但是现在我有了代码来重现这个问题。
我用的是二郎:
Erlang R16B01 (erts-5.10.2)源smp:4:4 hipe
在Arch Linux上。
如果我有这个密码:
-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并输入以下内容:
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,我就不会得到这个错误。任何比该版本更新的版本都会产生此错误。
还有其他人能复制这个错误吗?是什么引起的?
发布于 2013-06-24 13:47:53
我不能在我的机器上的R16B01上复制这个。
有些事情需要注意:
disc_only_copies复制DETS有什么特殊的原因吗?事件disc_copies要快得多,因为它们将数据集保存在内存中以及磁盘上的磁盘日志中。对于纯粹基于磁盘的存储,在我的经验中,还有其他选择通常比mnesia更好。https://stackoverflow.com/questions/17267345
复制相似问题