[erlang-questions] ets behavior

Alin Popa <>
Thu Jun 11 07:39:26 CEST 2009


Thanks Steve,

Now's more clear.

On Thu, Jun 11, 2009 at 8:30 AM, Steve Vinoski <> wrote:

> On 6/11/09, Alin Popa <> wrote:
> > Hi,
> >
> >  I have the following behavior when using ets:
> >
> >  *1> ets:new(test, [named_table, public]).
> >  test
> >  2> ets:insert(test, {self(), 0}).
> >  true
> >  3> ets:update_counter(test, self(), 1).
> >  1
> >  4> ets:update_counter(test, self(), 2).
> >  3
> >  5> ets:update_counter(test, self(), 3).
> >  6
> >  6> ets:lookup(test, self()).
> >  [{<0.33.0>,6}]
> >  7> ets:info(test, self()).
> >  ** exception error: bad argument
> >      in function  ets:info/2
> >         called as ets:info(test,<0.33.0>)
>
> This is an illegal call. See the documentation for ets:info to see
> what arguments are allowed. Because of the badarg exception, you've
> just killed your shell, which was the owner of the ets table, so the
> ets table is now non-existent. If you were to call ets:info(test,
> owner) at this point, for example, you'd get undefined as the result,
> indicating that the table is gone.
>
> >  8> ets:update_counter(test, self(), 1).
> >  ** exception error: bad argument
> >      in function  ets:update_counter/3
> >         called as ets:update_counter(test,<0.41.0>,1)
> >  9> ets:update_counter(test, self(), 3).
> >  ** exception error: bad argument
> >      in function  ets:update_counter/3
> >         called as ets:update_counter(test,<0.43.0>,3)
> >  10> ets:update_counter(test, self(), 4).
> >  ** exception error: bad argument
> >      in function  ets:update_counter/3
> >         called as ets:update_counter(test,<0.45.0>,4)
> >  11>
> >  *
> >  What is happening here ? Why my counter (called test) is crashed ? A
> repair
> >  function should be called or something ?
>
> These all fail because the table is gone at this point. This is a new
> shell process, as you can see by the new value of self(). In fact, as
> you can see a new shell is created after each exception above.
>
> If you replace your call to ets:info at prompt 7 in this example with
> the following, then all is well:
>
> 7> (catch ets:info(test, self())).
> {'EXIT',{badarg,[{ets,info,[test,<0.33.0>]},
>                 {erl_eval,do_apply,5},
>                 {erl_eval,expr,5},
>                 {shell,exprs,6},
>                 {shell,eval_exprs,6},
>                 {shell,eval_loop,3}]}}
> 8> ets:update_counter(test, self(), 1).
> 7
>
> Here we catch the badarg to prevent it from killing the shell, so the
> table is still valid for the subsequent update_counter call.
>
> --steve
>



-- 
Regards,

Alin


More information about the erlang-questions mailing list