/****** pack_job_delivery/pack_job_delivery() ********************************** * NAME * pack_job_delivery() -- pack a job to be sent to execd * * SYNOPSIS * int pack_job_delivery(sge_pack_buffer *pb, lListElem *jep, lList *qlp, * lListElem *pep) * * FUNCTION * This function is used in qmaster and by qrsh -inherit to deliver * jobs to execd's. * * INPUTS * sge_pack_buffer *pb - packing buffer * lListElem *jep - JB_Type * * RESULT * int - PACK_SUCCESS on success * * NOTES * MT-NOTE: pack_job_delivery() is MT safe *******************************************************************************/ int pack_job_delivery(sge_pack_buffer *pb, lListElem *jep) { int ret; if ((ret=packint(pb, feature_get_active_featureset_id()))) { return ret; } if ((ret=cull_pack_elem(pb, jep)) != PACK_SUCCESS) { return ret; } return PACK_SUCCESS; }
/****** execd/sge_execd_register_at_qmaster() ********************************** * NAME * sge_execd_register_at_qmaster() -- modify execd list at qmaster site * * SYNOPSIS * int sge_execd_register_at_qmaster(void) * * FUNCTION * add local execd name to SGE_EH_LIST in order to register at * qmaster * * INPUTS * void - no input * * RESULT * int - 0 = success / 1 = error * * NOTES * MT-NOTE: sge_execd_register_at_qmaster() is not MT safe * *******************************************************************************/ int sge_execd_register_at_qmaster(sge_gdi_ctx_class_t *ctx, bool is_restart) { int return_value = 0; static int sge_last_register_error_flag = 0; lList *alp = NULL; /* * If it is a reconnect (is_restart == true) the act_qmaster file must be * re-read in order to update ctx qmaster cache when master migrates. */ const char *master_host = ctx->get_master(ctx, is_restart); DENTER(TOP_LAYER, "sge_execd_register_at_qmaster"); /* We will not try to make a gdi request when qmaster is not alive. The * gdi will return with timeout after one minute. If qmaster is not alive * we will not try a gdi request! */ if (master_host != NULL && ctx->is_alive(ctx) == CL_RETVAL_OK) { lList *hlp = lCreateList("exechost starting", EH_Type); lListElem *hep = lCreateElem(EH_Type); lSetUlong(hep, EH_featureset_id, feature_get_active_featureset_id()); lAppendElem(hlp, hep); /* register at qmaster */ DPRINTF(("***** Register at qmaster *****\n")); if (!is_restart) { /* * This is a regular startup. */ alp = ctx->gdi(ctx, SGE_EH_LIST, SGE_GDI_ADD, &hlp, NULL, NULL); } else { /* * Indicate this is a restart to qmaster. * This is used for the initial_state of queue_configuration implementation. */ alp = ctx->gdi(ctx, SGE_EH_LIST, SGE_GDI_ADD | SGE_GDI_EXECD_RESTART, &hlp, NULL, NULL); } lFreeList(&hlp); } else { DPRINTF(("***** Register at qmaster - qmaster not alive! *****\n")); } if (alp == NULL) { if (sge_last_register_error_flag == 0) { WARNING((SGE_EVENT, MSG_COM_CANTREGISTER_SS, master_host?master_host:"", MSG_COM_ERROR)); sge_last_register_error_flag = 1; } return_value = 1; } else { lListElem *aep = lFirst(alp); if (lGetUlong(aep, AN_status) != STATUS_OK) { if (sge_last_register_error_flag == 0) { WARNING((SGE_EVENT, MSG_COM_CANTREGISTER_SS, master_host?master_host:"", lGetString(aep, AN_text))); sge_last_register_error_flag = 1; } return_value = 1; } } if (return_value == 0) { sge_last_register_error_flag = 0; INFO((SGE_EVENT, MSG_EXECD_REGISTERED_AT_QMASTER_S, master_host?master_host:"")); last_qmaster_registration_time = sge_get_gmt(); } lFreeList(&alp); DRETURN(return_value); }