void *check_if_orphaned( void *vp) { char *rsv_id = (char *)vp; char job_id[PBS_MAXSVRJOBID]; struct batch_request *preq; int handle = -1; int retries = 0; struct pbsnode *pnode; char log_buf[LOCAL_LOG_BUF_SIZE]; if (is_orphaned(rsv_id, job_id) == TRUE) { if((preq = alloc_br(PBS_BATCH_DeleteReservation)) == NULL) return NULL; preq->rq_extend = rsv_id; /* Assume the request will be successful and remove the RSV from the hash table */ remove_alps_reservation(rsv_id); if ((pnode = get_next_login_node(NULL)) != NULL) { struct in_addr hostaddr; int local_errno; pbs_net_t momaddr; memcpy(&hostaddr, &pnode->nd_sock_addr.sin_addr, sizeof(hostaddr)); momaddr = ntohl(hostaddr.s_addr); snprintf(log_buf, sizeof(log_buf), "Found orphan ALPS reservation ID %s for job %s; asking %s to remove it", rsv_id, job_id, pnode->nd_name); log_record(PBSEVENT_DEBUG, PBS_EVENTCLASS_SERVER, __func__, log_buf); while ((handle < 0) && (retries < 3)) { handle = svr_connect(momaddr, pnode->nd_mom_port, &local_errno, pnode, NULL, ToServerDIS); retries++; } /* unlock before the network transaction */ unlock_node(pnode, __func__, NULL, LOGLEVEL); if (handle >= 0) issue_Drequest(handle, preq, true); free_br(preq); } } else free(rsv_id); return(NULL); } /* END check_if_orphaned() */
void *check_if_orphaned( void *vp) { char *rsv_id = (char *)vp; struct batch_request *preq; int handle = -1; int retries = 0; struct pbsnode *pnode; if (is_orphaned(rsv_id) == TRUE) { preq = alloc_br(PBS_BATCH_DeleteReservation); preq->rq_extend = rsv_id; if ((pnode = get_next_login_node(NULL)) != NULL) { struct in_addr hostaddr; int local_errno; pbs_net_t momaddr; memcpy(&hostaddr, &pnode->nd_sock_addr.sin_addr, sizeof(hostaddr)); momaddr = ntohl(hostaddr.s_addr); while ((handle < 0) && (retries < 3)) { handle = svr_connect(momaddr, pnode->nd_mom_port, &local_errno, pnode, NULL, ToServerDIS); retries++; } /* unlock before the network transaction */ unlock_node(pnode, __func__, NULL, 0); if (handle >= 0) { issue_Drequest(handle, preq, release_req, 0); } else free_br(preq); } } else free(rsv_id); return(NULL); } /* END check_if_orphaned() */
END_TEST START_TEST(prop_test) { struct pbsnode n1; struct pbsnode n2; struct pbsnode n3; struct pbsnode n4; struct pbsnode *rtd; int rc; int dummy1; int dummy2; int dummy3; int n1_rtd = 0; int n2_rtd = 0; int n3_rtd = 0; int n4_rtd = 0; char *feature = (char *)"tom"; char *feature2 = (char *)"bob"; std::vector<prop> props; std::vector<prop> props2; initialize_node_for_testing(&n1); initialize_node_for_testing(&n2); initialize_node_for_testing(&n3); initialize_node_for_testing(&n4); n1.add_property(feature); n2.add_property(feature); proplist(&feature, props, &dummy1, &dummy2, &dummy3); proplist(&feature2, props2, &dummy1, &dummy2, &dummy3); initialize_login_holder(); rc = add_to_login_holder(&n1); fail_unless(rc == 0); rc = add_to_login_holder(&n2); fail_unless(rc == 0); rc = add_to_login_holder(&n3); fail_unless(rc == 0); rc = add_to_login_holder(&n4); fail_unless(rc == 0); rtd = get_next_login_node(&props); increment_counts(&n1, &n2, &n3, &n4, rtd, &n1_rtd, &n2_rtd, &n3_rtd, &n4_rtd); rtd = get_next_login_node(&props); increment_counts(&n1, &n2, &n3, &n4, rtd, &n1_rtd, &n2_rtd, &n3_rtd, &n4_rtd); snprintf(buf, sizeof(buf), "Should have used n1 once but is %d", n1_rtd); fail_unless(n1_rtd == 1, buf); snprintf(buf, sizeof(buf), "Should have used n2 once but is %d", n2_rtd); fail_unless(n2_rtd == 1, buf); snprintf(buf, sizeof(buf), "Shouldn't have used n3 but is %d", n3_rtd); fail_unless(n3_rtd == 0, buf); snprintf(buf, sizeof(buf), "Shouldn't have used n4 but is %d", n4_rtd); fail_unless(n4_rtd == 0, buf); rtd = get_next_login_node(&props); increment_counts(&n1, &n2, &n3, &n4, rtd, &n1_rtd, &n2_rtd, &n3_rtd, &n4_rtd); rtd = get_next_login_node(&props); increment_counts(&n1, &n2, &n3, &n4, rtd, &n1_rtd, &n2_rtd, &n3_rtd, &n4_rtd); fail_unless(n1_rtd == 2, "Should have used n1 twice"); fail_unless(n2_rtd == 2, "Should have used n2 twice"); fail_unless(n3_rtd == 0, "Shouldn't have used n3"); fail_unless(n4_rtd == 0, "Shouldn't have used n4"); fail_unless(get_next_login_node(&props2) == NULL, "Somehow found a node when none have the property"); }
void *check_if_orphaned( void *vp) { char *node_name = (char *)vp; char *rsv_id = NULL; std::string job_id; batch_request *preq; int handle = -1; int retries = 0; struct pbsnode *pnode; char log_buf[LOCAL_LOG_BUF_SIZE]; if ((rsv_id = strchr(node_name, ':')) != NULL) { *rsv_id = '\0'; rsv_id++; } else { free(node_name); return(NULL); } if (alps_reservations.is_orphaned(rsv_id, job_id) == true) { // Make sure the node with the orphan is not available for jobs if ((pnode = find_nodebyname(node_name)) != NULL) { if ((pnode->nd_state & (INUSE_BUSY | INUSE_DOWN)) == 0) { snprintf(log_buf, sizeof(log_buf), "Node %s has an orphan but wasn't marked as busy. Marking as busy now.", node_name); log_err(-1, __func__, log_buf); update_node_state(pnode, INUSE_BUSY); } pnode->unlock_node(__func__, NULL, LOGLEVEL); } if ((preq = alloc_br(PBS_BATCH_DeleteReservation)) == NULL) { free(node_name); alps_reservations.remove_from_orphaned_list(rsv_id); return(NULL); } preq->rq_extend = strdup(rsv_id); if ((pnode = get_next_login_node(NULL)) != NULL) { struct in_addr hostaddr; int local_errno; pbs_net_t momaddr; memcpy(&hostaddr, &pnode->nd_sock_addr.sin_addr, sizeof(hostaddr)); momaddr = ntohl(hostaddr.s_addr); snprintf(log_buf, sizeof(log_buf), "Found orphan ALPS reservation ID %s for job %s; asking %s to remove it", rsv_id, job_id.c_str(), pnode->get_name()); log_record(PBSEVENT_DEBUG, PBS_EVENTCLASS_SERVER, __func__, log_buf); while ((handle < 0) && (retries < 3)) { handle = svr_connect(momaddr, pnode->nd_mom_port, &local_errno, pnode, NULL); retries++; } /* unlock before the network transaction */ pnode->unlock_node(__func__, NULL, LOGLEVEL); if (handle >= 0) issue_Drequest(handle, preq, true); free_br(preq); } alps_reservations.remove_from_orphaned_list(rsv_id); } free(node_name); return(NULL); } /* END check_if_orphaned() */