/** * @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; }
int svr_save_db(struct server *ps, int mode) { pbs_db_conn_t *conn = (pbs_db_conn_t *) svr_db_conn; pbs_db_svr_info_t dbsvr; pbs_db_obj_info_t obj; int savetype = PBS_UPDATE_DB_FULL; int rc; ps->sv_qs.sv_savetm = time_now; /* as part of the server save, update svrlive file now, * used in failover */ if (update_svrlive() !=0) return -1; if (mode == SVR_SAVE_FULL) savetype = PBS_UPDATE_DB_FULL; else if (mode == SVR_SAVE_QUICK) savetype = PBS_UPDATE_DB_QUICK; else savetype = PBS_INSERT_DB; if (svr_to_db_svr(ps, &dbsvr, savetype) != 0) goto db_err; obj.pbs_db_obj_type = PBS_DB_SVR; obj.pbs_db_un.pbs_db_svr = &dbsvr; rc = pbs_db_save_obj(conn, &obj, savetype); if (rc != 0) { savetype = PBS_INSERT_DB; rc = pbs_db_save_obj(conn, &obj, savetype); } pbs_db_reset_obj(&obj); if (rc != 0) goto db_err; return (0); db_err: strcpy(log_buffer, msg_svdbnosv); if (conn->conn_db_err != NULL) strncat(log_buffer, conn->conn_db_err, LOG_BUF_SIZE - strlen(log_buffer) - 1); log_err(-1, __func__, log_buffer); panic_stop_db(log_buffer); return (-1); }
int sched_save_db(pbs_sched *ps, int mode) { pbs_db_conn_t *conn = (pbs_db_conn_t *) svr_db_conn; pbs_db_sched_info_t dbsched; pbs_db_obj_info_t obj; int savetype = PBS_UPDATE_DB_FULL; int rc; if (mode == SVR_SAVE_FULL) savetype = PBS_UPDATE_DB_FULL; else if (mode == SVR_SAVE_QUICK) savetype = PBS_UPDATE_DB_QUICK; else savetype = PBS_INSERT_DB; if (svr_to_db_sched(ps, &dbsched, savetype) != 0) goto db_err; obj.pbs_db_obj_type = PBS_DB_SCHED; obj.pbs_db_un.pbs_db_sched = &dbsched; rc = pbs_db_save_obj(conn, &obj, savetype); if (rc != 0) { savetype = PBS_INSERT_DB; rc = pbs_db_save_obj(conn, &obj, savetype); } /* free the attribute list allocated by encode_attrs */ pbs_db_reset_obj(&obj); if (rc != 0) goto db_err; return (0); db_err: strcpy(log_buffer, schedemsg); if (conn->conn_db_err != NULL) strncat(log_buffer, conn->conn_db_err, LOG_BUF_SIZE - strlen(log_buffer) - 1); log_err(-1, __func__, log_buffer); panic_stop_db(log_buffer); 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 * Save a queue to the database * * @param[in] pque - Pointer to the queue to save * @param[in] mode: * QUE_SAVE_FULL - Save full queue information (update) * QUE_SAVE_NEW - Save new queue information (insert) * * @return Error code * @retval 0 - Success * @retval 1 - Failure * */ int que_save_db(pbs_queue *pque, int mode) { pbs_db_que_info_t dbque; pbs_db_obj_info_t obj; pbs_db_conn_t *conn = (pbs_db_conn_t *) svr_db_conn; int savetype = PBS_UPDATE_DB_FULL; if (svr_to_db_que(pque, &dbque, savetype) != 0) goto db_err; obj.pbs_db_obj_type = PBS_DB_QUEUE; obj.pbs_db_un.pbs_db_que = &dbque; if (mode == QUE_SAVE_NEW) savetype = PBS_INSERT_DB; if (pbs_db_save_obj(conn, &obj, savetype) != 0) goto db_err; pbs_db_reset_obj(&obj); return (0); db_err: /* free the attribute list allocated by encode_attrs */ free(dbque.attr_list.attributes); strcpy(log_buffer, "que_save failed "); if (conn->conn_db_err != NULL) strncat(log_buffer, conn->conn_db_err, LOG_BUF_SIZE - strlen(log_buffer) - 1); log_err(-1, __func__, log_buffer); panic_stop_db(log_buffer); return (-1); }