On 05/28/2012 11:43 AM, levin li wrote: > From: levin li <xingke.lwp at taobao.com> > > We should not make gateway retry in check_request when the > requested object in recovery is not local, in the case of requesting a > non-local object we should make it retry in io_op_done(), if the > requesting object is local, then we should make the gateway request > to retry. > > Signed-off-by: levin li <xingke.lwp at taobao.com> > --- > sheep/sdnet.c | 39 ++++++++++++++++++++++++++------------- > 1 file changed, 26 insertions(+), 13 deletions(-) > > diff --git a/sheep/sdnet.c b/sheep/sdnet.c > index 7cbaff8..18a1ced 100644 > --- a/sheep/sdnet.c > +++ b/sheep/sdnet.c > @@ -215,22 +215,35 @@ static int check_request(struct request *req) > retrying mechanism. */ > if (is_recoverying_oid(req->local_oid) && > !(req->rq.flags & SD_FLAG_CMD_RECOVERY)) { > - if (req->rq.flags & SD_FLAG_CMD_IO_LOCAL) { > - /* Sheep peer request */ > - if (is_recovery_init()) { > - req->rp.result = SD_RES_OBJ_RECOVERING; > - list_add_tail(&req->request_list, > - &sys->wait_rw_queue); > - } else > - list_add_tail(&req->request_list, > - &sys->wait_obj_queue); > - } else { > - /* Gateway request */ > - list_add_tail(&req->request_list, &sys->req_wait_for_obj_list); > + /* Only if the requested object stays in gateway, then > + the gateway request should be retried. */ > + if (!(req->rq.flags & SD_FLAG_CMD_IO_LOCAL)) { > + struct sd_vnode *vnodes[SD_MAX_COPIES]; > + int i, nr_copies; > + > + nr_copies = get_nr_copies(req->vnodes); > + oid_to_vnodes(req->vnodes, req->local_oid, > + nr_copies, vnodes); > + for (i = 0; i < nr_copies; i++) { > + struct sd_vnode *vnode = vnodes[i]; > + if (is_myself(vnode->addr, vnode->port)) > + break; > + } > + if (i == nr_copies) > + goto out; > } This check seems useless, req->local_oid already means it will access the local copy. Thanks, Yuan |