static void process_opens(int fd, short args, void *cbdata) { orte_dfs_request_t *dfs = (orte_dfs_request_t*)cbdata; int rc; opal_buffer_t *buffer; char *scheme, *host, *filename, *hostname; orte_process_name_t daemon; bool found; orte_vpid_t v; opal_list_t myvals; opal_value_t *kv; opal_output(0, "%s PROCESSING OPEN", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME)); /* get the scheme to determine if we can process locally or not */ if (NULL == (scheme = opal_uri_get_scheme(dfs->uri))) { ORTE_ERROR_LOG(ORTE_ERR_BAD_PARAM); goto complete; } opal_output(0, "%s GOT SCHEME", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME)); if (0 != strcmp(scheme, "file")) { /* not yet supported */ orte_show_help("orte_dfs_help.txt", "unsupported-filesystem", true, dfs->uri); goto complete; } /* dissect the uri to extract host and filename/path */ if (NULL == (filename = opal_filename_from_uri(dfs->uri, &host))) { goto complete; } opal_output(0, "%s GOT FILENAME %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), filename); if (NULL == host) { host = strdup(orte_process_info.nodename); } /* ident the daemon on that host */ daemon.jobid = ORTE_PROC_MY_DAEMON->jobid; found = false; for (v=0; v < orte_process_info.num_daemons; v++) { daemon.vpid = v; /* fetch the hostname where this daemon is located */ OBJ_CONSTRUCT(&myvals, opal_list_t); if (ORTE_SUCCESS != (rc = opal_dstore.fetch(opal_dstore_internal, (opal_identifier_t*)&daemon, ORTE_DB_HOSTNAME, &myvals))) { ORTE_ERROR_LOG(rc); OPAL_LIST_DESTRUCT(&myvals); goto complete; } kv = (opal_value_t*)opal_list_get_first(&myvals); hostname = strdup(kv->data.string); OPAL_LIST_DESTRUCT(&myvals); opal_output(0, "%s GOT HOST %s HOSTNAME %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), host, hostname); if (0 == strcmp(host, hostname)) { found = true; break; } } if (!found) { ORTE_ERROR_LOG(ORTE_ERR_NOT_FOUND); goto complete; } opal_output_verbose(1, orte_dfs_base_framework.framework_output, "%s file %s on host %s daemon %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), filename, host, ORTE_NAME_PRINT(&daemon)); /* add this request to our local list so we can * match it with the returned response when it comes */ dfs->id = req_id++; opal_list_append(&requests, &dfs->super); /* setup a message for the daemon telling * them what file we want to access */ buffer = OBJ_NEW(opal_buffer_t); if (OPAL_SUCCESS != (rc = opal_dss.pack(buffer, &dfs->cmd, 1, ORTE_DFS_CMD_T))) { ORTE_ERROR_LOG(rc); opal_list_remove_item(&requests, &dfs->super); goto complete; } /* pass the request id */ if (OPAL_SUCCESS != (rc = opal_dss.pack(buffer, &dfs->id, 1, OPAL_UINT64))) { ORTE_ERROR_LOG(rc); opal_list_remove_item(&requests, &dfs->super); goto complete; } if (OPAL_SUCCESS != (rc = opal_dss.pack(buffer, &filename, 1, OPAL_STRING))) { ORTE_ERROR_LOG(rc); opal_list_remove_item(&requests, &dfs->super); goto complete; } opal_output_verbose(1, orte_dfs_base_framework.framework_output, "%s sending open file request to %s file %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), ORTE_NAME_PRINT(&daemon), filename); /* send it */ if (0 > (rc = orte_rml.send_buffer_nb(&daemon, buffer, ORTE_RML_TAG_DFS_CMD, orte_rml_send_callback, NULL))) { ORTE_ERROR_LOG(rc); OBJ_RELEASE(buffer); opal_list_remove_item(&requests, &dfs->super); goto complete; } /* don't release it */ return; complete: /* we get here if an error occurred - execute any * pending callback so the proc doesn't hang */ if (NULL != dfs->open_cbfunc) { dfs->open_cbfunc(-1, dfs->cbdata); } OBJ_RELEASE(dfs); }
static void process_opens(int fd, short args, void *cbdata) { orte_dfs_request_t *dfs = (orte_dfs_request_t*)cbdata; int rc; opal_buffer_t *buffer; char *scheme, *host, *filename, *hostname; orte_process_name_t daemon; bool found; orte_vpid_t v; /* get the scheme to determine if we can process locally or not */ if (NULL == (scheme = opal_uri_get_scheme(dfs->uri))) { OBJ_RELEASE(dfs); return; } if (0 == strcmp(scheme, "nfs")) { open_local_file(dfs); goto complete; } if (0 != strcmp(scheme, "file")) { /* not yet supported */ orte_show_help("orte_dfs_help.txt", "unsupported-filesystem", true, dfs->uri); if (NULL != dfs->open_cbfunc) { dfs->open_cbfunc(-1, dfs->cbdata); } goto complete; } /* dissect the uri to extract host and filename/path */ if (NULL == (filename = opal_filename_from_uri(dfs->uri, &host))) { goto complete; } /* if the host is our own, then treat it as a local file */ if (NULL == host || 0 == strcmp(host, orte_process_info.nodename) || 0 == strcmp(host, "localhost") || opal_ifislocal(host)) { opal_output_verbose(1, orte_dfs_base.output, "%s file %s on local host", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), filename); open_local_file(dfs); goto complete; } /* ident the daemon on that host */ daemon.jobid = ORTE_PROC_MY_DAEMON->jobid; found = false; for (v=0; v < orte_process_info.num_daemons; v++) { daemon.vpid = v; /* fetch the hostname where this daemon is located */ if (ORTE_SUCCESS != (rc = orte_db.fetch_pointer(&daemon, ORTE_DB_HOSTNAME, (void**)&hostname, OPAL_STRING))) { ORTE_ERROR_LOG(rc); goto complete; } if (0 == strcmp(host, hostname)) { found = true; break; } } if (!found) { ORTE_ERROR_LOG(ORTE_ERR_NOT_FOUND); goto complete; } opal_output_verbose(1, orte_dfs_base.output, "%s file %s on host %s daemon %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), filename, host, ORTE_NAME_PRINT(&daemon)); /* double-check: if it is our local daemon, then we * treat this as local */ if (daemon.vpid == ORTE_PROC_MY_DAEMON->vpid) { opal_output_verbose(1, orte_dfs_base.output, "%s local file %s on same daemon", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), filename); open_local_file(dfs); goto complete; } /* add this request to our local list so we can * match it with the returned response when it comes */ dfs->id = req_id++; opal_list_append(&requests, &dfs->super); /* setup a message for the daemon telling * them what file we want to access */ buffer = OBJ_NEW(opal_buffer_t); if (OPAL_SUCCESS != (rc = opal_dss.pack(buffer, &dfs->cmd, 1, ORTE_DFS_CMD_T))) { ORTE_ERROR_LOG(rc); opal_list_remove_item(&requests, &dfs->super); goto complete; } /* pass the request id */ if (OPAL_SUCCESS != (rc = opal_dss.pack(buffer, &dfs->id, 1, OPAL_UINT64))) { ORTE_ERROR_LOG(rc); opal_list_remove_item(&requests, &dfs->super); goto complete; } if (OPAL_SUCCESS != (rc = opal_dss.pack(buffer, &filename, 1, OPAL_STRING))) { ORTE_ERROR_LOG(rc); opal_list_remove_item(&requests, &dfs->super); goto complete; } opal_output_verbose(1, orte_dfs_base.output, "%s sending open file request to %s file %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), ORTE_NAME_PRINT(&daemon), filename); /* send it */ if (0 > (rc = orte_rml.send_buffer_nb(&daemon, buffer, ORTE_RML_TAG_DFS_CMD, 0, orte_rml_send_callback, NULL))) { ORTE_ERROR_LOG(rc); OBJ_RELEASE(buffer); opal_list_remove_item(&requests, &dfs->super); goto complete; } /* don't release it */ return; complete: OBJ_RELEASE(dfs); }
static void process_opens(int fd, short args, void *cbdata) { orte_dfs_request_t *dfs = (orte_dfs_request_t*)cbdata; int rc; opal_buffer_t *buffer; char *scheme, *host=NULL, *filename=NULL; orte_process_name_t daemon; opal_list_t lt; opal_namelist_t *nm; opal_output_verbose(1, orte_dfs_base_framework.framework_output, "%s PROCESSING OPEN", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME)); /* get the scheme to determine if we can process locally or not */ if (NULL == (scheme = opal_uri_get_scheme(dfs->uri))) { ORTE_ERROR_LOG(ORTE_ERR_BAD_PARAM); goto complete; } opal_output_verbose(1, orte_dfs_base_framework.framework_output, "%s GOT SCHEME", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME)); if (0 != strcmp(scheme, "file")) { /* not yet supported */ orte_show_help("orte_dfs_help.txt", "unsupported-filesystem", true, dfs->uri); free(scheme); goto complete; } free(scheme); /* dissect the uri to extract host and filename/path */ if (NULL == (filename = opal_filename_from_uri(dfs->uri, &host))) { goto complete; } opal_output_verbose(1, orte_dfs_base_framework.framework_output, "%s GOT FILENAME %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), filename); if (NULL == host) { host = strdup(orte_process_info.nodename); } /* ident the daemon on that host */ daemon.jobid = ORTE_PROC_MY_DAEMON->jobid; OBJ_CONSTRUCT(<, opal_list_t); if (ORTE_SUCCESS != (rc = opal_pmix.resolve_peers(host, daemon.jobid, <))) { ORTE_ERROR_LOG(rc); OBJ_DESTRUCT(<); goto complete; } nm = (opal_namelist_t*)opal_list_get_first(<); daemon.vpid = nm->name.vpid; OPAL_LIST_DESTRUCT(<); opal_output_verbose(1, orte_dfs_base_framework.framework_output, "%s file %s on host %s daemon %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), filename, host, ORTE_NAME_PRINT(&daemon)); /* add this request to our local list so we can * match it with the returned response when it comes */ dfs->id = req_id++; opal_list_append(&requests, &dfs->super); /* setup a message for the daemon telling * them what file we want to access */ buffer = OBJ_NEW(opal_buffer_t); if (OPAL_SUCCESS != (rc = opal_dss.pack(buffer, &dfs->cmd, 1, ORTE_DFS_CMD_T))) { ORTE_ERROR_LOG(rc); opal_list_remove_item(&requests, &dfs->super); goto complete; } /* pass the request id */ if (OPAL_SUCCESS != (rc = opal_dss.pack(buffer, &dfs->id, 1, OPAL_UINT64))) { ORTE_ERROR_LOG(rc); opal_list_remove_item(&requests, &dfs->super); goto complete; } if (OPAL_SUCCESS != (rc = opal_dss.pack(buffer, &filename, 1, OPAL_STRING))) { ORTE_ERROR_LOG(rc); opal_list_remove_item(&requests, &dfs->super); goto complete; } opal_output_verbose(1, orte_dfs_base_framework.framework_output, "%s sending open file request to %s file %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), ORTE_NAME_PRINT(&daemon), filename); /* send it */ if (0 > (rc = orte_rml.send_buffer_nb(&daemon, buffer, ORTE_RML_TAG_DFS_CMD, orte_rml_send_callback, NULL))) { ORTE_ERROR_LOG(rc); OBJ_RELEASE(buffer); opal_list_remove_item(&requests, &dfs->super); goto complete; } /* don't release it */ free(host); free(filename); return; complete: /* we get here if an error occurred - execute any * pending callback so the proc doesn't hang */ if (NULL != host) { free(host); } if (NULL != filename) { free(filename); } if (NULL != dfs->open_cbfunc) { dfs->open_cbfunc(-1, dfs->cbdata); } OBJ_RELEASE(dfs); }