/* * delete the entry. Only the process who has published * the service_name has the right to remove this * service - the server will verify and report the result */ static int unpublish ( const char *service_name, ompi_info_t *info ) { int rc, ret, flag; bool global_scope; orte_process_name_t *info_host; opal_buffer_t *buf; orte_data_server_cmd_t cmd=ORTE_DATA_SERVER_UNPUBLISH; orte_std_cntr_t cnt; orte_rml_recv_cb_t xfer; ompi_info_get_bool(info, "ompi_global_scope", &global_scope, &flag); if (0 == flag) { /* scope was not defined - see if server exists */ if (!server_setup) { setup_server(); } if (mca_pubsub_orte_component.server_found) { /* server was found - use it as our default store */ info_host = &mca_pubsub_orte_component.server; global_scope = true; } else { /* server was not found - use our HNP as default store */ info_host = ORTE_PROC_MY_HNP; } } else if (!global_scope) { /* if the scope is not global, then unpublish the value from the HNP */ info_host = ORTE_PROC_MY_HNP; } else { /* has the server been setup yet? */ if (!server_setup) { setup_server(); } /* unpublish the value from the global ompi_server, but error * if that server wasn't contacted */ if (!mca_pubsub_orte_component.server_found) { opal_show_help("help-ompi-pubsub-orte.txt", "pubsub-orte:no-server", true, (long)ORTE_PROC_MY_NAME->vpid, "unpublish from"); return OMPI_ERR_NOT_FOUND; } info_host = &mca_pubsub_orte_component.server; } OPAL_OUTPUT_VERBOSE((1, ompi_pubsub_base_framework.framework_output, "%s pubsub:orte: unpublish service %s scope %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), service_name, global_scope ? "Global" : "Local")); /* construct the buffer */ buf = OBJ_NEW(opal_buffer_t); /* pack the unpublish command */ if (OPAL_SUCCESS != (rc = opal_dss.pack(buf, &cmd, 1, ORTE_DATA_SERVER_CMD))) { ORTE_ERROR_LOG(rc); OBJ_RELEASE(buf); goto CLEANUP; } /* pack the service name */ if (OPAL_SUCCESS != (rc = opal_dss.pack(buf, &service_name, 1, OPAL_STRING))) { ORTE_ERROR_LOG(rc); OBJ_RELEASE(buf); goto CLEANUP; } /* send the command */ if (0 > (rc = orte_rml.send_buffer_nb(info_host, buf, ORTE_RML_TAG_DATA_SERVER, orte_rml_send_callback, NULL))) { ORTE_ERROR_LOG(rc); OBJ_RELEASE(buf); goto CLEANUP; } /* get the answer */ OBJ_CONSTRUCT(&xfer, orte_rml_recv_cb_t); xfer.active = true; orte_rml.recv_buffer_nb(ORTE_NAME_WILDCARD, ORTE_RML_TAG_DATA_CLIENT, ORTE_RML_NON_PERSISTENT, orte_rml_recv_callback, &xfer); OMPI_WAIT_FOR_COMPLETION(xfer.active); /* unpack the result */ cnt = 1; if (OPAL_SUCCESS != (rc = opal_dss.unpack(&xfer.data, &ret, &cnt, OPAL_INT))) { ORTE_ERROR_LOG(rc); OBJ_DESTRUCT(&xfer); goto CLEANUP; } OBJ_DESTRUCT(&xfer); rc = ret; CLEANUP: return rc; }
/* Info keys: * * - crs: * none = (Default) No CRS Service * default = Whatever CRS service MPI chooses * blcr = BLCR * self = app level callbacks * * - cmdline: * Command line to restart the process with. * If empty, the user must manually enter it * * - target: * Absolute path to the target directory. * * - handle: * first = Earliest checkpoint directory available * last = Most recent checkpoint directory available * [global:local] = handle provided by the MPI library * * - restarting: * 0 = not restarting * 1 = restarting * * - checkpointing: * 0 = No need to prepare for checkpointing * 1 = MPI should prepare for checkpointing * * - inflight: * default = message * message = Drain inflight messages at the message level * network = Drain inflight messages at the network level (if possible) * * - user_space_mem: * 0 = Memory does not need to be managed * 1 = Memory must be in user space (i.e., not on network card * */ static int extract_info_into_datum(ompi_info_t *info, orte_snapc_base_quiesce_t *datum) { int info_flag = false; int max_crs_len = 32; bool info_bool = false; char *info_char = NULL; info_char = (char *) malloc(sizeof(char) * (OPAL_PATH_MAX+1)); /* * Key: crs */ ompi_info_get(info, "crs", max_crs_len, info_char, &info_flag); if( info_flag) { datum->crs_name = strdup(info_char); } /* * Key: cmdline */ ompi_info_get(info, "cmdline", OPAL_PATH_MAX, info_char, &info_flag); if( info_flag) { datum->cmdline = strdup(info_char); } /* * Key: handle */ ompi_info_get(info, "handle", OPAL_PATH_MAX, info_char, &info_flag); if( info_flag) { datum->handle = strdup(info_char); } /* * Key: target */ ompi_info_get(info, "target", OPAL_PATH_MAX, info_char, &info_flag); if( info_flag) { datum->target_dir = strdup(info_char); } /* * Key: restarting */ ompi_info_get_bool(info, "restarting", &info_bool, &info_flag); if( info_flag ) { datum->restarting = info_bool; } else { datum->restarting = false; } /* * Key: checkpointing */ ompi_info_get_bool(info, "checkpointing", &info_bool, &info_flag); if( info_flag ) { datum->checkpointing = info_bool; } else { datum->checkpointing = false; } /* * Display all values */ OPAL_OUTPUT_VERBOSE((3, mca_crcp_bkmrk_component.super.output_handle, "crcp:bkmrk: %s extract_info: Info('crs' = '%s')", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), (NULL == datum->crs_name ? "Default (none)" : datum->crs_name))); OPAL_OUTPUT_VERBOSE((3, mca_crcp_bkmrk_component.super.output_handle, "crcp:bkmrk: %s extract_info: Info('cmdline' = '%s')", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), (NULL == datum->cmdline ? "Default ()" : datum->cmdline))); OPAL_OUTPUT_VERBOSE((3, mca_crcp_bkmrk_component.super.output_handle, "crcp:bkmrk: %s extract_info: Info('checkpointing' = '%c')", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), (datum->checkpointing ? 'T' : 'F'))); OPAL_OUTPUT_VERBOSE((3, mca_crcp_bkmrk_component.super.output_handle, "crcp:bkmrk: %s extract_info: Info('restarting' = '%c')", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), (datum->restarting ? 'T' : 'F'))); if( NULL != info_char ) { free(info_char); info_char = NULL; } return ORTE_SUCCESS; }