[Pvfs2-cvs] commit by pcarns in pvfs2-1/src/io/job: job.c

CVS commit program cvs at parl.clemson.edu
Thu May 13 14:10:06 EDT 2010


Update of /projects/cvsroot/pvfs2-1/src/io/job
In directory parlweb1:/tmp/cvs-serv15585

Modified Files:
	job.c 
Log Message:
experimental update of fix for precreate bug reported by Bart Taylor (original 
fix led to a seg fault).


Index: job.c
===================================================================
RCS file: /projects/cvsroot/pvfs2-1/src/io/job/job.c,v
diff -p -u -r1.191 -r1.192
--- job.c	6 May 2010 19:42:34 -0000	1.191
+++ job.c	13 May 2010 18:10:06 -0000	1.192
@@ -4428,20 +4428,24 @@ static void precreate_pool_get_thread_mg
     trove_pending_count--;
     assert(trove_pending_count >= 0);
 
-    tmp_trove->jd->u.precreate_pool.trove_pending--;
-    assert(tmp_trove->jd->u.precreate_pool.trove_pending >= 0);
-
     /* don't overwrite error codes from other trove ops */
     if(tmp_trove->jd->u.precreate_pool.error_code == 0)
     {
         tmp_trove->jd->u.precreate_pool.error_code = error_code;
     }
 
+    /* acquiring this mutex a little early so that it can also serve to
+     * prevent multiple trove operations from racing between decrementing 
+     * and then reading the pool.trove_pending counter
+     */
+    gen_mutex_lock(&completion_mutex);
+
+    tmp_trove->jd->u.precreate_pool.trove_pending--;
+    assert(tmp_trove->jd->u.precreate_pool.trove_pending >= 0);
+
     /* is this job done? */
     if(tmp_trove->jd->u.precreate_pool.trove_pending == 0)
     {
-        gen_mutex_lock(&completion_mutex);
-
         /* set job descriptor fields and put into completion queue */
         tmp_trove->jd->u.precreate_pool.error_code = 0;
         job_desc_q_add(completion_queue_array[tmp_trove->jd->context_id], 
@@ -4458,6 +4462,7 @@ static void precreate_pool_get_thread_mg
         return;
     }
 
+    gen_mutex_unlock(&completion_mutex);
     return;
 }
 
@@ -5704,8 +5709,8 @@ int job_precreate_pool_get_handles(
     jd->u.precreate_pool.precreate_handle_index = 0;
     jd->u.precreate_pool.fsid = fsid;
     jd->u.precreate_pool.servers = servers;
-    jd->u.precreate_pool.trove_pending = 0;
     jd->u.precreate_pool.flags = flags;
+    jd->u.precreate_pool.trove_pending = 0;
 
     /* rotate to use a different starting server in the pool next time */
     gen_mutex_lock(&precreate_pool_mutex);



More information about the Pvfs2-cvs mailing list