[erlang-questions] limiting gen_server

Ulf Wiger ulf.wiger@REDACTED
Sun Aug 9 15:56:00 CEST 2009

These are not calls, though, at least not in the normal
gen_server vernacular. It is not really clear from this
snippet what you are trying to achieve, and what these
messages mean.

In general, it might be better to have a middle-man
process that buffers messages.

Another common form of buffering in gen_servers (at least
one that I commonly use), when the messages to be buffered
are real gen_server calls, is:

handle_call(Req, {Pid,_} = From, S) when ?should_buffer(S) ->
    MRef = erlang:monitor(process, Pid),
    S1 = buffer_req(MRef, {From, Req}, S),
    {noreply, S1};

where the buffer_req() function could store {MRef, {From,Req}}
in a list. The point of doing this is that if the caller
dies, you have a handle_info that handles it:

handle_info({'DOWN', Ref, _, _, _}, S) ->
    Buffered = [{R,Req} || {R, Req} <- S#st.buffered,
                           R =/= Ref],
    {noreply, S#st{buffered = Buffered}};

How you choose to attend to buffered calls is perhaps a
matter of taste. You could order a timer, or keep track
of outstanding calls, along the lines you suggest.

I realise this is not really an answer to your question,
but thought I'd expand the answer a bit. I would go with
a buffering middle-manager in your case, I think.

Ulf W

Micha wrote:
> Hi,
> I want to restrict the simultanous calls my gen_server handles, since it calls 
> a network service itself and should not flood it :-)
> I do it that way:
> I keep a counter in the state and when the counter reaches the maximum I do 
> the following:
> %% normal handling:
> handle_info({udp, Socket, IPtuple, InPortNo, Packet}, State)
> 		when State#state.cnt < ?LIMIT -> spawn(fun() -> ... end), ...;
> %% max reached:
> handle_info({udp, _Socket, _IPtuple, _InPortNo, _Packet} = Msg, State) ->
>      erlang:send_after(random:uniform(20)+10, self(), Msg),
>     {noreply, State};
> is this o.k. ?
> cheers, 
>  Michael
> ________________________________________________________________
> erlang-questions mailing list. See http://www.erlang.org/faq.html
> erlang-questions (at) erlang.org

Ulf Wiger
CTO, Erlang Training & Consulting Ltd

More information about the erlang-questions mailing list