diff options
Diffstat (limited to 'libglusterfs/src/syncop.c')
| -rw-r--r-- | libglusterfs/src/syncop.c | 39 | 
1 files changed, 34 insertions, 5 deletions
diff --git a/libglusterfs/src/syncop.c b/libglusterfs/src/syncop.c index 2f80f5d8009..939ef406869 100644 --- a/libglusterfs/src/syncop.c +++ b/libglusterfs/src/syncop.c @@ -261,13 +261,27 @@ syncenv_task (struct syncproc *proc)  {  	struct syncenv   *env = NULL;          struct synctask  *task = NULL; +        struct timespec   sleep_till = {0, }; +        int               ret = 0;  	env = proc->env;          pthread_mutex_lock (&env->mutex);          { -                while (list_empty (&env->runq)) -                        pthread_cond_wait (&env->cond, &env->mutex); +                while (list_empty (&env->runq)) { +                        sleep_till.tv_sec = time (NULL) + SYNCPROC_IDLE_TIME; +                        ret = pthread_cond_timedwait (&env->cond, &env->mutex, +                                                      &sleep_till); +                        if (!list_empty (&env->runq)) +                                break; +                        if ((ret == ETIMEDOUT) && +                            (env->procs > SYNCENV_PROC_MIN)) { +                                task = NULL; +                                env->procs--; +                                memset (proc, 0, sizeof (*proc)); +                                goto unlock; +                        } +                }                  task = list_entry (env->runq.next, struct synctask, all_tasks); @@ -276,6 +290,7 @@ syncenv_task (struct syncproc *proc)  		task->proc = proc;          } +unlock:          pthread_mutex_unlock (&env->mutex);          return task; @@ -334,6 +349,8 @@ syncenv_processor (void *thdata)          for (;;) {                  task = syncenv_task (proc); +                if (!task) +                        break;                  synctask_switchto (task); @@ -347,7 +364,8 @@ syncenv_processor (void *thdata)  void  syncenv_scale (struct syncenv *env)  { -	int  thmax = 0; +	int  diff = 0; +        int  scale = 0;  	int  i = 0;  	int  ret = 0; @@ -356,14 +374,25 @@ syncenv_scale (struct syncenv *env)  		if (env->procs > env->runcount)  			goto unlock; -		thmax = min (env->runcount, SYNCENV_PROC_MAX); -		for (i = env->procs; i < thmax; i++) { +                scale = env->runcount; +                if (scale > SYNCENV_PROC_MAX) +                        scale = SYNCENV_PROC_MAX; +                if (scale > env->procs) +                        diff = scale - env->procs; +                while (diff) { +                        diff--; +                        for (; (i < SYNCENV_PROC_MAX); i++) { +                                if (env->proc[i].processor == 0) +                                        break; +                        } +  			env->proc[i].env = env;  			ret = pthread_create (&env->proc[i].processor, NULL,  					      syncenv_processor, &env->proc[i]);  			if (ret)  				break;  			env->procs++; +                        i++;  		}  	}  unlock:  | 
