[sheepdog] [PATCH 2/2] sheep: cleanup prepare_schedule_oid and oid_in_recovery

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Mon Sep 2 07:49:02 CEST 2013


At Sat, 31 Aug 2013 20:51:43 +0800,
Liu Yuan wrote:
> 
> On Fri, Aug 30, 2013 at 11:24:32PM +0900, MORITA Kazutaka wrote:
> > From: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
> > 
> > This moves all the check of recovering objects from
> > prepare_schedule_oid() to oid_in_recovery(), and makes the code easier
> > to read.
> > 
> > This also fixes a problem that sheep doesn't recover an object when
> >  - sys->cinfo.disable_recovery is true,
> >  - rinfo->state is RW_PREPARE_LIST, and
> >  - oid_in_recovery() is called against the object
> > and fixes an error of tests/functional/010, which happens in rare
> > cases.
> > 
> > Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
> > ---
> >  include/sheep.h  |    5 ++++
> >  sheep/recovery.c |   77 ++++++++++++++++++++++++++++++------------------------
> >  2 files changed, 48 insertions(+), 34 deletions(-)
> > 
> > diff --git a/include/sheep.h b/include/sheep.h
> > index 68c852f..f9945c6 100644
> > --- a/include/sheep.h
> > +++ b/include/sheep.h
> > @@ -251,6 +251,11 @@ static inline const char *sd_strerror(int err)
> >  	return descs[err];
> >  }
> >  
> > +static inline int oid_cmp(const uint64_t *oid1, const uint64_t *oid2)
> > +{
> > +	return intcmp(*oid1, *oid2);
> > +}
> > +
> >  static inline int node_id_cmp(const struct node_id *node1,
> >  			      const struct node_id *node2)
> >  {
> > diff --git a/sheep/recovery.c b/sheep/recovery.c
> > index 6faaeab..4305e48 100644
> > --- a/sheep/recovery.c
> > +++ b/sheep/recovery.c
> > @@ -331,24 +331,11 @@ bool node_in_recovery(void)
> >  static inline void prepare_schedule_oid(uint64_t oid)
> >  {
> >  	struct recovery_info *rinfo = main_thread_get(current_rinfo);
> > -	uint64_t i;
> >  
> > -	for (i = 0; i < rinfo->nr_prio_oids; i++)
> > -		if (rinfo->prio_oids[i] == oid)
> > -			return;
> > -	/*
> > -	 * We need this check because oid might not be recovered.
> > -	 * Very much unlikely though, but it might happen indeed.
> > -	 */
> > -	for (i = 0; i < rinfo->done; i++)
> > -		if (rinfo->oids[i] == oid) {
> > -			sd_debug("%"PRIx64" not recovered, don't schedule it",
> > -				 oid);
> > -			return;
> > -		}
> 
> This check is removed entirely? I don't remember exactly how this check was
> introduced though.

This check is moved to oid_in_recovery():

+               if (xlfind(&oid, rinfo->oids, rinfo->done, oid_cmp)) {
+                       sd_debug("%" PRIx64 " has been already recovered", oid);
+                       return false;
+               }

> 
> > -	/* When recovery is not suspended, oid is currently being recovered */
> > -	if (!rinfo->suspended && rinfo->oids[rinfo->done] == oid)
> > +	if (xlfind(&oid, rinfo->prio_oids, rinfo->nr_prio_oids, oid_cmp)) {
> > +		sd_debug("%" PRIx64 " has been already in prio_oids", oid);
> >  		return;
> > +	}
> 
> is this correct? prio_oids are never sorted.

xlfind() does a linear search and the array doesn't need to be sorted.

Thanks,

Kazutaka



More information about the sheepdog mailing list