Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Apr 1995 12:03:18 -0700
From:      Bill Paul <wpaul>
To:        CVS-commiters, cvs-usrbin
Subject:   cvs commit: src/usr.bin/ypwhich ypwhich.c
Message-ID:  <199504261903.MAA21855@freefall.cdrom.com>

next in thread | raw e-mail | index | archive | help
wpaul       95/04/26 12:03:17

  Modified:    lib/libc/yp  yplib.c
               usr.sbin/ypbind  ypbind.c ypbind.8
               usr.bin/ypwhich  ypwhich.c
  Log:
  ypbind.c: Major overhaul.
  
  - Moved to a more client-driven model. We aggressively attempt to keep
  the default domain bound (as before) but we give up on non-default
  domains if we lose contact with a server and fail to get a response
  after one round of broadcasting. This helps drastically reduce the
  amount of network bandwitdh that ypbind consumes: if a client references
  the secondary domain at some later point, this will prod ypbind into
  establishing a new binding anyway, so continuously broadcasting without
  need is pointless.
  
  Note that we still actively seek out a binding for our default domain
  even if no client program has queried us yet. I'm not exactly sure if
  this matches SunOS's behavior or not, but I decided to do it this way
  since we can get into all sorts of trouble if our default domain comes
  unbound. Even so, we're still much quieter than we used to be.
  
  - Removed a bunch of no-longer pertinent comments and a couple of
  chunks of #ifdef 0'ed code that no longer fit in to the new layout.
  
  - Theo deRaadt must have become frustrated with the callback mechanism
  in clnt_broadcast(), because he shamelessly stole the clnt_broadcast()
  code right out of the RPC library and hacked it up to suit his needs.
  (Comments and all! :)
  
  I can understand why: clnt_broadcast() blocks while awaiting replies.
  Changing this behavior requires surgery. However, you can work around
  this: fork the broadcast into a child process and relay the results
  back to the parent via a pipe. (Careful obervation has shown that the
  SunOS ypbind forks children for broadcasting too, though I can only
  guess what sort of interprocess communication it uses. pipe() seems to
  do the job well enough.)
  
  This may seem like the long way around, but it's not really that
  hard to implement, and I'd prefer to use documented RPC library functions
  wherever possible. We're careful to limit the number of simultaneous
  broadcasters to avoid swamping the system (the current limit is 5).
  Each clnt_broadcast() call only sends out a small number of packets
  at increasing intervals. We're also careful not to spawn more than one
  bradcaster for a given domain.
  
  - Used clntudp_bufcreate() and clnt_call() to implement a ping()
  function for directly querying a particular server so that we can
  check if it's still alive. This lets me completely remove the old
  bradcasting code and use actual RPC library calls instead, at the
  cost of more than a few handfulls of torn-out hair. (Make no mistake
  folks: I *HATE* RPC.) Currently, the ping interval is one minute.
  
  - Fixed another potential 'nfds too big for select()' bug: use
  _rpc_dtablesize() instead of getdtablesize().
  
  - Quieted gcc -Wall a bit.
  
  - Probably a bunch of other stuff that I've forgotten.
  
  ypbind.8:
  
  - Updated man page to reflect modifications.
  
  ypwhich.c:
  
  - Small mind-o fix from last time: decode error results from
  ypbind correctly (*groan*)
  
  yplib.c:
  
  - same as above
  
  - Change behavior of _yp_dobind() a little: if we get back a 'Domain
  not bound' error for a given domain, retry a few times before giving
  up and passing the error back to the caller. We have to sleep for a
  few seconds between tries since the 'Domain not bound' error comes
  back immediately (by repeatedly looping, we end up pounding on ypbind).
  We retry at most 20 times at 5 second intervals. This gives us a full
  minute to get a response. This seems to deviate a bit from SunOS
  behavior -- it appears to wait forever -- but I don't like the idea
  of perpetually hanging inside a library call.
  
  Note that this should fix the problems some people have with bindings
  not being established fast enough at boot time; sometimes amd is started
  in /etc/rc after ypbind has run but before it gets a binding set up. The
  automounter gets annoyed at this and tends to exit. By pausing ther YP
  calls until a binding is ready, we avoid this situation.
  
  - Another _yp_dobind() change: if we determine that our binding files
  are unlocked or nonexistent, jump directly to code that pokes ypbind
  into restablishing the binding. Again, if it fails, we'll time out
  eventually and return.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199504261903.MAA21855>