static struct wproc_job *create_job(int type, void *arg, time_t timeout, const char *cmd) { struct wproc_job *job; struct wproc_worker *wp; wp = get_worker(cmd); if (!wp) return NULL; job = calloc(1, sizeof(*job)); if (!job) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Failed to allocate memory for worker job: %s\n", strerror(errno)); return NULL; } job->wp = wp; job->id = get_job_id(wp); job->type = type; job->arg = arg; job->timeout = timeout; if (fanout_add(wp->jobs, job->id, job) < 0 || !(job->command = strdup(cmd))) { free(job); return NULL; } return job; }
static void fo_reassign_wproc_job(void *job_) { struct wproc_job *job = (struct wproc_job *)job_; job->wp = get_worker(job->command); job->id = get_job_id(job->wp); /* macros aren't used right now anyways */ wproc_run_job(job, NULL); }
END_TEST START_TEST(test_get_job_id) { std::string job_id; int resc_access_perm = ATR_DFLAG_USWR | ATR_DFLAG_Creat; int created_here = 0; batch_request preq; memset(&preq, 0, sizeof(preq)); preq.rq_fromsvr = 1; strcpy(preq.rq_ind.rq_queuejob.rq_jid, "1.napali"); fail_unless(get_job_id(&preq, resc_access_perm, created_here, job_id) == PBSE_NONE); fail_unless(job_id == "1.napali"); fail_unless(resc_access_perm & (ATR_DFLAG_MGWR | ATR_DFLAG_SvWR)); fail_unless(created_here == 0); preq.rq_fromsvr = 0; resc_access_perm = ATR_DFLAG_USWR | ATR_DFLAG_Creat; fail_unless(get_job_id(&preq, resc_access_perm, created_here, job_id) != PBSE_NONE); preq.rq_ind.rq_queuejob.rq_jid[0] = '\0'; sprintf(server_name, "napali"); fail_unless(get_job_id(&preq, resc_access_perm, created_here, job_id) == PBSE_NONE); fail_unless(job_id == "0.napali", job_id.c_str()); fail_unless(created_here == 1); fail_unless(resc_access_perm == (ATR_DFLAG_USWR | ATR_DFLAG_Creat)); strcpy(str_to_set, "tom"); created_here = 0; fail_unless(get_job_id(&preq, resc_access_perm, created_here, job_id) == PBSE_NONE); fail_unless(created_here == 1); fail_unless(job_id == "1.napali.tom", job_id.c_str()); created_here = 0; long_to_set = 0; fail_unless(get_job_id(&preq, resc_access_perm, created_here, job_id) == PBSE_NONE); fail_unless(created_here == 1); fail_unless(job_id == "2.tom", job_id.c_str()); created_here = 0; str_to_set[0] = '\0'; fail_unless(get_job_id(&preq, resc_access_perm, created_here, job_id) == PBSE_NONE); fail_unless(created_here == 1); fail_unless(job_id == "3", job_id.c_str()); server.sv_qs.sv_jobidnumber = PBS_SEQNUMTOP; fail_unless(get_job_id(&preq, resc_access_perm, created_here, job_id) == PBSE_NONE); fail_unless(job_id == "99999999", job_id.c_str()); fail_unless(get_job_id(&preq, resc_access_perm, created_here, job_id) == PBSE_NONE); fail_unless(job_id == "0", job_id.c_str()); }
static worker_process *get_worker(worker_job *job) { worker_process *wp = NULL; int i; if (!workers) { return NULL; } wp = workers[worker_index++ % num_workers]; job->id = get_job_id(wp); if (job->id < 0) { /* XXX FIXME Fiddle with finding a new, less busy, worker here */ } wp->jobs[job->id % wp->max_jobs] = job; job->wp = wp; return wp; /* dead code below. for now */ for (i = 0; i < num_workers; i++) { wp = workers[worker_index++ % num_workers]; if (wp) { /* * XXX: check worker flags so we don't ship checks to a * worker that's about to reincarnate. */ return wp; } worker_index++; if (wp) return wp; } return NULL; }
int handle_gahp_command(char ** argv, int argc) { // Assume it's been verified if (strcasecmp (argv[0], GAHP_COMMAND_JOB_REMOVE)==0) { int req_id = 0; int cluster_id, proc_id; if (!(argc == 5 && get_int (argv[1], &req_id) && get_job_id (argv[3], &cluster_id, &proc_id))) { dprintf (D_ALWAYS, "Invalid args to %s\n", argv[0]); return FALSE; } enqueue_command ( SchedDRequest::createRemoveRequest( req_id, cluster_id, proc_id, argv[4])); return TRUE; } else if (strcasecmp (argv[0], GAHP_COMMAND_JOB_HOLD)==0) { int req_id = 0; int cluster_id, proc_id; if (!(argc == 5 && get_int (argv[1], &req_id) && get_job_id (argv[3], &cluster_id, &proc_id))) { dprintf (D_ALWAYS, "Invalid args to %s\n", argv[0]); return FALSE; } enqueue_command ( SchedDRequest::createHoldRequest( req_id, cluster_id, proc_id, argv[4])); return TRUE; } else if (strcasecmp (argv[0], GAHP_COMMAND_JOB_RELEASE)==0) { int req_id = 0; int cluster_id, proc_id; if (!(argc == 5 && get_int (argv[1], &req_id) && get_job_id (argv[3], &cluster_id, &proc_id))) { dprintf (D_ALWAYS, "Invalid args to %s\n", argv[0]); return FALSE; } enqueue_command ( SchedDRequest::createReleaseRequest( req_id, cluster_id, proc_id, argv[4])); return TRUE; } else if (strcasecmp (argv[0], GAHP_COMMAND_JOB_STATUS_CONSTRAINED) ==0) { int req_id; if (!(argc == 4 && get_int (argv[1], &req_id))) { dprintf (D_ALWAYS, "Invalid args to %s\n", argv[0]); return FALSE; } char * constraint = argv[3]; enqueue_command ( SchedDRequest::createStatusConstrainedRequest( req_id, constraint)); return TRUE; } else if (strcasecmp (argv[0], GAHP_COMMAND_JOB_UPDATE_CONSTRAINED) ==0) { int req_id; ClassAd * classad; if (!(argc == 5 && get_int (argv[1], &req_id) && get_class_ad (argv[4], &classad))) { dprintf (D_ALWAYS, "Invalid args to %s\n", argv[0]); return FALSE; } char * constraint = argv[3]; enqueue_command ( SchedDRequest::createUpdateConstrainedRequest( req_id, constraint, classad)); delete classad; return TRUE; } else if (strcasecmp (argv[0], GAHP_COMMAND_JOB_UPDATE) ==0) { int req_id; ClassAd * classad; int cluster_id, proc_id; if (!(argc == 5 && get_int (argv[1], &req_id) && get_job_id (argv[3], &cluster_id, &proc_id) && get_class_ad (argv[4], &classad))) { dprintf (D_ALWAYS, "Invalid args to %s\n", argv[0]); return FALSE; } //char * constraint = argv[3]; enqueue_command ( SchedDRequest::createUpdateRequest( req_id, cluster_id, proc_id, classad)); delete classad; return TRUE; } else if (strcasecmp (argv[0], GAHP_COMMAND_JOB_SUBMIT) ==0) { int req_id; ClassAd * classad; if (!(argc == 4 && get_int (argv[1], &req_id) && get_class_ad (argv[3], &classad))) { dprintf (D_ALWAYS, "Invalid args to %s\n", argv[0]); return FALSE; } enqueue_command ( SchedDRequest::createSubmitRequest( req_id, classad)); delete classad; return TRUE; } else if (strcasecmp (argv[0], GAHP_COMMAND_JOB_UPDATE_LEASE) ==0) { int req_id; int num_jobs; if (!(argc >= 4 && get_int (argv[1], &req_id) && get_int (argv[3], &num_jobs))) { dprintf (D_ALWAYS, "Invalid args to %s\n", argv[0]); return FALSE; } job_expiration * expirations = new job_expiration[num_jobs]; int i; for (i=0; i<num_jobs; i++) { if (!get_job_id(argv[4+i*2], &(expirations[i].cluster), &(expirations[i].proc))) { delete[] expirations; return FALSE; } if (!get_ulong (argv[4+i*2+1], &(expirations[i].expiration))) { delete [] expirations; return FALSE; } } enqueue_command ( SchedDRequest::createUpdateLeaseRequest( req_id, num_jobs, expirations)); delete [] expirations; return TRUE; } else if (strcasecmp (argv[0], GAHP_COMMAND_JOB_STAGE_IN) ==0) { int req_id; ClassAd * classad; if (!(argc == 4 && get_int (argv[1], &req_id) && get_class_ad (argv[3], &classad))) { dprintf (D_ALWAYS, "Invalid args to %s\n", argv[0]); return FALSE; } enqueue_command ( SchedDRequest::createJobStageInRequest( req_id, classad)); delete classad; return TRUE; } else if (strcasecmp (argv[0], GAHP_COMMAND_JOB_STAGE_OUT) ==0) { int req_id; int cluster_id, proc_id; if (!(argc == 4 && get_int (argv[1], &req_id) && get_job_id (argv[3], &cluster_id, &proc_id))) { dprintf (D_ALWAYS, "Invalid args to %s\n", argv[0]); return FALSE; } enqueue_command ( SchedDRequest::createJobStageOutRequest( req_id, cluster_id, proc_id)); return TRUE; } else if (strcasecmp (argv[0], GAHP_COMMAND_JOB_REFRESH_PROXY)==0) { int req_id = 0; int cluster_id, proc_id; if (!(argc == 5 && get_int (argv[1], &req_id) && get_job_id (argv[3], &cluster_id, &proc_id))) { dprintf (D_ALWAYS, "Invalid args to %s\n", argv[0]); return FALSE; } enqueue_command ( SchedDRequest::createRefreshProxyRequest( req_id, cluster_id, proc_id, argv[4])); return TRUE; } else if (strcasecmp (argv[0], GAHP_COMMAND_INITIALIZE_FROM_FILE)==0) { static bool init_done = false; if ( init_done == false ) { SetEnv( "X509_USER_PROXY", argv[1] ); UnsetEnv( "X509_USER_CERT" ); UnsetEnv( "X509_USER_KEY" ); proxySubjectName = x509_proxy_identity_name( argv[1] ); if ( !proxySubjectName ) { dprintf( D_ALWAYS, "Failed to query certificate identity " "from %s\n", argv[1] ); return TRUE; } Reconfig(); init_done = true; } return TRUE; } dprintf (D_ALWAYS, "Invalid command %s\n", argv[0]); return FALSE; }