/* * delete_whole_array() * * iterates over the array and deletes the whole thing * @param pa - the array to be deleted * @return - the number of jobs skipped */ int delete_whole_array( job_array *pa) /* I */ { int i; int num_skipped = 0; job *pjob; for (i = 0; i < pa->ai_qs.array_size; i++) { if (pa->jobs[i] == NULL) continue; pjob = (job *)pa->jobs[i]; if (pjob->ji_qs.ji_state >= JOB_STATE_EXITING) { /* invalid state for request, skip */ continue; } if (attempt_delete((void *)pjob) == FALSE) num_skipped++; } return(num_skipped); }
/* * delete_whole_array() * * iterates over the array and deletes the whole thing * @param pa - the array to be deleted * @return - the number of jobs skipped */ int delete_whole_array( job_array *pa) /* I */ { int i; int num_skipped = 0; int num_jobs = 0; int deleted; job *pjob; for (i = 0; i < pa->ai_qs.array_size; i++) { if (pa->job_ids[i] == NULL) continue; if ((pjob = svr_find_job(pa->job_ids[i], FALSE)) == NULL) { free(pa->job_ids[i]); pa->job_ids[i] = NULL; } else { num_jobs++; if (pjob->ji_qs.ji_state >= JOB_STATE_EXITING) { /* invalid state for request, skip */ unlock_ji_mutex(pjob, __func__, "1", LOGLEVEL); continue; } pthread_mutex_unlock(pa->ai_mutex); deleted = attempt_delete(pjob); if (deleted == FALSE) { /* if the job was deleted, this mutex would be taked care of elsewhere. * When it fails, release it here */ unlock_ji_mutex(pjob, __func__, "2", LOGLEVEL); num_skipped++; } pthread_mutex_lock(pa->ai_mutex); } } if (num_jobs == 0) return(NO_JOBS_IN_ARRAY); return(num_skipped); } /* END delete_whole_array() */
/* * delete_array_range() * * deletes a range from a specific array * * @param pa - the array whose jobs are deleted * @param range_str - the user-given range to delete * @return - the number of jobs skipped, -1 if range error */ int delete_array_range( job_array *pa, char *range_str) { tlist_head tl; array_request_node *rn; array_request_node *to_free; job *pjob; char *range; int i; int num_skipped = 0; /* get just the numeric range specified, '=' should * always be there since we put it there in qdel */ range = strchr(range_str,'='); range++; /* move past the '=' */ CLEAR_HEAD(tl); if (parse_array_request(range,&tl) > 0) { /* don't delete jobs if range error */ return(-1); } rn = (array_request_node*)GET_NEXT(tl); while (rn != NULL) { for (i = rn->start; i <= rn->end; i++) { if (pa->jobs[i] == NULL) continue; /* don't stomp on other memory */ if (i >= pa->ai_qs.array_size) continue; pjob = pa->jobs[i]; if (pjob->ji_qs.ji_state >= JOB_STATE_EXITING) { /* invalid state for request, skip */ continue; } if (attempt_delete((void *)pjob) == FALSE) num_skipped++; } to_free = rn; rn = (array_request_node*)GET_NEXT(rn->request_tokens_link); /* release mem */ free(to_free); } return(num_skipped); }
/* * delete_array_range() * * deletes a range from a specific array * * @param pa - the array whose jobs are deleted * @param range_str - the user-given range to delete * @return - the number of jobs skipped, -1 if range error */ int delete_array_range( job_array *pa, char *range_str) { tlist_head tl; array_request_node *rn; array_request_node *to_free; job *pjob; char *range; int i; int num_skipped = 0; int deleted; /* get just the numeric range specified, '=' should * always be there since we put it there in qdel */ range = strchr(range_str,'='); range++; /* move past the '=' */ CLEAR_HEAD(tl); if (parse_array_request(range,&tl) > 0) { /* don't delete jobs if range error */ return(-1); } rn = (array_request_node*)GET_NEXT(tl); while (rn != NULL) { for (i = rn->start; i <= rn->end; i++) { if (pa->job_ids[i] == NULL) continue; /* don't stomp on other memory */ if (i >= pa->ai_qs.array_size) continue; if ((pjob = svr_find_job(pa->job_ids[i], FALSE)) == NULL) { free(pa->job_ids[i]); pa->job_ids[i] = NULL; } else { if (pjob->ji_qs.ji_state >= JOB_STATE_EXITING) { /* invalid state for request, skip */ unlock_ji_mutex(pjob, __func__, "1", LOGLEVEL); continue; } pthread_mutex_unlock(pa->ai_mutex); deleted = attempt_delete(pjob); if (deleted == FALSE) { /* if the job was deleted, this mutex would be taked care of elsewhere. When it fails, * release it here */ unlock_ji_mutex(pjob, __func__, "1", LOGLEVEL); num_skipped++; } pthread_mutex_lock(pa->ai_mutex); } } to_free = rn; rn = (array_request_node*)GET_NEXT(rn->request_tokens_link); /* release mem */ free(to_free); } return(num_skipped); }
/* * delete_whole_array() * * iterates over the array and deletes the whole thing * @param pa - the array to be deleted * @return - the number of jobs skipped */ int delete_whole_array( job_array *pa) /* I */ { int i; int num_skipped = 0; int num_jobs = 0; int num_deleted = 0; int deleted; int running; job *pjob; for (i = 0; i < pa->ai_qs.array_size; i++) { if (pa->job_ids[i] == NULL) continue; if ((pjob = svr_find_job(pa->job_ids[i], FALSE)) == NULL) { free(pa->job_ids[i]); pa->job_ids[i] = NULL; } else { mutex_mgr pjob_mutex = mutex_mgr(pjob->ji_mutex, true); num_jobs++; if (pjob->ji_qs.ji_state >= JOB_STATE_EXITING) { /* invalid state for request, skip */ continue; } running = (pjob->ji_qs.ji_state == JOB_STATE_RUNNING); pthread_mutex_unlock(pa->ai_mutex); deleted = attempt_delete(pjob); pjob_mutex.set_lock_on_exit(false); if (deleted == FALSE) { /* if the job was deleted, this mutex would be taked care of elsewhere. * When it fails, release it here */ num_skipped++; } else if (running == FALSE) { /* running jobs will increase the deleted count when their obit is reported */ num_deleted++; } pthread_mutex_lock(pa->ai_mutex); } } pa->ai_qs.num_failed += num_deleted; if (num_jobs == 0) return(NO_JOBS_IN_ARRAY); return(num_skipped); } /* END delete_whole_array() */
/* * delete_array_range() * * deletes a range from a specific array * * @param pa - the array whose jobs are deleted * @param range_str - the user-given range to delete * @return - the number of jobs skipped, -1 if range error */ int delete_array_range( job_array *pa, char *range_str) { tlist_head tl; array_request_node *rn; array_request_node *to_free; job *pjob; char *range; int i; int num_skipped = 0; int num_deleted = 0; int deleted; int running; /* get just the numeric range specified, '=' should * always be there since we put it there in qdel */ if((range = strchr(range_str,'=')) == NULL) return(-1); range++; /* move past the '=' */ CLEAR_HEAD(tl); if (parse_array_request(range,&tl) > 0) { /* don't delete jobs if range error */ return(-1); } rn = (array_request_node*)GET_NEXT(tl); while (rn != NULL) { for (i = rn->start; i <= rn->end; i++) { if (pa->job_ids[i] == NULL) continue; /* don't stomp on other memory */ if (i >= pa->ai_qs.array_size) continue; if ((pjob = svr_find_job(pa->job_ids[i], FALSE)) == NULL) { free(pa->job_ids[i]); pa->job_ids[i] = NULL; } else { mutex_mgr pjob_mutex = mutex_mgr(pjob->ji_mutex, true); if (pjob->ji_qs.ji_state >= JOB_STATE_EXITING) { /* invalid state for request, skip */ continue; } running = (pjob->ji_qs.ji_state == JOB_STATE_RUNNING); pthread_mutex_unlock(pa->ai_mutex); deleted = attempt_delete(pjob); /* we come out of attempt_delete unlocked */ pjob_mutex.set_lock_on_exit(false); if (deleted == FALSE) { /* if the job was deleted, this mutex would be taked care of elsewhere. When it fails, * release it here */ num_skipped++; } else if (running == FALSE) { /* running jobs will increase the deleted count when their obit is reported */ num_deleted++; } pthread_mutex_lock(pa->ai_mutex); } } to_free = rn; rn = (array_request_node*)GET_NEXT(rn->request_tokens_link); /* release mem */ free(to_free); } pa->ai_qs.num_failed += num_deleted; return(num_skipped); } /* END delete_array_range() */