void req_deletearray(struct batch_request *preq) { job_array *pa; char *range; struct work_task *ptask; int num_skipped; char owner[PBS_MAXUSER + 1]; pa = get_array(preq->rq_ind.rq_delete.rq_objname); if (pa == NULL) { reply_ack(preq); return; } /* check authorization */ get_jobowner(pa->ai_qs.owner, owner); if (svr_authorize_req(preq, owner, pa->ai_qs.submit_host) == -1) { sprintf(log_buffer, msg_permlog, preq->rq_type, "Array", preq->rq_ind.rq_delete.rq_objname, preq->rq_user, preq->rq_host); log_event( PBSEVENT_SECURITY, PBS_EVENTCLASS_JOB, preq->rq_ind.rq_delete.rq_objname, log_buffer); req_reject(PBSE_PERM, 0, preq, NULL, "operation not permitted"); return; } /* get the range of jobs to iterate over */ range = preq->rq_extend; if ((range != NULL) && (strstr(range,ARRAY_RANGE) != NULL)) { /* parse the array range */ num_skipped = delete_array_range(pa,range); if (num_skipped < 0) { /* ERROR */ req_reject(PBSE_IVALREQ,0,preq,NULL,"Error in specified array range"); return; } } else { num_skipped = delete_whole_array(pa); } /* check if the array is gone */ if ((pa = get_array(preq->rq_ind.rq_delete.rq_objname)) != NULL) { /* some jobs were not deleted. They must have been running or had JOB_SUBSTATE_TRANSIT */ if (num_skipped != 0) { ptask = set_task(WORK_Timed, time_now + 2, array_delete_wt, preq); if(ptask) { return; } } } /* now that the whole array is deleted, we should mail the user if necessary */ reply_ack(preq); return; }
int req_deletearray( struct batch_request *preq) { job_array *pa; char *range; struct work_task *ptask; char log_buf[LOCAL_LOG_BUF_SIZE]; int num_skipped = 0; char owner[PBS_MAXUSER + 1]; time_t time_now = time(NULL); pa = get_array(preq->rq_ind.rq_delete.rq_objname); if (pa == NULL) { reply_ack(preq); return(PBSE_NONE); } /* check authorization */ get_jobowner(pa->ai_qs.owner, owner); if (svr_authorize_req(preq, owner, pa->ai_qs.submit_host) == -1) { sprintf(log_buf, msg_permlog, preq->rq_type, "Array", preq->rq_ind.rq_delete.rq_objname, preq->rq_user, preq->rq_host); log_event(PBSEVENT_SECURITY,PBS_EVENTCLASS_JOB,preq->rq_ind.rq_delete.rq_objname,log_buf); pthread_mutex_unlock(pa->ai_mutex); if (LOGLEVEL >= 7) { sprintf(log_buf, "%s: unlocked ai_mutex", __func__); log_event(PBSEVENT_JOB, PBS_EVENTCLASS_JOB, __func__, log_buf); } req_reject(PBSE_PERM, 0, preq, NULL, "operation not permitted"); return(PBSE_NONE); } /* get the range of jobs to iterate over */ range = preq->rq_extend; if ((range != NULL) && (strstr(range,ARRAY_RANGE) != NULL)) { if (LOGLEVEL >= 5) { sprintf(log_buf, "delete array requested by %s@%s for %s (%s)", preq->rq_user, preq->rq_host, preq->rq_ind.rq_delete.rq_objname, range); log_record(PBSEVENT_JOB, PBS_EVENTCLASS_JOB, __func__, log_buf); } /* parse the array range */ num_skipped = delete_array_range(pa,range); if (num_skipped < 0) { /* ERROR */ pthread_mutex_unlock(pa->ai_mutex); if (LOGLEVEL >= 7) { sprintf(log_buf, "%s: unlocked ai_mutex", __func__); log_event(PBSEVENT_JOB, PBS_EVENTCLASS_JOB, __func__, log_buf); } req_reject(PBSE_IVALREQ,0,preq,NULL,"Error in specified array range"); return(PBSE_NONE); } } else { if (LOGLEVEL >= 5) { sprintf(log_buf, "delete array requested by %s@%s for %s", preq->rq_user, preq->rq_host, preq->rq_ind.rq_delete.rq_objname); log_record(PBSEVENT_JOB, PBS_EVENTCLASS_JOB, __func__, log_buf); } if ((num_skipped = delete_whole_array(pa)) == NO_JOBS_IN_ARRAY) array_delete(pa); } if (num_skipped != NO_JOBS_IN_ARRAY) { pthread_mutex_unlock(pa->ai_mutex); if (LOGLEVEL >= 7) { sprintf(log_buf, "%s: unlocked ai_mutex", __func__); log_event(PBSEVENT_JOB, PBS_EVENTCLASS_JOB, __func__, log_buf); } /* check if the array is gone */ if ((pa = get_array(preq->rq_ind.rq_delete.rq_objname)) != NULL) { pthread_mutex_unlock(pa->ai_mutex); if (LOGLEVEL >= 7) { sprintf(log_buf, "%s: unlocked ai_mutex", __func__); log_event(PBSEVENT_JOB, PBS_EVENTCLASS_JOB, __func__, log_buf); } /* some jobs were not deleted. They must have been running or had JOB_SUBSTATE_TRANSIT */ if (num_skipped != 0) { ptask = set_task(WORK_Timed, time_now + 10, array_delete_wt, preq, FALSE); if (ptask) { return(PBSE_NONE); } } } } /* now that the whole array is deleted, we should mail the user if necessary */ reply_ack(preq); return(PBSE_NONE); } /* END req_deletearray() */