我收到了一些簡單的mnesia代碼的不尋常的錯誤。這個問題是我的後續this other question,但現在我有代碼來重現這個問題。Mnesia bad_object_header錯誤
我用這二郎:
二郎R16B01(專家評審組-5.10.2)[來源] [64位] [SMP:4:4] [異步線程:10] [HIPE] [kernel-poll:false]在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,"/.../[email protected]/rec.DAT"}}}
作爲一個方面說明,如果我退出erl
並重新啓動它,並做mnesia:start()
,我得到這個警告:
dets:文件「/.../[email protected]/rec.DAT」沒有正確關閉,修復...
這對我來說是非常可靠的行爲。我可以刪除整個數據庫,重新運行測試,並獲得完全相同的結果。
有一件事是,如果我把tryread
的電話放在test
函數的兩個事務之後,它就可以正常工作。它從REPL調用tryread
導致錯誤。
如果我將我的erlang Arch安裝包從R16B01-1降級到R16B-3,我不會收到此錯誤。任何比此更新的版本都會產生此錯誤。
其他人可以重現此錯誤嗎?是什麼造成的?
我無法在Windows環境中的R15B上重現它。 – Pascal