END_TEST START_TEST(first_job_index_test) { job_array pa; int index; char buf[4096]; memset(&pa, 0, sizeof(pa)); pa.job_ids = (char **)calloc(10, sizeof(char *)); pa.ai_qs.array_size = 10; fail_unless(first_job_index(&pa) == -1, "no jobs fail"); pa.job_ids[8] = (char *)"bob"; index = first_job_index(&pa); snprintf(buf, sizeof(buf), "first job index should be 8 but is %d", index); fail_unless(index == 8, buf); pa.job_ids[4] = (char *)"tom"; index = first_job_index(&pa); snprintf(buf, sizeof(buf), "first job index should be 4 but is %d", index); fail_unless(index == 4, buf); }
int req_releasearray( batch_request *preq) /* I */ { job *pjob; job_array *pa; char *range; int rc; int index; pa = get_array(preq->rq_ind.rq_release.rq_objname); if (pa == NULL) { req_reject(PBSE_IVALREQ,0,preq,NULL,"Cannot find array"); return(PBSE_NONE); } mutex_mgr pa_mutex = mutex_mgr(pa->ai_mutex, true); while (TRUE) { if (((index = first_job_index(pa)) == -1) || (pa->job_ids[index] == NULL)) { return(PBSE_NONE); } if ((pjob = svr_find_job(pa->job_ids[index], FALSE)) == NULL) { free(pa->job_ids[index]); pa->job_ids[index] = NULL; } else break; } mutex_mgr pjob_mutex = mutex_mgr(pjob->ji_mutex, true); if (svr_authorize_jobreq(preq, pjob) == -1) { req_reject(PBSE_PERM,0,preq,NULL,NULL); return(PBSE_NONE); } pjob_mutex.unlock(); range = preq->rq_extend; if ((range != NULL) && (strstr(range,ARRAY_RANGE) != NULL)) { /* parse the array range */ /* ai_mutex is locked going into release_array_range and returns locked as well */ if ((rc = release_array_range(pa,preq,range)) != 0) { req_reject(rc,0,preq,NULL,NULL); return(PBSE_NONE); } } /* pa->ai_mutex remains locked in and out of release_whole_array */ else if ((rc = release_whole_array(pa,preq)) != 0) { req_reject(rc,0,preq,NULL,NULL); return(PBSE_NONE); } reply_ack(preq); return(PBSE_NONE); } /* END req_releasearray() */
int req_releasearray( void *vp) /* I */ { job *pjob; job_array *pa; char *range; int rc; int index; struct batch_request *preq = (struct batch_request *)vp; pa = get_array(preq->rq_ind.rq_release.rq_objname); if (pa == NULL) { req_reject(PBSE_IVALREQ,0,preq,NULL,"Cannot find array"); return(PBSE_NONE); } while (TRUE) { if (((index = first_job_index(pa)) == -1) || (pa->job_ids[index] == NULL)) { unlock_ai_mutex(pa, __func__, (char *)"1", LOGLEVEL); return(PBSE_NONE); } if ((pjob = svr_find_job(pa->job_ids[index], FALSE)) == NULL) { free(pa->job_ids[index]); pa->job_ids[index] = NULL; } else break; } if (svr_authorize_jobreq(preq, pjob) == -1) { req_reject(PBSE_PERM,0,preq,NULL,NULL); unlock_ai_mutex(pa, __func__, (char *)"2", LOGLEVEL); unlock_ji_mutex(pjob, __func__, (char *)"1", LOGLEVEL); return(PBSE_NONE); } unlock_ji_mutex(pjob, __func__, (char *)"2", LOGLEVEL); range = preq->rq_extend; if ((range != NULL) && (strstr(range,ARRAY_RANGE) != NULL)) { /* parse the array range */ if ((rc = release_array_range(pa,preq,range)) != 0) { unlock_ai_mutex(pa, __func__, (char *)"3", LOGLEVEL); req_reject(rc,0,preq,NULL,NULL); return(PBSE_NONE); } } else if ((rc = release_whole_array(pa,preq)) != 0) { unlock_ai_mutex(pa, __func__, (char *)"4", LOGLEVEL); req_reject(rc,0,preq,NULL,NULL); return(PBSE_NONE); } unlock_ai_mutex(pa, __func__, (char *)"5", LOGLEVEL); reply_ack(preq); return(PBSE_NONE); } /* END req_releasearray() */
int req_releasearray( void *vp) /* I */ { char log_buf[LOCAL_LOG_BUF_SIZE]; job *pjob; job_array *pa; char *range; int rc; int index; struct batch_request *preq = (struct batch_request *)vp; pa = get_array(preq->rq_ind.rq_release.rq_objname); if (pa == NULL) { req_reject(PBSE_IVALREQ,0,preq,NULL,"Cannot find array"); return(PBSE_NONE); } while (TRUE) { if (((index = first_job_index(pa)) == -1) || (pa->job_ids[index] == NULL)) { pthread_mutex_unlock(pa->ai_mutex); return(PBSE_NONE); } if ((pjob = svr_find_job(pa->job_ids[index], FALSE)) == NULL) { free(pa->job_ids[index]); pa->job_ids[index] = NULL; } else break; } if (svr_authorize_jobreq(preq, pjob) == -1) { req_reject(PBSE_PERM,0,preq,NULL,NULL); pthread_mutex_unlock(pa->ai_mutex); unlock_ji_mutex(pjob, __func__, "1", LOGLEVEL); return(PBSE_NONE); } unlock_ji_mutex(pjob, __func__, "2", LOGLEVEL); range = preq->rq_extend; if ((range != NULL) && (strstr(range,ARRAY_RANGE) != NULL)) { /* parse the array range */ if ((rc = release_array_range(pa,preq,range)) != 0) { if (LOGLEVEL >= 7) { sprintf(log_buf, "%s: unlocking ai_mutex", __func__); log_event(PBSEVENT_JOB, PBS_EVENTCLASS_JOB, pa->ai_qs.parent_id, log_buf); } pthread_mutex_unlock(pa->ai_mutex); req_reject(rc,0,preq,NULL,NULL); return(PBSE_NONE); } } else if ((rc = release_whole_array(pa,preq)) != 0) { if (LOGLEVEL >= 7) { sprintf(log_buf, "%s: unlocking ai_mutex", __func__); log_event(PBSEVENT_JOB, PBS_EVENTCLASS_JOB, pjob->ji_qs.ji_jobid, log_buf); } pthread_mutex_unlock(pa->ai_mutex); req_reject(rc,0,preq,NULL,NULL); return(PBSE_NONE); } if (LOGLEVEL >= 7) { sprintf(log_buf, "%s: unlocking ai_mutex", __func__); log_event(PBSEVENT_JOB, PBS_EVENTCLASS_JOB, pjob->ji_qs.ji_jobid, log_buf); } pthread_mutex_unlock(pa->ai_mutex); reply_ack(preq); return(PBSE_NONE); } /* END req_releasearray() */