On Thursday 20 December 2001 01:01 pm, Bill Stoddard wrote: > > On Thursday 20 December 2001 12:22 pm, Greg Ames wrote: > > > ...are more painful to deal with than you might think, if the user is > > > allowed to code them in any order. > > > > > > I'd like the comparisons between MaxClients and ServerLimit and the > > > equivalent thread directives to be coding order insensitive. So I > > > created a post-config hook to do the comparing & adjusting. The code > > > was very simple, but the log messages went to the error log file twice, > > > rather than to the console once which is what people are accustomed to > > > for config errors. > > > > > > worker already has the same situation with MaxClients and > > > ThreadsPerChild. It has a clever but kind of scary solution: a > > > pre-config hook which swaps nodes in the config tree if it doesn't like > > > the order. Then the comparisons, adjusting, and logging are done when > > > the second directive is parsed. > > > > > > While I think it's a very cool hack, mucking with the innards of the > > > config tree bothers me some. config.c could provide an API to do order > > > checking and swapping, but I can't see this as a general solution. > > > Think about cases where one directive is in container X and the other > > > isn't - yuck! > > > > This is the point of the config tree, it allows you to modify the config before > > we actually run the configuration, so that you can find these dependancies > > and fix them quickly. Putting the logic in the directive handlers doesn't > > really work, because you still have an order dependancy. > > > > Think of it this way, these are good configs: > > > > MaxClients 500 > > ServerLimit 525 > > > > ServerLimit 20 > > MaxClients 5 > > > > This is a bad config: > > > > MaxClients 525 > > ServerLimit 500 > > > > Where do you catch it though? In ServerLimit, then you > > will also catch the second good config above, which is a good config > > If you try to catch it in MaxClients, you will catch the first config above, > > which is a good config. > > > > The only solution is to choose default values that are invalid, so that you > > can make sure that you always check in the last directive handler, but that > > is incredibly ugly. We can easily create a function to do the swapping, > > which is more generic, but the swapping is the only 100% correct way > > to do this. > > > > Ryan > > I'm inclined to agree with Ryan. Let's just make a function to do the swapping.
I meant to mention that if you really want to fix this problem, we should move to an XML based config language. Ryan ______________________________________________________________ Ryan Bloom [EMAIL PROTECTED] Covalent Technologies [EMAIL PROTECTED] --------------------------------------------------------------
