From: "J. Bruce Fields" <bfields@fieldses.org>
To: NeilBrown <neilb@suse.de>
Cc: linux-nfs@vger.kernel.org
Subject: Re: [PATCH 4/9] sunrpc/cache: allow threads to block while waiting for cache update.
Date: Thu, 15 Apr 2010 11:55:52 -0400 [thread overview]
Message-ID: <20100415155552.GC10961@fieldses.org> (raw)
In-Reply-To: <20100203063131.12945.23572.stgit@notabene.brown>
On Wed, Feb 03, 2010 at 05:31:31PM +1100, NeilBrown wrote:
> 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 latter part fails should only be a last-resort, not a
> normal practice.
I want to avoid it completely, actually. It's not so much that the
retry is expensive, as that it's actually incorrect in the case of
nonidempotent operations. (Chief among them, SEQUENCE--see
rq_usedeferral).
How about just letting the fallback be making the client retry?
We could do that just in the v4 case (returning DELAY to v4 clients, but
doing the existing deferral for others). Or we could handle them all
similarly (returning JUKEBOX in the v3 case, and dropping in the v2
case?)
Making the client retry is not as nice, but this should be an unusual
case. I'm not sure how to think about what the best behavior in such a
case.
> @@ -554,6 +573,29 @@ static int cache_defer_req(struct cache_req *req, struct cache_head *item)
> cache_revisit_request(item);
> return -EAGAIN;
> }
> +
> + if (dreq == &sleeper.handle) {
> + wait_event_interruptible_timeout(
> + sleeper.wait,
> + !test_bit(CACHE_PENDING, &item->flags)
> + || list_empty(&sleeper.handle.hash),
> + req->thread_wait);
> + spin_lock(&cache_defer_lock);
> + if (!list_empty(&sleeper.handle.hash)) {
> + list_del_init(&sleeper.handle.recent);
> + list_del_init(&sleeper.handle.hash);
> + cache_defer_cnt--;
> + }
> + spin_unlock(&cache_defer_lock);
> + if (test_bit(CACHE_PENDING, &item->flags)) {
> + /* item is still pending, try request
> + * deferral
> + */
> + dreq = req->defer(req);
> + goto retry;
> + }
> + return -EEXIST;
Can this be right? If we wake up from sleep with CACHE_PENDING cleared,
that's the succesful case.
--b.
next prev parent reply other threads:[~2010-04-15 15:55 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-03 6:31 [PATCH 0/9] Cache deferal improvements - try++ NeilBrown
[not found] ` <20100203060657.12945.27293.stgit-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2010-02-03 6:31 ` [PATCH 1/9] sunrpc: don't keep expired entries in the auth caches NeilBrown
[not found] ` <20100203063130.12945.29226.stgit-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2010-03-15 0:58 ` J. Bruce Fields
2010-02-03 6:31 ` [PATCH 5/9] nfsd/idmap: drop special request deferal in favour of improved default NeilBrown
2010-02-03 6:31 ` [PATCH 9/9] sunrpc/cache: change deferred-request hash table to use hlist NeilBrown
2010-02-03 6:31 ` [PATCH 7/9] nfsd: factor out hash functions for export caches NeilBrown
[not found] ` <20100203063131.12945.38791.stgit-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2010-03-17 19:35 ` J. Bruce Fields
2010-02-03 6:31 ` [PATCH 4/9] sunrpc/cache: allow threads to block while waiting for cache update NeilBrown
2010-04-15 15:55 ` J. Bruce Fields [this message]
2010-02-03 6:31 ` [PATCH 2/9] sunrpc/cache: factor out cache_is_expired NeilBrown
[not found] ` <20100203063131.12945.65321.stgit-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2010-03-15 0:58 ` J. Bruce Fields
2010-02-03 6:31 ` [PATCH 3/9] sunrpc: never return expired entries in sunrpc_cache_lookup NeilBrown
[not found] ` <20100203063131.12945.97779.stgit-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2010-03-17 21:33 ` J. Bruce Fields
2010-03-24 1:22 ` Neil Brown
2010-03-30 15:11 ` J. Bruce Fields
2010-02-03 6:31 ` [PATCH 8/9] svcauth_gss: replace a trivial 'switch' with an 'if' NeilBrown
2010-02-03 6:31 ` [PATCH 6/9] sunrpc: close connection when a request is irretrievably lost NeilBrown
2010-02-03 15:43 ` Chuck Lever
2010-02-03 21:23 ` Neil Brown
2010-02-03 22:20 ` Trond Myklebust
2010-02-03 22:34 ` J. Bruce Fields
2010-02-03 22:40 ` Chuck Lever
2010-02-03 23:13 ` Trond Myklebust
2010-02-04 0:06 ` Chuck Lever
2010-02-04 0:24 ` Trond Myklebust
2010-02-03 22:34 ` Chuck Lever
2010-02-03 19:43 ` [PATCH 0/9] Cache deferal improvements - try++ J. Bruce Fields
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100415155552.GC10961@fieldses.org \
--to=bfields@fieldses.org \
--cc=linux-nfs@vger.kernel.org \
--cc=neilb@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox