Fixes for Version 1.4, Patchlevel 2
==============================================================================

BUG: cached coredumped due to calling memset() with an incorrect size
     value.


Fixes for Version 1.4, Patchlevel 1
==============================================================================

BUG: Mutual neighbors could deadlock on expired objects.

     The cache would return UDP_HIT for any object it knew about.  This
     included expired objects, and in-progress objects.  Two neighbor
     caches could deadlock as follows:

     C1: logs TCP_MISS       (due to user request)
     C2: logs UDP_HIT        (C2 has the object...)
     C2: logs TCP_MISS_TTL   (...but it is expired, so C2 checks...)
     C1: logs UDP_HIT        (...if C1 has the object; it does)
     C1: logs TCP_HIT        (C2 requests the full object from C1)

FIX: Only return UDP_HIT if the object is fully stored on disk, and
     does not expire for at least five (5) minutes.  The 5 minute
     default can be changed by setting UDP_HIT_THRESH in src/server/icp.c.

------------------------------------------------------------------------------

BUG: Some failed (and partial) FTP transfers get cached for long periods
     of time.

     Normally, a failed FTP transfer should be negatively cached for
     5 minutes.  The cache process had two routines which called
     wait() on child processes.  One of these properly checked the
     process return code, and the other did not.

FIX: The incorrect and redundant wait() routine does not get called
     anymore.

------------------------------------------------------------------------------

BUG: Hardcoded limit of 10 neighbor/parent caches.

FIX: Removed limit, neighbor data structure memory is dynamically allocated.

------------------------------------------------------------------------------

BUG: REVIVE_PARENT messages would never get logged.

FIX: rearrange the code to reset the counters after the log message.

------------------------------------------------------------------------------

BUG: During reload some objects may become corrupt due to 5 second
     timestamp window.

     This is evidenced by seeing "This file number is already
     allocated!" messages in the logfile.

     On reload (non-FAST mode), we call stat() for each object.  The
     file modification time must match the time logged in the swap out
     ("log") file.  Previously the timestamps were considered to match
     if they differed by 5 for fewer seconds.  This number was chosen in
     the event that the swap files might be on NFS partitions which may
     have slight time drift.

     This implicitly assumed that a swap file would not be reused within
     5 seconds.  Indeed on busy caches, swap files do occansionly get
     reused that quickly.

FIX: For this reason, the maximum timestamp delta has been changed to
     two (2) seconds.  The value can be changed by setting
     REBUILD_TIMESTAMP_DELTA_MAX in src/server/store.c

------------------------------------------------------------------------------

BUG: The cache would exit if the cache_dir directory existed, but
     all the swap directories did not exist.

FIX: Do not exit if mkdir() returns EEXIST.