Erlang :dets.open_file error I can't understand and fix

iex(1)> :dets.open_file("dets/definitions_agent", type: :set)
dets: file <<"dets/definitions_agent">> not properly closed, repairing ...
{:EXIT,
 {:function_clause,
  [
    {:lists, :thing_to_list, ["dets/definitions_agent"],
     [file: 'lists.erl', line: 603]},
    {:lists, :flatmap, 2, [file: 'lists.erl', line: 1250]},
    {:dets, :tempfile, 1, [file: 'dets.erl', line: 2786]},
    {:dets, :fsck_try, 5, [file: 'dets.erl', line: 2750]},
    {:dets, :fsck, 6, [file: 'dets.erl', line: 2727]},
    {:dets, :do_repair, 7, [file: 'dets.erl', line: 2597]},
    {:dets, :do_open_file, 4, [file: 'dets.erl', line: 2125]},
    {:dets, :do_internal_open, 5, [file: 'dets.erl', line: 1609]},
    {:dets, :init, 2, [file: 'dets.erl', line: 1285]},
    {:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 247]}
  ]}}

Can someone translate this error or tell me what is going on? :confused:

It occurs only when dets table dets/definitions_agent was not closed properly, but from the dets documentation looks like it should repair itself… but instead I get this error and I’m unable to decipher it.

What version of erlang are you using?

Erlang/OTP 20 [erts-9.3.1] [source] [64-bit] [smp:6:6] [ds:6:6:10] [async-threads:10] [hipe] [kernel-poll:false] Elixir 1.6.5

Ok, looks like a regression. I filed a bug report about this in Erl 18. (https://bugs.erlang.org/browse/ERL-55) it was fixed in Erl 19, but seems to no longer work in Erl 20.

Try using charstring instead of binary string when you open the file.

The bug was hard to spot because using binary string works to open a clean file, but not if a file has to be repaired.

This works for me with OTP 20 / Iex 1.6.4

:dets.open_file('dets/definitions_agent', type: :set)
dets: file "dets/definitions_agent" not properly closed, repairing ...
2 Likes

Thank you very much, it does work with your solution. I also checked OTP 21-rc2 and you can pass strings there, so they fixed it back in OTP 20 it seems you can’t pass string if file needs to be repaired.