Date: Wed, 19 Jul 1995 10:14:55 -0400 (EDT) From: Mark Hittinger <bugs@ns1.win.net> To: hackers@freebsd.org, taylor-uucp@gnu.ai.mit.edu Subject: Large site patches for Taylor-UUCP Message-ID: <199507191414.KAA02302@ns1.win.net>
next in thread | raw e-mail | index | archive | help
Here is a list of what I did to make Taylor UUCP 1.05 run in a large
environment under FreeBSD. By large I mean around 100 megabytes of email
a day, several hundred megabytes of news a day, thousands of users, and
lots of calls. The problems appear to be generic, and the solutions
within are probably of good use no matter which version of Unix you live
with :-).
I ran into the following three distinct problems:
1. Taylor UUCP took a lot of cycles to read and parse my 'sys' file which
was almost 300K. I wrote some short patches to allow a default system.
If the system desired is not in the 'sys' file then we use the default
entry. Now the 'sys' file is 567 bytes. Big difference.
2. Our WinNet-UK partner made me aware that each time uuxqt was invoked it
scanned the entire uucp tree looking for work. They supplied me with
patches to force uuxqt to run for a single target user only. You have
to double check things later with a scavenger uuxqt process that finds
unrun X files. Big difference.
3. Mail delivery to a uucp user took longer than the receipt of the mail
itself. I modified the system to always queue incoming internet mail.
I use smap/smapd (TIS) and smapd is modified to do "sendmail -odq".
I modified rmail to always queue mail ( -DQUEUE_ONLY ). This prevents
an incoming mail pulse from overwelming your swap space and process
limits. Big difference at the peak load periods.
The combination of these three problems cause the uucp server to die during
the peak load periods, and provide poor service otherwise.
With the enclosed patches everything is fast, everybody is happy, and they
leave me alone! :-)
Caveats:
The diffs are against the FreeBSD variant of the Taylor-UUCP 1.05 tree.
The patches only work for Taylor config files.
The patches are not for all Unix systems! They work for FreeBSD, and are small
enough that if you have another Unix box you can figure out what to do.
The patches were done in panic mode with a system under duress. I needed to
solve my problem fast.
Patch set 1 : Allow a "default" system
--------------------------------------
Example last lines of "sys" file. A default system for everybody and a
special entry for the special case.
system default
protocol-parameter g timeout 20
protocol-parameter g retries 10
protocol-parameter g init-timeout 1
protocol-parameter g packet-size 64
system hotlanta
called-login hotlanta
protocol-parameter g timeout 20
protocol-parameter g retries 10
protocol-parameter g init-timeout 1
protocol-parameter g packet-size 4096
File: ./common_sources/uuconf.h (add a boolean to signify that the entry was
the default one)
*** uuconf.h_org Fri Oct 21 23:51:22 1994
--- uuconf.h Tue Jul 18 10:37:38 1995
***************
*** 191,192 ****
--- 191,194 ----
char *uuconf_zalternate;
+ /* If non-zero, this was the default sys entry */
+ int uuconf_fdefault ;
/* If non-zero, this alternate may be used for calling out. */
File: ./libuuconf/sinfo.c (If the system isn't found, make sure it
is in the berkeley db'd password file
and make sure it is a uucp user.
If it is, then use the default entry)
*** sinfo.org Sat Jul 8 15:08:24 1995
--- sinfo.c Tue Jul 18 11:09:14 1995
***************
*** 26,27 ****
--- 26,29 ----
#include "uucnfi.h"
+ #include <sys/types.h>
+ #include <pwd.h>
***************
*** 44,45 ****
--- 46,49 ----
boolean fgot;
+ struct passwd *pw ;
+ char *system_name ;
***************
*** 49,50 ****
--- 53,83 ----
iret = _uuconf_itaylor_system_internal (qglobal, zsystem, qsys);
+ if (iret == UUCONF_NOT_FOUND)
+ {
+ pw = getpwnam(zsystem) ;
+ if (pw == NULL)
+ {
+ iret = UUCONF_NOT_FOUND ;
+ }
+ else
+ {
+ /* Must be a UUCP user, should be a macro below */
+ if (strcmp(pw->pw_shell,"/usr/libexec/uucp/uucico") == 0)
+ {
+ iret = _uuconf_itaylor_system_internal (qglobal, "default", qsys);
+ if (iret == UUCONF_SUCCESS)
+ {
+ system_name = (char *) malloc((size_t) 16) ;
+ strcpy(system_name,zsystem) ;
+ qsys->uuconf_zname = (char *)system_name ;
+ qsys->uuconf_fdefault = 1 ; /* OK but was the default entry */
+ }
+ }
+ else
+ iret = UUCONF_NOT_FOUND ;
+ }
+ }
+ else
+ {
+ qsys->uuconf_fdefault = 0 ; /* OK and was not the default entry */
+ }
if (iret == UUCONF_SUCCESS)
File: ./libuuconf/val.c (If default then emulate a called-login
equals system-name. Otherwise do the
standard validation)
*** val.org Mon Jul 10 11:03:01 1995
--- val.c Tue Jul 18 11:04:31 1995
***************
*** 41,42 ****
--- 41,49 ----
#if HAVE_TAYLOR_CONFIG
+ if (qsys->uuconf_fdefault == 1) /* If default do simple validation */
+ {
+ if (strcmp(qsys->uuconf_zname,zlogin) == 0) /* system=user? */
+ return UUCONF_SUCCESS ;
+ else
+ return UUCONF_NOT_FOUND ;
+ } /* Otherwise validate normally */
return uuconf_taylor_validate (pglobal, qsys, zlogin);
Patch set 2 : make uuxqt work for a target system only. (I got this patch from
our WinNet-UK partner)
Example lines from my config file:
max-uuxqts 10 # The maximum number of uuxqts
run-uuxqt once # Run uuxqt after uucico exits
File: ./common_sources/system.h (modify entry point to include system)
*** system.h_org Sat Jul 8 20:08:11 1995
--- system.h Sat Jul 8 20:08:45 1995
***************
*** 560,562 ****
usysdep_get_xqt_free is called. */
! extern boolean fsysdep_get_xqt_init P((void));
--- 560,562 ----
usysdep_get_xqt_free is called. */
! extern boolean fsysdep_get_xqt_init P((char *zsystem));
File: ./libunix/xqtfil.c (modify entry point to include system)
*** xqtfil.org Sat Jul 8 20:12:53 1995
--- xqtfil.c Sat Jul 8 20:16:51 1995
***************
*** 84,85 ****
--- 84,86 ----
#endif /* SUBDIRS */
+ static char *zOnlySystem = NULL ;
<FF>
***************
*** 91,93 ****
boolean
! fsysdep_get_xqt_init ()
{
--- 92,95 ----
boolean
! fsysdep_get_xqt_init (zsystem)
! char *zsystem;
{
***************
*** 95,96 ****
--- 97,100 ----
+ zOnlySystem = zbufcpy (zsystem);
+
qSxqt_topdir = opendir ((char *) ZDIR);
***************
*** 151,152 ****
--- 155,159 ----
+ if (zOnlySystem != NULL && strcmp(qtop->d_name, zOnlySystem) != 0)
+ continue ;
+
DEBUG_MESSAGE1 (DEBUG_SPOOLDIR,
***************
*** 262,263 ****
--- 269,272 ----
zSsystem = NULL;
+ ubuffree (zOnlySystem) ;
+ zOnlySystem = NULL ;
#endif
File: ./uuxqt/uuxqt.c (modify entry point to include system)
*** uuxqt.org Sat Jul 8 20:09:55 1995
--- uuxqt.c Sat Jul 8 20:12:00 1995
***************
*** 250,252 ****
! if (! fsysdep_get_xqt_init ())
{
--- 250,252 ----
! if (! fsysdep_get_xqt_init (zdosys))
{
File: ./uustat/uustat.c (modify entry point to include system
arg as NULL meaning everybody)
*** uustat.org Sat Jul 8 20:09:07 1995
--- uustat.c Sat Jul 8 20:09:37 1995
***************
*** 1424,1426 ****
! if (! fsysdep_get_xqt_init ())
return FALSE;
--- 1424,1426 ----
! if (! fsysdep_get_xqt_init (NULL))
return FALSE;
***************
*** 1963,1965 ****
/* Get a count of all the execution files. */
! if (! fsysdep_get_xqt_init ())
return FALSE;
--- 1963,1965 ----
/* Get a count of all the execution files. */
! if (! fsysdep_get_xqt_init (NULL))
return FALSE;
Good Luck!
Regards,
Mark Hittinger
bugs@win.net
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199507191414.KAA02302>
