From: Josh Durgin <josh.durgin@inktank.com>
To: Alex Elder <elder@inktank.com>
Cc: ceph-devel@vger.kernel.org
Subject: Re: [PATCH] libceph: complete lingering requests only once
Date: Mon, 04 Mar 2013 17:36:51 -0800 [thread overview]
Message-ID: <51354C33.8000206@inktank.com> (raw)
In-Reply-To: <512F6C7F.4030805@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
On 02/28/2013 06:41 AM, Alex Elder wrote:
> An osd request marked to linger will be re-submitted in the event
> a connection to the target osd gets dropped. Currently, if there
> is a callback function associated with a request it will be called
> each time a request is submitted--which for lingering requests can
> be more than once.
>
> Change it so a request--including lingering ones--will get completed
> (from the perspective of the user of the osd client) exactly once.
>
> This resolves:
> http://tracker.ceph.com/issues/3967
>
> Signed-off-by: Alex Elder <elder@inktank.com>
> ---
> include/linux/ceph/osd_client.h | 1 +
> net/ceph/osd_client.c | 5 +++++
> 2 files changed, 6 insertions(+)
>
> diff --git a/include/linux/ceph/osd_client.h
> b/include/linux/ceph/osd_client.h
> index 1dd5d46..a79f833 100644
> --- a/include/linux/ceph/osd_client.h
> +++ b/include/linux/ceph/osd_client.h
> @@ -85,6 +85,7 @@ struct ceph_osd_request {
> s32 r_reply_op_result[CEPH_OSD_MAX_OP];
> int r_got_reply;
> int r_linger;
> + int r_completed;
>
> struct ceph_osd_client *r_osdc;
> struct kref r_kref;
> diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
> index 1d9ebf9..a28c976a 100644
> --- a/net/ceph/osd_client.c
> +++ b/net/ceph/osd_client.c
> @@ -1174,6 +1174,7 @@ static void handle_reply(struct ceph_osd_client
> *osdc, struct ceph_msg *msg,
> u32 reassert_epoch;
> u64 reassert_version;
> u32 osdmap_epoch;
> + int already_completed;
> int i;
>
> tid = le64_to_cpu(msg->hdr.tid);
> @@ -1282,7 +1283,11 @@ static void handle_reply(struct ceph_osd_client
> *osdc, struct ceph_msg *msg,
> ((flags & CEPH_OSD_FLAG_WRITE) == 0))
> __unregister_request(osdc, req);
>
> + already_completed = req->r_completed;
> + req->r_completed = 1;
> mutex_unlock(&osdc->request_mutex);
> + if (already_completed)
> + goto done;
>
> if (req->r_callback)
> req->r_callback(req, msg);
>
prev parent reply other threads:[~2013-03-05 1:37 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-02-28 14:41 [PATCH] libceph: complete lingering requests only once Alex Elder
2013-03-05 1:36 ` Josh Durgin [this message]
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=51354C33.8000206@inktank.com \
--to=josh.durgin@inktank.com \
--cc=ceph-devel@vger.kernel.org \
--cc=elder@inktank.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.