Two bugs in dets

John Hughes john.hughes@REDACTED
Mon Sep 20 17:09:56 CEST 2010


I've been using dets as an example for some new QuickCheck features, and 
seem to have discovered a couple of race conditions.

Firstly, insert_new is documented as returning a bool, but under certain 
circumstances it can return ok instead. This code prints ok every time on my 
machine (R14B under Windows):

bug1() ->
    T = dets:open_file(dets_table,[{type,bag}]),
    spawn(fun()->dets:insert(T,[]) end),
    spawn(fun()->io:format("~p\n",[dets:insert_new(T,[])]) end).

Both spawns are necessary to make this happen--otherwise the output is true, 
as it should be.

Secondly, the following code causes a bug message to appear:

bug3() ->
    file:delete(dets_table),
    T = dets:open_file(dets_table,[{type,set}]),
    spawn(fun() -> dets:delete(T,0) end),
    spawn(fun() -> dets:insert_new(T,{0,0}) end),
    ok.

When I run this with DETS_DEBUG set, I see this output:

87> dets_bugs:bug3().

=ERROR REPORT==== 20-Sep-2010::16:54:35 ===
** dets: Bug was found when accessing table dets_table,
** dets: operation was {delete_key,[0]} and reply was 
{'EXIT',{function_clause,[{dets_v9,eval_key1,[[{1,insert_new}],[],[],set,{0,0},[],[],0,[]]},{dets_v9,eval_key,9},{dets_v9,eval_slot,9},{dets_v9,eval_bucket_keys,8},{dets_v9,read_buckets,11},{dets,update_cache,2},{dets,stream_end,5},{dets,do_apply_op,4}]}}.
** dets: Stacktrace: 
[{dets,stream_end,5},{dets,do_apply_op,4},{proc_lib,init_p_do_apply,3}]
ok

I've seen the same behaviour for sets and bags, and when the delete is 
replaced by an insert (although that's a little harder to provoke). Sample 
output from a QuickCheck run that shows the latter case is below (but it 
looks like the same bug).

I'm attaching the QuickCheck spec that found these race conditions also--I 
can provide the right version of QuickCheck to run it and a trial licence if 
desired. It just focusses on the subset of operations in these examples, and 
its pretty good at finding a variety of variations on the theme.

6> eqc:check(dets_eqc:prop_parallel(),eqc:counterexample()).

=INFO REPORT==== 20-Sep-2010::17:01:59 ===
** dets: (debug) using disk map for dets_table

=INFO REPORT==== 20-Sep-2010::17:01:59 ===
** dets: (debug) using disk map for dets_table

=ERROR REPORT==== 20-Sep-2010::17:01:59 ===
** dets: Bug was found when accessing table dets_table,
** dets: operation was {insert,[]} and reply was 
{'EXIT',{function_clause,[{dets_v9,eval_key1,[[{0,insert_new}],[],[],bag,{0,0},[],[],0,[]]},{dets_v9,eval_key,9},{dets_v9,eval_slot,9},{dets_v9,eval_bucket_keys,8},{dets_v9,read_buckets,11},{dets,update_cache,2},{dets,stream_end,5},{dets,do_apply_op,4}]}}.
** dets: Stacktrace: 
[{dets,stream_end,5},{dets,do_apply_op,4},{proc_lib,init_p_do_apply,3}]
Failed! Reason:
{'EXIT',{timeout,1000}}
100
{[{set,{var,1},{call,dets_eqc,open_file,[dets_table,[{type,bag}]]}}],
 [[{set,{var,17},{call,dets,insert_new,[{var,1},{0,0}]}}],
  [{set,{var,19},{call,dets,insert,[{var,1},[]]}}]]}
false
7>
=ERROR REPORT==== 20-Sep-2010::17:02:00 ===
Error in process <0.14925.0> with exit value: 
{badarg,[{dets,insert_new,[dets_table,{0,0}]},{eqc_run_parallel_commands,run_child,3}]}

John 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: dets_eqc.erl
Type: application/octet-stream
Size: 4926 bytes
Desc: not available
URL: <http://erlang.org/pipermail/erlang-bugs/attachments/20100920/e530e083/attachment.obj>


More information about the erlang-bugs mailing list