Design question -- a valid or foolhardy approach to ets update?

Steve Davis <>
Tue Jul 14 12:02:36 CEST 2009


I am maintaining HTTP session data as records in an ETS table. This
table is managed by a gen_server. However, each time the client makes
a request the session expiry time needs to be updated, which means
updating one field in the session record.

In order not to bottleneck the gen_server process by having all
clients contact the gen_server at every request, I'm considering a
direct ETS update of the session record from the client process rather
than doing a safe gen_server:call to update the record. i.e.:

%% TODO: probably needs a big fat review...
update_session(S = #session{key=Key}) ->
    case ets:lookup(?ETS, Key) of
	[_Existing] ->
		NewS = S#session{expires = unow() + S#session.ttl},
		ets:insert(?ETS, NewS);
	[] ->
		{error, not_found}
    end.

My reasoning is that since **only the client process** (meaning the
spawned HTTP connection) will ever access its own record in the
central ?ETS session table this approach should be safe to do... am I
correct in my thinking or am I badly wrong somewhere? Is there some
consideration I'm missing that could mean that this could result in
lock contention or deadlock?

Would I be better advised to at least surround the read/insert in a
try begin/end catch?

TYVMIA,

regs,
Steve


More information about the erlang-questions mailing list