[erlang-questions] ets table disappears after bad query

Todd <>
Mon May 2 07:54:57 CEST 2011


I have an ets query that is broken. The funny thing is that after the 
query fails, the ets table disappears...

Here's the code...mostly ripped off from the file doc entry:
git://gist.github.com/951214.git

REPRO:

1. the ets table does not exist

127> ets:all().
[8207,4110,13,file_io_servers,inet_hosts_file_byaddr,
  inet_hosts_file_byname,inet_hosts_byaddr,inet_hosts_byname,
  inet_cache,inet_db,global_pid_ids,global_pid_names,
  global_names_ext,global_names,global_locks,ac_tab]
128>

2. running the test creates the ets table, 'file_test'

dynamic_file:test(). 

-----------------------------------------
create_file_slow
-----------------------------------------
create_file_slow,4884,1024,0.20966420966420968,1,
create_file_slow,16569,2048,0.1236043213229525,1,
create_file_slow,41857,4096,0.09785698927300093,1,
create_file_slow,135915,8192,0.060272964720597434,1,
create_file_slow,564260,16384,0.029036259880197073,1,
create_file_slow,525989,32768,0.062297880754160255,1,
-----------------------------------------
create_file (fast)
-----------------------------------------
create_file,13306,1024,0.07695776341500075,1,
create_file,2907,1024,0.3522531819745442,2,
create_file,1435,1024,0.713588850174216,4,
create_file,740,1024,1.3837837837837839,8,
...
create_file,468,1024,2.1880341880341883,16,
create_file,3132,32768,10.462324393358877,2048,
create_file,3556,32768,9.214848143982003,4096,
ok

3. verify the ets entry exists (it does)

129> ets:all().
[file_test,8207,4110,13,file_io_servers,
  inet_hosts_file_byaddr,inet_hosts_file_byname,
  inet_hosts_byaddr,inet_hosts_byname,inet_cache,inet_db,
  global_pid_ids,global_pid_names,global_names_ext,
  global_names,global_locks,ac_tab]


4. run my broken query. i'm trying to sort the results by a specific 
column so that I can find what block size results in the best 
performance...not sure yet what's wrong with the query, but i'll figure 
it out:

130> lists:sort(fun({_,_,_,A,_}, {_,_,_,B,_}) -> A < B end, 
ets:match(file_test, {create_file, '$0', '$1', '$2', '$3'})).
** exception error: no function clause matching 
erl_eval:'-inside-an-interpreted-fun-'([13306,1024,0.07695776341500075,1],
[2907,1024,0.3522531819745442,2])

5. look at the ets tables again, and whoa, the 'file_test' table is gone!

131>
ets:all(). 

[8207,4110,13,file_io_servers,inet_hosts_file_byaddr,
  inet_hosts_file_byname,inet_hosts_byaddr,inet_hosts_byname,
  inet_cache,inet_db,global_pid_ids,global_pid_names,
  global_names_ext,global_names,global_locks,ac_tab]

6. Is this expected behaviour? What would I have to do to prevent losing 
my ets table?

-Todd



More information about the erlang-questions mailing list