/** * @brief * Recover server information and attributes from server database * * @par FunctionalitY: * This function is only called on Server initialization at start up. * * @par Note: * server structure, extern struct server server, must be preallocated and * all default values should already be set. * * @see pbsd_init.c * * @return Error code * @retval 0 : On successful recovery and creation of server structure * @retval -1 : On failutre to open or read file. * */ int svr_recov_db(void) { pbs_db_conn_t *conn = (pbs_db_conn_t *) svr_db_conn; pbs_db_svr_info_t dbsvr; pbs_db_obj_info_t obj; /* load server_qs */ dbsvr.attr_list.attr_count = 0; dbsvr.attr_list.attributes = NULL; obj.pbs_db_obj_type = PBS_DB_SVR; obj.pbs_db_un.pbs_db_svr = &dbsvr; /* read in job fixed sub-structure */ if (pbs_db_load_obj(conn, &obj) != 0) goto db_err; if (db_to_svr_svr(&server, &dbsvr) != 0) goto db_err; pbs_db_reset_obj(&obj); return (0); db_err: return -1; }
/** * @brief * Recover a queue from the database * * @param[in] qname - Name of the queue to recover * * @return The recovered queue structure * @retval NULL - Failure * @retval !NULL - Success - address of recovered queue returned * */ pbs_queue * que_recov_db(char *qname) { pbs_queue *pq; pbs_db_que_info_t dbque; pbs_db_attr_info_t attr_info; pbs_db_obj_info_t obj; pbs_db_conn_t *conn = (pbs_db_conn_t *) svr_db_conn; obj.pbs_db_obj_type = PBS_DB_QUEUE; obj.pbs_db_un.pbs_db_que = &dbque; pq = que_alloc(qname); /* allocate & init queue structure space */ if (pq == (pbs_queue *)0) { log_err(-1, "que_recov", "que_alloc failed"); return ((pbs_queue *)0); } /* load server_qs */ strcpy(dbque.qu_name, qname); if (pbs_db_begin_trx(conn, 0, 0) !=0) goto db_err; /* read in job fixed sub-structure */ if (pbs_db_load_obj(conn, &obj) != 0) goto db_err; db_to_svr_que(pq, &dbque); attr_info.parent_id = pq->qu_qs.qu_name; attr_info.parent_obj_type = PARENT_TYPE_QUE_ALL; /* que attr */ /* read in que attributes */ if (recov_attr_db(conn, pq, &attr_info, que_attr_def, pq->qu_attr, (int)QA_ATR_LAST, 0) != 0) goto db_err; if (pbs_db_end_trx(conn, PBS_DB_COMMIT) != 0) goto db_err; /* all done recovering the queue */ return (pq); db_err: log_err(-1, "que_recov", "read of queuedb failed"); (void) pbs_db_end_trx(conn, PBS_DB_ROLLBACK); if (pq) que_free(pq); return 0; }
int sched_recov_db(void) { pbs_db_conn_t *conn = (pbs_db_conn_t *) svr_db_conn; pbs_db_sched_info_t dbsched; pbs_db_attr_info_t attr_info; pbs_db_obj_info_t obj; int rc; int index; /* load server_qs */ strcpy(dbsched.sched_name, pbs_server_id); if (pbs_db_begin_trx(conn, 0, 0) !=0) goto db_err; obj.pbs_db_obj_type = PBS_DB_SCHED; obj.pbs_db_un.pbs_db_sched = &dbsched; /* read in job fixed sub-structure */ if ((rc = pbs_db_load_obj(conn, &obj)) == -1) /* error */ goto db_err; if (rc == 0) { db_to_svr_sched(&scheduler, &dbsched); attr_info.parent_id = pbs_server_id; attr_info.parent_obj_type = PARENT_TYPE_SCHED; /* svr attr */ /* read in server attributes */ if (recov_attr_db(conn, &scheduler, &attr_info, sched_attr_def, scheduler.sch_attr, (int)SCHED_ATR_LAST, 0) != 0) goto db_err; } if (pbs_db_end_trx(conn, PBS_DB_COMMIT) != 0) goto db_err; if (pbs_conf.pbs_use_tcp == 0) { /* check if throughput mode is visible in non-TPP mode, if so make it invisible */ index = find_attr(sched_attr_def, ATTR_throughput_mode, SCHED_ATR_LAST); scheduler.sch_attr[index].at_flags = 0; } return (0); db_err: log_err(-1, "sched_recov", "read of scheduler db failed"); (void) pbs_db_end_trx(conn, PBS_DB_ROLLBACK); return -1; }
/** * @brief * Recover server information and attributes from server database * * @par FunctionalitY: * This function is only called on Server initialization at start up. * * @par Note: * server structure, extern struct server server, must be preallocated and * all default values should already be set. * * @see pbsd_init.c * * @return Error code * @retval 0 : On successful recovery and creation of server structure * @retval -1 : On failutre to open or read file. * */ int svr_recov_db(void) { pbs_db_conn_t *conn = (pbs_db_conn_t *) svr_db_conn; pbs_db_svr_info_t dbsvr; pbs_db_attr_info_t attr_info; pbs_db_obj_info_t obj; /* load server_qs */ strcpy(dbsvr.sv_name, pbs_server_id); if (pbs_db_begin_trx(conn, 0, 0) !=0) goto db_err; obj.pbs_db_obj_type = PBS_DB_SVR; obj.pbs_db_un.pbs_db_svr = &dbsvr; /* read in job fixed sub-structure */ if (pbs_db_load_obj(conn, &obj) != 0) goto db_err; db_to_svr_svr(&server, &dbsvr); attr_info.parent_id = pbs_server_id; attr_info.parent_obj_type = PARENT_TYPE_SERVER; /* svr attr */ /* read in server attributes */ if (recov_attr_db(conn, &server, &attr_info, svr_attr_def, server.sv_attr, (int)SRV_ATR_LAST, 0) != 0) goto db_err; if (pbs_db_end_trx(conn, PBS_DB_COMMIT) != 0) goto db_err; return (0); db_err: log_err(-1, "svr_recov", "error on recovering server attr"); (void) pbs_db_end_trx(conn, PBS_DB_ROLLBACK); return -1; }
/** * @brief * Recover a queue from the database * * @param[in] qname - Name of the queue to recover * * @return The recovered queue structure * @retval NULL - Failure * @retval !NULL - Success - address of recovered queue returned * */ pbs_queue * que_recov_db(char *qname) { pbs_queue *pq; pbs_db_que_info_t dbque; pbs_db_obj_info_t obj; pbs_db_conn_t *conn = (pbs_db_conn_t *) svr_db_conn; obj.pbs_db_obj_type = PBS_DB_QUEUE; obj.pbs_db_un.pbs_db_que = &dbque; pq = que_alloc(qname); /* allocate & init queue structure space */ if (pq == NULL) { log_err(-1, "que_recov", "que_alloc failed"); return NULL; } /* load server_qs */ dbque.qu_name[sizeof(dbque.qu_name) - 1] = '\0'; strncpy(dbque.qu_name, qname, sizeof(dbque.qu_name)); /* read in job fixed sub-structure */ if (pbs_db_load_obj(conn, &obj) != 0) goto db_err; if (db_to_svr_que(pq, &dbque) != 0) goto db_err; pbs_db_reset_obj(&obj); /* all done recovering the queue */ return (pq); db_err: log_err(-1, "que_recov", "read of queuedb failed"); if (pq) que_free(pq); return 0; }
pbs_sched * sched_recov_db(char *sname) { pbs_sched *ps; pbs_db_sched_info_t dbsched; pbs_db_obj_info_t obj; pbs_db_conn_t *conn = (pbs_db_conn_t *) svr_db_conn; obj.pbs_db_obj_type = PBS_DB_SCHED; obj.pbs_db_un.pbs_db_sched = &dbsched; ps = sched_alloc(sname); /* allocate & init sched structure space */ if (ps == NULL) { log_err(-1, "sched_recov", "sched_alloc failed"); return NULL; } /* load sched */ dbsched.sched_name[sizeof(dbsched.sched_name) - 1] = '\0'; strncpy(dbsched.sched_name, sname, sizeof(dbsched.sched_name)); /* read in job fixed sub-structure */ if (pbs_db_load_obj(conn, &obj) != 0) goto db_err; if (db_to_svr_sched(ps, &dbsched) != 0) goto db_err; pbs_db_reset_obj(&obj); /* all done recovering the sched */ return (ps); db_err: log_err(-1, "sched_recov", "read of scheddb failed"); if (ps) free(ps); return NULL; }
/** * @brief * enable db lookup only for server version of printjob * * @param[in] id - Job Id. * @param[in] no_attributes - if set means no need to set attr_info * * @return int */ int print_db_job(char *id, int no_attributes) { pbs_db_obj_info_t obj; pbs_db_job_info_t dbjob; pbs_db_jobscr_info_t jobscr; job xjob; int db_conn_error; pbs_db_attr_info_t *attrs; char *db_errmsg = NULL; char errmsg[PBS_MAX_DB_CONN_INIT_ERR + 1]; if (conn == NULL) { /* connect to database */ #ifdef NAS /* localmod 111 */ if (pbs_conf.pbs_data_service_host) { conn = pbs_db_init_connection(pbs_conf.pbs_data_service_host, PBS_DB_CNT_TIMEOUT_NORMAL, 0, &db_conn_error, errmsg, PBS_MAX_DB_CONN_INIT_ERR); } else #endif /* localmod 111 */ conn = pbs_db_init_connection(pbs_conf.pbs_server_name, PBS_DB_CNT_TIMEOUT_NORMAL, 0, &db_conn_error, errmsg, PBS_MAX_DB_CONN_INIT_ERR); if (!conn) { get_db_errmsg(db_conn_error, &db_errmsg); fprintf(stderr, "%s\n", db_errmsg); if (strlen(errmsg) > 0) fprintf(stderr, "%s\n", errmsg); return -1; } db_conn_error = pbs_db_connect(conn); if (db_conn_error != PBS_DB_SUCCESS && pbs_conf.pbs_secondary != NULL) { conn = pbs_db_init_connection(pbs_conf.pbs_secondary, PBS_DB_CNT_TIMEOUT_NORMAL, 0, &db_conn_error, errmsg, PBS_MAX_DB_CONN_INIT_ERR); if (!conn) { get_db_errmsg(db_conn_error, &db_errmsg); fprintf(stderr, "%s\n", db_errmsg); if (strlen(errmsg) > 0) fprintf(stderr, "%s\n", errmsg); return -1; } db_conn_error = pbs_db_connect(conn); } if (db_conn_error != PBS_DB_SUCCESS) { get_db_errmsg(db_conn_error, &db_errmsg); fprintf(stderr, "Could not connect to PBS dataservice:[%s]\n", (db_errmsg)?db_errmsg:"None"); exit(1); } if (pg_db_prepare_job_sqls(conn) != 0) { get_db_errmsg(db_conn_error, &db_errmsg); fprintf(stderr, "Could not initialize PBS dataservice:[%s]\n", (conn->conn_db_err)?(char *)conn->conn_db_err:"None"); exit(1); } } /* * On a server machine, if display_script is set, * retrieve the job-script from database. */ if (display_script) { obj.pbs_db_obj_type = PBS_DB_JOBSCR; obj.pbs_db_un.pbs_db_jobscr = &jobscr; strcpy(jobscr.ji_jobid, id); if (strchr(id, '.') == 0) { strcat(jobscr.ji_jobid, "."); strcat(jobscr.ji_jobid, pbs_conf.pbs_server_name); } if (pbs_db_load_obj(conn, &obj) != 0) { fprintf(stderr, "Job %s not found\n", jobscr.ji_jobid); return (1); } else { printf("---------------------------------------------------\n"); printf("Jobscript for jobid:%s\n", jobscr.ji_jobid); printf("---------------------------------------------------\n"); printf("%s \n", jobscr.script); } } /* * On a server machine, if display_script is not set, * retrieve the job info from database. */ else { obj.pbs_db_obj_type = PBS_DB_JOB; obj.pbs_db_un.pbs_db_job = &dbjob; strcpy(dbjob.ji_jobid, id); if (strchr(id, '.') == 0) { strcat(dbjob.ji_jobid, "."); strcat(dbjob.ji_jobid, pbs_conf.pbs_server_name); } if (pbs_db_load_obj(conn, &obj) !=0) { fprintf(stderr, "Job %s not found\n", dbjob.ji_jobid); return (1); } db_to_svr_job(&xjob, &dbjob); prt_job_struct(&xjob); attrs = dbjob.attr_list.attributes; if (no_attributes == 0) { int i; printf("--attributes--\n"); for (i=0; i< dbjob.attr_list.attr_count; i++) { printf("%s", attrs[i].attr_name); if (attrs[i].attr_resc && attrs[i].attr_resc[0] != 0) printf(".%s", attrs[i].attr_resc); printf(" = "); if (attrs[i].attr_value) printf("%s", show_nonprint_chars(attrs[i].attr_value)); printf("\n"); } } printf("\n"); } return 0; }