On Wed, 05 Feb 2003 15:21:26 -0500 Scott Adkins <[EMAIL PROTECTED]> wrote:
> I solved this problem a long time ago by passing an environment variable > from the master process to the child process when the child process is > spawned indicating that the server is full. I used CYRUS_MAXCHILD, and > the child process already checks for the CYRUS_VERBOSE variable when it > starts in order to properly set the debugging level. If that variable > was set, then the child would output an error message indicating that the > server was full and to try again later. It would then close the client > connection and then exit. > > A couple things to note: > > 1) I prefer the client to be notified when the server is full and not > simply get connection refused messages or have the email client just > sit there, appearing to hang, while the server waits for a connection > to become free. > > 2) My method worked, but it didn't take advantage of the process reuse > feature. Basically, the master process only gets one chance to pass > an environment variable off to the child process. So, once that > variable is set in the child, the child will always believe that the > max has been reached. That is why I had the child process go away, > as it is basically useless after handling that one connection. > > 3) If there was a good way for the master to notify the child process > on each connection pass (either when passing the connection to an > already available child, or when passing the connectioin to a newly > spawn child) what the current status of maxchild is, then it would > be quite efficient to send the server full messages, close the > connection and wait for the master process to hand it another. I > don't know enough about how the master and child process communicate > to know how to make this work. > > Scott Now that you're discussing the mechanisms to refuse new connections politely because of some condition, i would like to suggest another condition to check: system loadavg. Some programs (sendmail for example) know how to reject connections if loadavg is >= some admin defined value. -- Jure Pecar