• NeilBrown's avatar
    sunrpc/cache: allow threads to block while waiting for cache update. · f16b6e8d
    NeilBrown authored
    The current practice of waiting for cache updates by queueing the
    whole request to be retried has (at least) two problems.
    
    1/ With NFSv4, requests can be quite complex and re-trying a whole
      request when a later part fails should only be a last-resort, not a
      normal practice.
    
    2/ Large requests, and in particular any 'write' request, will not be
      queued by the current code and doing so would be undesirable.
    
    In many cases only a very sort wait is needed before the cache gets
    valid data.
    
    So, providing the underlying transport permits it by setting
     ->thread_wait,
    arrange to wait briefly for an upcall to be completed (as reflected in
    the clearing of CACHE_PENDING).
    If the short wait was not long enough and CACHE_PENDING is still set,
    fall back on the old approach.
    
    The 'thread_wait' value is set to 5 seconds when there are spare
    threads, and 1 second when there are no spare threads.
    
    These values are probably much higher than needed, but will ensure
    some forward progress.
    
    Note that as we only request an update for a non-valid item, and as
    non-valid items are updated in place it is extremely unlikely that
    cache_check will return -ETIMEDOUT.  Normally cache_defer_req will
    sleep for a short while and then find that the item is_valid.
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
    f16b6e8d
svc_xprt.c 33 KB