[erlang-patches] Add supervisor:start_child/3 to limit the number of children

Vance Shipley <>
Wed Apr 10 14:08:12 CEST 2013

On Tue, Apr 09, 2013 at 04:10:27PM +0200, Siri Hansen wrote:
}  Is this feature mostly for use with simple_one_for_one supervisors? 

My current use case scenario is, yes.

}  I believe (possibly faulty??) that these are the most common supervisor for
}  which many children are repeatedly restarted as a part of normal execution.

Yes, I would agree.

}  Could you say something more about your use case? Other input on this?
In my case we are creating a child worker process to manage the lifecycle 
of a transaction.  We process thousands of transactions per second.  A 
transaction may take tens of milliseconds or tens of seconds.  We require
a limit on the number of possible ongoing transactions.

}  Regarding the implementation, one could say that the behavior differs a
}  little bit for different types of supervisors and child restart types.

It differs a little bit.  My description was:

   "If Limit or more children are already specified for the supervisor
    start_child/3 returns {error,child_limit}."

My implementation counts the child specifications.

}  * simple_one_for_one supervisor (all child restart types) -> Limit is
}  compared to the number of alive children.
}  * other supervisor type, temporary children -> Limit is compared to the
}  number of alive children.
}  * other supervisor type, non-temporary children -> Limit is compared to the
}  number of child specs.
Effectively yes, however it's really just the number of child_spec() as
we are not using is_process_alive/1 to prove it.  Really it's a limit on
the number of child_spec() which may exist.

}  The very least we need to consider is if this is the correct behavior, and
}  if so I think it needs to be mentioned in the documentation. Or should the
}  feature be restricted to simple_one_for_one supervisors (or is it only me?)?

I didn't see any reason to restrict it to simple_one_for_one supervisors.
You could use supervisor:start_child/2 to add thousands of children to a
one_for_one supervisor.  If you were doing that you might just want to 
limit the number of such child_spec() being added.

What do you think about Richard's suggestion that start_child/3 should
take an Options::list() argument instead with {child_limit, N::pos_integer()}
as the only currently defined option?


More information about the erlang-patches mailing list